ルーズリーフ

公私におよぶ経験値獲得履歴的ななにか。

POH6リオちゃん問題をScalaで解いた

前回に引き続き、POH!6の挑戦ログです。

POH6「女子高生プログラマーの大バトル〜コボール文明の逆襲〜」

paiza.jp

今回はリオちゃん、簡単でした。

昨日の今日でコーディングスキル上がってたらびっくりですよね、
さすがに変わるわけがないのです。

とりあえず今回も関数型超入門な、

変数の再代入はしない要するに“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 にする必要ないね?とかが個人的な反省点でしょうか。

ついでにつばめちゃんも解きましたが、
あれは簡単すぎたのでなんかおかしなコード思いついたら記事書こうかなぁくらい。

また書くことがなくなってしまった。