#author("2026-07-05T19:53:17+09:00;1970-01-01T18:00:00+09:00","default:vip","vip")
[[練習問題>練習問題#bowling]]

本当はちゃんとクラスを書いた方がいい
 _ = input('投球数: ')
 n_pins = tuple(map(int, input('ピン数の列: ').split()))
 n_throw = len(n_pins)
 
 EMPTY, NORMAL, STRIKE, SPARE = 0, 1, 2, 3
 pts = [-1] * 21
 p_types = [EMPTY] * 21
 f_total = [0] * 10
 
 f_idx = 0
 trial = 0
 for i in range(n_throw):
     pt = n_pins[i]
     p_idx = f_idx * 2 + trial
     
     if pt == 10:
         p_types[p_idx] = STRIKE
         if f_idx < 9:  # 最終フレームはボーナスと投球スキップなし
             pt += n_pins[i+1] +  n_pins[i+2]
             trial += 1
     elif trial == 1 and pt + pts[p_idx-1] == 10:
         p_types[p_idx] = SPARE
         if f_idx < 9:
             pt += n_pins[i+1]
     else:
         p_types[p_idx] = NORMAL
     pts[p_idx] = pt
     f_total[f_idx] += pt
     
     if f_idx < 9:
         if trial == 1:
             f_total[f_idx+1] += f_total[f_idx]
             f_idx += 1
         trial = 1 - trial
     else:
         trial += 1
 
 marks = {EMPTY:'_', STRIKE: 'X', SPARE: '/'}
 symbolize = lambda i: f"{pts[i]}" if p_types[i] == NORMAL else marks[p_types[i]]
 
 p_splitted = [range(f*2, f*2+2+(f//9)) for f in range(10)]
 f_str = [''.join(symbolize(p_idx) for p_idx in ps) for ps in p_splitted]
 
 print()
 print(' '.join(f"{s:^3}" for s in f_str))
 print(' '.join(f"{t:^3}" for t in f_total))


トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS