POH6リオちゃん問題をScalaで解いた
前回に引き続き、POH!6の挑戦ログです。
POH6「女子高生プログラマーの大バトル〜コボール文明の逆襲〜」
今回はリオちゃん、簡単でした。
昨日の今日でコーディングスキル上がってたらびっくりですよね、
さすがに変わるわけがないのです。
とりあえず今回も関数型超入門な、
変数の再代入はしない要するに“var”は使わない!
だけを意識した書き方です。
import java.util.Scanner object Main extends App { val sc = new Scanner(System.in) val n = sc.nextInt def materials(sc: Scanner, ope: Int, vol: Int, water: Float, coffee: Float): (Float, Float) = { val mat = ope match { case 1 => (water + vol, coffee) case 2 => (water, coffee + vol) case 3 => (rest(vol, water, water + coffee) , rest(vol, coffee, water + coffee)) } if (sc.hasNext) materials(sc, sc.nextInt, sc.nextInt, mat._1, mat._2) else mat } def rest(vol: Int, target: Float, total: Float): Float = target - target * vol / total def conc(water: Float, coffee: Float): Int = (100 * coffee / (water + coffee)).toInt val mat = materials(sc, sc.nextInt, sc.nextInt, 0F, 0F) println(conc(mat._1, mat._2)) }
再代入なんていらない、ループも使わない、再帰の特訓じゃあああ!
以外に気を付けたところはありません。
再帰の終了条件が sc.hasNext 以外に見つけられれば良かったんですけどね。
カウンター持ちまわるとかは絶対嫌だし・・・。
あとは、最後の濃度計算、def にする必要ないね?とかが個人的な反省点でしょうか。
ついでにつばめちゃんも解きましたが、
あれは簡単すぎたのでなんかおかしなコード思いついたら記事書こうかなぁくらい。
また書くことがなくなってしまった。