ScalaでSEND+MORE=MONEY

30分プログラム、その682。ScalaでSEND+MORE=MONEYを解いてみました。
Scalaのforはモナドらしいです。モナドと言えばリストモナド、リストモナドと言えばSEND+MORE=MONEYです。
というわけで、SEND+MORE=MONEYを解いてみました。

使い方

$ fsc SendMoreMoney.scala
$ time scala SendMoreMoney
List((9567,1085,10652))
scala SendMoreMoney  13.77s user 0.43s system 69% cpu 20.312 total

ソースコード

object SendMoreMoney{
  def num(args: Int*) =
    args.foldLeft(0)(_ * 10 +_)

  def without(xs : Int*) =
    xs.foldLeft((0 to 9).toList)(_ - _)

  def solve() =
    for {
      s <- without(0)
      m <- without(0,s)
      e <- without(s,m)
      n <- without(s,m,e)
      d <- without(s,m,e,n)
      o <- without(s,m,e,n,d)
      r <- without(s,m,e,n,d,o)
      y <- without(s,m,e,n,d,o,r)
      if num(s,e,n,d) + num(m,o,r,e) == num(m,o,n,e,y)
    } yield (num(s,e,n,d),num(m,o,r,e),num(m,o,n,e,y))

  def main(args : Array[String]) =
    println(solve())
}