Scala版も書いてみた
Scala版も書いてみました。遅延リストでシンプルにする事が出来ています。
GitHubのリポジトリだと、 https://github.com/kuno-maichi/novels/blob/master/0020_%E4%BD%9C%E4%B8%AD%E3%81%A7%E3%81%AE%E3%83%9C%E3%82%A6%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E3%82%B9%E3%82%B3%E3%82%A2%E3%82%92%E8%A8%88%E7%AE%97%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AB%E3%83%86%E3%82%AD%E3%83%88%E3%83%BC%E3%81%AB%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E6%9B%B8%E3%81%84%E3%81%A6%E3%81%BF%E3%81%9F/episode_0003.scala
に書いてあります。
ーーーーーーーーーーーーーーーーーーーー
val Skipped = -1
def lazyListOf(data : List[List[Int]]): LazyList[Int] = data match {
case Nil => LazyList.empty
case frame::next => frame.filter{_ != Skipped}.to(LazyList) #::: lazyListOf(next)
}
def makeFrames(scores: LazyList[Int]): LazyList[Int] = scores match {
case 10 #:: (next@(x#::y#::_)) => (10 + x + y) #:: makeFrames(next)
case a #:: b #:: (next@(x#::_)) if a + b == 10=> (10 + x) #:: makeFrames(next)
case a #:: b #:: next => (a + b) #:: makeFrames(next)
}
val datum = List(
List(10, Skipped),
List(10, Skipped),
List(10, Skipped),
List(10, Skipped),
List(10, Skipped),
List(10, Skipped),
List(10, Skipped),
List(10, Skipped),
List(10, Skipped),
List(10, 10, 10)
)
val frames = makeFrames(lazyListOf(datum))
println(frames.take(10).sum)
ーーーーーーーーーーーーーーーーーーーー
思いつく限り色々な言語でやってみようかなと思ったりしています。プログラマーじゃない人には意味不明ですが。