Scalaの練習です。
お題:
4けたの数について、それぞれの位の数字を大きいじゅんにならべた数から小さいじゅんにならべた数をひくという計算を行います。
Z会三年生中学受験コース5月のてんさく問題を Python で解いてみた - cooldaemonの備忘録
1974 について、この計算を 100 回行った答えを書きなさい。
object Tensaku { def subAscFromDesc(n:Int) = { val s = n.toString s.sortWith(_>_).toInt - s.sortWith(_<_).toInt } def main(args:Array[String]) { println((1 to 100).foldLeft(1974)((n, _) => subAscFromDesc(n))) } }
[info] Running Tensaku 6174
Scalaの文字列*1はStringOpsへの暗黙の変換を持っていて、StringOpsはSeqLike[Char, String]を継承しているので、Charの「>」「<」でsortWithできるのを使っています。
実際に入試問題として解くなら、問題文から処理が途中で周期性を持つことを推測し、周期性が出て来るまでべたに計算するのかな。
追記: Scalazでも書いてみた
練習なので。
import scalaz._ import Scalaz._ val intToString: Int => String = _.toString val sorted: String => String = _.sorted val reverse: String => String = _.reverse val toInt: String => Int = _.toInt val sub: ((Int, Int)) => Int = _.fold(_ - _) val subAscFromDesc = intToString >>> sorted >>> ((reverse >>> toInt) &&& toInt) >>> sub
こちらの記事を参考にしました。