サンタクロース問題 in Scala

Scala でサンタクロース問題を解いてみた。
問題はこれ
http://karetta.jp/article/blog/oneline/030756
Actor 使うと楽ですね。
でもこれでいいのかな。

ソース

サンタ Actor, トナカイ Actor, 小人 Actor を作って回すだけ。
特に難しいことはしていないはず。

import scala.actors


def main()
{

  // サンタさん
  val santaclause = actors.Actor.actor {

    def func(reindeers:List[actors.Actor], midgets: List[actors.Actor])
    {

      // トナカイさん何匹?
      if (reindeers.length == 9)
        {
          println("present for you!")

          reindeers foreach {x => x ! "msg"}

          func(List(), midgets)
        }
      // 小人さん何人?
      else if (midgets.length == 3)
        {
          println("meeting now!")

          midgets foreach {x => x ! "msg"}

          func(reindeers, List())
        }
      else
        {
          // 待つわ
          actors.Actor.react
          {
            case (act: actors.Actor, "reindeer") =>
              {
                println("reindeer comes")
                println(reindeers.length + 1)

                func(act::reindeers, midgets)
              }
            case (act: actors.Actor, "miget") =>
              {
                println("midget comes")
                println(midgets.length + 1)
                func(reindeers, act::midgets)
              }
          }
        }
    }
    func(List(), List())
  }

  // トナカイさん
  val reindeers = 1 to 9 map {x => {
    actors.Actor.actor {
      actors.Actor.loop
      {
        santaclause ! (actors.Actor.self, "reindeer")

        // 返事待ち
        actors.Actor.react
        {
          case "msg" => 
            {
              println("restart")
            }
        }
      }
    }
  }}

  val midgets = 1 to 10 map {x => {
    actors.Actor.actor {

      actors.Actor.loop
      {
        santaclause ! (actors.Actor.self, "midget")

        // 返事待ち
        actors.Actor.react
        {
          case "msg" => 
            {
              println("restart")
            }
        }
      }
    }
  }}

  while (true)
  {
    Thread.sleep(10)
  }
}

main()