エピソード3の感想一覧

▽感想を書く
感想絞り込み
全て表示
[一言]
おお。10フレのシステムというのは、ストライクやスペアの場合の先読みを、そのフレーム内で表記するため、と理解できるのか… もともとがそういう思想での構築だったのかもしれないけれど、一般には「10フレは特別、2投までに全部倒したら、もう一投おまけで投げられる。10フレはストライクやスペアの特殊処理をしないで、フレーム全体のピン数を加算する」と理解されていると思うし、自分もそうだったのでこのアルゴリズムが理解できていなかったのでした。

その意味での計算はあくまでフレーム単位で行う必要があるので、フレームとしてのデータ構造と無投を除いたシーケンスとしてのポイント構造を同時に扱う必要は出てくるのだな。たおしたピン数だけの一次元リストだと、末端の処理がやはりうまく行かないか。

10フレの秘密に気が付けたというのが大きな収穫でした/w
しかし、さすがにこれは、誰得話になっちゃうなあ…
[一言]
なるほど?
10フレの考え方というか、取り扱いが全く違うんだ。
ちょっと考えてみます。
[一言]
あれ、9フレストライクで、10フレが3/5で3投目Skippedにすると、ストライクパターンにマッチしなくない?
最初のLazyList作るフェーズで、

10 : 3 : 5 : null

みたいな感じに前処理で変換されているので、10の次に3と5が来るとちゃんと3と5がストライクパターンとしてマッチして加算される(はず)です。
[一言]
うーん。やっぱり基本的に判りやすいか、というとどうなんだろう、と思っちゃう。

・LazyListであるか、というのは必ずしも本質ではないと思われ。デバッグの段階を考えると、加工済みリストを一度作った方がやりやすいと思う。
・LazyList化は明示的にしないといけないようだけれど、Linqなら暗黙のうちに遅延評価されるので、偉いのだ/w
・結局、10フレの特別扱いは必要。それが_によってなされている、ということはさすがにコメントなしですぐに理解するのは困難
・10フレの1/2投目が最終パターンにマッチするのは理解できるけれど、3投目がどのパターンにマッチするのかは、理解できない。10フレが5/5/5の場合にどうなるのだろう

入力データ形式が他と異なっているので、そのまま比較するのも適当ではないと思う。
きちんと作るなら、Frameクラスも作成して、Strike/Spareの判定もそのプロパティとしてカプセル化するとかしたい。
さらに補足すると、パターンマッチのロジックでは、10フレーム目の「特別扱い」はしてないんですね。10フレームで終わったから、結果的に特別扱いしてるように見えるだけで。無限フレームボウリングをモデリングした結果として、10フレームで終わる通常のボウリングもその中で取り扱えるという感じです。
一般的にわかりやすいかというと議論があると思います。Scala版(というか、遅延リスト使える言語ならどれでも簡単かと思いますが)の特徴は、ボウリングのルールを

・スペアは、「次の一投(あれば)」をボーナスとして加算する
・ストライクのは、「次の二投(あれば)」をボーナスとして加算する
・何フレーム投げるかは事前には決めないでいい

と抽象化して、「10フレームで打ち切った」のが通常のボウリングと考えればそのまま動くことですね。Skippedを入れたのは「投球してない」ということをデータで表現してあるのでした。

あんまり意味がないことですが、15投目までがあるボウリングも抽象化されている(ので、10フレームで打ち切ってもうまく動く)ので面白いところでしょうか。

LazyListが本質かどうかといわれると必ずしも本質でないのですが、LazyListであれば再帰をストップさせなくても、使う側でtake(10)すればいいというのがメリットですね(実用上はLazyListがそこまで使い物になるかは微妙ですが)。

10フレーム目の3投目(で5/5/5、つまりスペアということですよね)がどのパターンにマッチするかというと、2パターン目のスペアのパターンにマッチします。
[一言]
ああ、流石にこれは理解の範囲外。
パターンマッチング使ってるのかな。
たしかc#にもパターンマッチ導入されたのだけれど、理解してない。
おっしゃる通り、パターンマッチング使ってます。こうするとある種の処理が簡潔にかけるのがいいところでしょうか。

Rubyしかり、C#しかり、Java(予定)しかりとパターンマッチングはメインストリームの言語にドンドン入って来てますね。
↑ページトップへ