トラック
/
Factor
Factor
/
演習
/
ボウリング
ボウリング

ボウリング

上級

説明

ボウリングのゲームのスコアを計算しましょう。

ボウリングは、三角形に並んだピンを倒すために、プレイヤーが重いボールを転がすゲームです。ボウリングのゲームのスコアを記録するコードを書きましょう。

ボウリングのスコア計算

ゲームは10フレームで構成されます。 フレームは、フレームの開始時に10本のピンが立っている状態で、1回または2回の投球からなります。 フレームの集計には3つのケースがあります。

  • オープンフレームとは、そのフレームに10未満のスコアが記録される場合です。 この場合、そのフレームのスコアは、倒したピンの本数です。

  • スペアとは、2投目ですべての10本のピンを倒す場合です。 スペアの合計値は、10に次の投球で倒したピンの本数を加えたものです。

  • ストライクとは、1投目ですべての10本のピンを倒す場合です。 ストライクの合計値は、10に次の2回の投球で倒したピンの本数を加えたものです。 ストライクの直後に2つ目のストライクが続いた場合、もう1回ボールを投げるまで、最初のストライクの値は決まりません。

3フレームの例を挙げます。

フレーム1 フレーム2 フレーム3
X(ストライク) 5/(スペア) 9 0(オープンフレーム)

フレーム1は(10 + 5 + 5)= 20です。

フレーム2は(5 + 5 + 9)= 19です。

フレーム3は(9 + 0)= 9です。

つまり、その時点の合計スコアは48です。

ゲームの10フレーム目は特別なケースです。 スペアまたはストライクを出すと、それぞれ1回または2回のフィルボールが与えられます。 フィルボールは、10フレーム目の合計を計算するためにあります。 フィルボールでストライクやスペアを出しても、フィルボールがさらに増えることはありません。 10フレーム目の合計値は、倒したピンの総本数です。

10フレーム目がX1/(ストライクとスペア)の場合、合計値は20です。

10フレーム目がXXX(3つのストライク)の場合、合計値は30です。

要件

ボウリングのゲームのスコアを記録するコードを書きましょう。 次の2つの操作をサポートする必要があります。

  • roll(pins : int)は、プレイヤーがボールを投げるたびに呼び出されます。 引数は、倒したピンの本数です。
  • score() : intは、ゲームの最後にだけ呼び出されます。 そのゲームの合計スコアを返します。

ワード

gameタプルと、まだ1回も投げていない新しいゲームを返すコンストラクター<game> ( -- game )を定義します。

ゲームを操作する次のワードを用意します。

  • roll ( pins game -- ):pins本のピンが倒れたことを記録します。無効なロールのときは、次のエラーを投げます。
    • ピンの数が負の場合は、"Negative roll is invalid"を投げます。
    • 10フレーム(と、あればフィルボール)をすべて投げ終えたあとに投げようとした場合は、"Cannot roll after game is over"を投げます。
    • レーンに立っているピンより多く倒そうとした場合は、"Pin count exceeds pins on the lane"を投げます。
  • score ( game -- n ):ゲームの合計スコアです。ゲームがまだ終わっていない場合は、"Score cannot be taken until the end of the game"を投げます。

rollは、kernelボキャブラリーのシャッフルワードrollを隠してしまうことに注意してください。テストスイートはFROM: bowling => roll ;でこの2つを区別します。

GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
Factor Exercism

ボウリングを始める準備はできましたか?

Exercismに登録すれば、47個のコンセプト163個の演習、そして本物の人間によるメンタリングとともに、Factorを学んでマスターできます。すべて無料です。