Z会三年生中学受験コース5月のてんさく問題を Scala で解いてみた

Scalaの練習です。

お題:

4けたの数について、それぞれの位の数字を大きいじゅんにならべた数から小さいじゅんにならべた数をひくという計算を行います。
1974 について、この計算を 100 回行った答えを書きなさい。

Z会三年生中学受験コース5月のてんさく問題を Python で解いてみた - cooldaemonの備忘録
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

こちらの記事を参考にしました。

*1:というかjava.lang.String