Scalaでお釣りの最適化
関数型ぽく書けるようになるにはひたすらコードを書き続けるしかないという事で
まずは手ごろそうなお釣りの最適化(最小枚数化)に挑んでみました。
varで剰余を管理しているのが残念な感じですね・・・。
他の人がどのように書いているかこちらを覗いたら全く違うやり方で
衝撃を受けた次第でアリマス。
object ChangeCalculator { val MoneyUnit = List(5000, 1000, 500, 100, 50, 10, 5, 1) class ChangeUnit(moneyUnit: Int, number: Int) { def getUnit = moneyUnit def getNumber = number def getString = {moneyUnit.toString+"円 "+ number.toString+"枚"} } def main(args: Array[String]) = { calChange(49) calChange(512) calChange(8917) } def calChange(change: Int): Unit = { println("[%d円]".format(change)) getAssortmentOfChange(change).foreach(each => if (each.getNumber > 0) println(each.getString)) println("-------------------") } def getAssortmentOfChange(change: Int): List[ChangeUnit] = { var rest = change def getNumberByUnit(moneyUnit: Int): ChangeUnit = { val number = rest / moneyUnit rest = rest % moneyUnit new ChangeUnit(moneyUnit, number) } for (moneyUnit <- MoneyUnit) yield getNumberByUnit(moneyUnit) } }
結果はこのようになります。
[49円] 10円 4枚 5円 1枚 1円 4枚 ------------------- [512円] 500円 1枚 10円 1枚 1円 2枚 ------------------- [8917円] 5000円 1枚 1000円 3枚 500円 1枚 100円 4枚 10円 1枚 5円 1枚 1円 2枚 -------------------