表示調整
閉じる
挿絵表示切替ボタン
▼配色
▼行間
▼文字サイズ
▼メニューバー
×閉じる

ブックマークに追加しました

設定
0/400
設定を保存しました
エラーが発生しました
※文字以内
ブックマークを解除しました。

エラーが発生しました。

エラーの原因がわからない場合はヘルプセンターをご確認ください。

1/3

ボウリングのスコアを計算してみる

以前カクヨムに掲載したものがGitHubにインポート中に発掘されたので転載です。ちなみに、筆者はPythonは業務で使ったことはなくて、これがPython書くのN度目(N < 10)くらいです。

 こんにちは、久野です。ちょっと作品中でボウリングのスコアが出てくる場面があったので、計算が間違ってないか試してみるために、Pythonプログラムを書いてみました。実質Pythonでまともなプログラム書くの初めてなので(普段はスクリプト言語だとRuby)、色々不慣れな感がありありですが、プログラムコードをカクヨムに載っける実験も兼ねてやってみました(なお、Python 3.8.1で動作確認しました)。


 カクヨムに以前掲載したのを発掘したので、せっかくなので、こちらにも、というだけの代物ですが。


・score関数で、各フレームのスコアの合計を計算

・framesはネストした配列で、各要素配列は2要素で、10投目だけ3要素


て感じです。例外処理とかは特に考えてません。作成時間約30分で、計算がバグってる箇所があるかもしれないので、もしあったらご指摘いただければと思います。ちなみに、半角空白だと無視されちゃうので、全角空白で無理やりインデントしました。


ーーーーーーーーーーーーーーーーーーーー

def score(frames):

rest = frames

total = 0

frame_count = 1

while rest != []:

  current_frame = rest[0]

  a = current_frame[0]

  b = current_frame[1]

  if len(rest)== 1:

    c = current_frame[2]

    total += a + b + c

  else:

   if a == 10:

    total += strike(rest, frame_count)

   elif a + b == 10:

    total += spare(rest, frame_count)

   else:

    total += a + b

   frame_count += 1

  rest = rest[1:]

return total


def spare(frames, frame_count):

    return 10 + frames[1][0]


def strike(frames, frame_count):

    assert(frames[0][0] == 10)

    score = 10

    if frame_count == 9:

        score += frames[1][0] + frames[1][1]

    ## frame_count should be <= 9

    elif frames[1][0] == 10:

        score += 10 + frames[2][0]

    else:

        score += frames[1][0] + frames[1][1]

    return score




frames = [

        [10, 0],

        [4, 6],

        [6, 4],

        [10, 0],

        [5, 3],

        [10, 0],

        [3, 2],

        [3, 3],

        [10, 0],

        [10, 10, 10]

]

print(score(frames))


frames = [

        [10, 0],

        [10, 0],

        [10, 0],

        [10, 0],

        [10, 0],

        [10, 0],

        [10, 0],

        [10, 0],

        [10, 0],

        [10, 0, 0]

]

ーーーーーーーーーーーーーーーーーーーー


特に面白みはありませんが、プログラマーな方々の、別解や別言語による投稿お待ちしています(?)

評価をするにはログインしてください。
この作品をシェア
Twitter LINEで送る
ブックマークに追加
ブックマーク機能を使うにはログインしてください。
― 新着の感想 ―
[一言] もっと短くなった。 using System; using System.Linq; using System.Collections.Generic; namespace Consol…
[一言] で。10フレの話を理解したうえで、効率無視して作成した、多少モダンぽい? c#コード。短さ優先。正しいかどうかは不明。 using System; using System.Linq; …
[一言] あ、これ、インデント用の全角スペースをそのままWhite Spaceと解釈してコンパイルできるということ、です。 変数名のUnicode対応とかは、その流れ、ですね。MSのはそういった点しっ…
感想一覧
+注意+

特に記載なき場合、掲載されている作品はすべてフィクションであり実在の人物・団体等とは一切関係ありません。
特に記載なき場合、掲載されている作品の著作権は作者にあります(一部作品除く)。
作者以外の方による作品の引用を超える無断転載は禁止しており、行った場合、著作権法の違反となります。

この作品はリンクフリーです。ご自由にリンク(紹介)してください。
この作品はスマートフォン対応です。スマートフォンかパソコンかを自動で判別し、適切なページを表示します。

↑ページトップへ