サンタクロース問題 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()