ChatGPTに作成してもらった仕様で0からビンゴゲームを作成する
はじめに
プログラムを設計する力が圧倒的に足りない。
日々の実務で感じていること。
そこで、タイトルのアイディアを思いついた。
自分の実力を試していこう。
ChatGPTに相談した内容

簡易仕様(最小版)
1. 概要
- 5×5のビンゴカード(中央はFREE=最初からマーク済み)。
- 列ごとの数値範囲:B=1–15, I=16–30, N=31–45, G=46–60, O=61–75(重複なし)。
- コーラーは1–75から重複なしで1つずつ番号を引く。
- プレイヤーのカードに該当番号があれば自動でマーク。
- 横・縦・斜めのいずれか1ライン成立で勝利。
2. 実行・入出力(CLI)
- 実行: python bingo.py
- 操作:
- Enter: 次の番号をコール
- h: これまでのコール履歴表示
- q: 終了
 
- 表示:
- ヘッダ B I N G O
- 数字は2桁右寄せ、マーク済みは [12]のように角括弧。
- FREE は [FR]
- 毎ターン:Turn, Called, Remaining, 現在のライン数を表示
- 勝利時:BINGO!を表示して終了
- 75個すべて引いても揃わなければ引き分け終了
 
- ヘッダ 
3. 制約
- Python 3.10+、標準ライブラリのみ使用。
- 単一ファイル(bingo.py)でOK。
- I/O(print/input)とロジック(カード生成・判定)は関数/クラスで分離。
4. 受け入れ基準(最低限)
- 起動時にカードが正しく生成され、各列の数値が範囲内。
- 番号コールは重複なしで進行する。
- コールに応じてカードがマークされる。
- 横/縦/斜めのいずれかが成立したら終了メッセージが出る。
- hで履歴が見える、- qで即終了できる。
環境構築
from-zero.pyで進めていく。
venvも入れた。

venv環境のPythonのバージョンは、3.8.9。

仕様のPython 3.10+に合わない。これは、3.10以上のバージョンということ。
3. 制約
Python 3.10+、標準ライブラリのみ使用。Homebrewがあることを確認して、
(venv) Mac:bingo shibatahiroshitaka$ brew --version
Homebrew 4.5.10以下のコマンドで、Python3.11をインストールした。
brew install python@3.11ストレージがいっぱいという表示が出た。
以下の状態。

空き容量の確認を行なった。
Mac:~ shibatahiroshitaka$ df -h /
Filesystem       Size   Used  Avail Capacity iused      ifree %iused  Mounted on
/dev/disk1s5s1  113Gi   14Gi  2.8Gi    84%  553830 1181264610    0%   /Homebrewキャッシュの削除を行った。
Mac:~ shibatahiroshitaka$ brew cleanup -s
〜途中省略〜
==> This operation has freed approximately 947.4MB of disk space.ac:~ shibatahiroshitaka$ brew autoremove
Avail(空き)が、6.9Giになった!
Mac:~ shibatahiroshitaka$ df -h /
Filesystem       Size   Used  Avail Capacity iused      ifree %iused  Mounted on
/dev/disk1s5s1  113Gi   14Gi  6.9Gi    68%  553830 1181264610    0%   /makeで止まっているが、

これはよくあることらしい。

以下も行って、微々たるものだが、容量を減らした。
Mac:~ shibatahiroshitaka$ du -sh ~/Downloads
369M	/Users/shibatahiroshitaka/Downloadsエラーが出た。

公式インストーラを使用するのが、トラブルが少ないみたいなので、その方法を採用した。

空き容量の問題はクリアーしている。

インストール完了。
venvを作り直し。
venvの削除まではうまく行ったみたいだが、
(venv) Mac:bingo shibatahiroshitaka$ deactivate 2>/dev/null || true
Mac:bingo shibatahiroshitaka$ rm -rf venvPythonの3.11でvenvを作成できない。パスを正しく設定していないのが原因だろう。
Mac:bingo shibatahiroshitaka$ /Library/Frameworks/Python.framework/Versions/3.11/bin/python3 -m venv venv
bash: /Library/Frameworks/Python.framework/Versions/3.11/bin/python3: No such file or directory以下のコマンドで、3.12.3のバージョンが表示されたので、
Mac:bingo shibatahiroshitaka$ /Library/Frameworks/Python.framework/Versions/3.12/bin/python3 -V
Python 3.12.3/Library/Frameworks/Python.framework/Versions/3.12/bin/python3にインストールした3.12のPythonがあることが確認できた。
このPythonを使用して、venvを作成した。
Mac:bingo shibatahiroshitaka$ /Library/Frameworks/Python.framework/Versions/3.12/bin/python3 -m venv venvvenvに入って、Pythonのバージョンが3.12.3であることが確認できた。
Mac:bingo shibatahiroshitaka$ source venv/bin/activate
(venv) Mac:bingo shibatahiroshitaka$ python --version
Python 3.12.3ビンゴカードの描画
まずはこれからやっていこう。
5行×5列を作成した。
def generate_card():
  card = []
  num = 0
  for r in range(5):
    row = []
    for c in range(5):
      row.append(num)
      num += 1
    card.append(row)
  return card
for row in generate_card():
  print(row)[0, 1, 2, 3, 4]
[5, 6, 7, 8, 9]
[10, 11, 12, 13, 14]
[15, 16, 17, 18, 19]
[20, 21, 22, 23, 24]内側のfor文では、行を作成している。
def generate_card():
  card = []
  num = 0
  for r in range(5):
    row = []
    for c in range(5):
      row.append(num)
      num += 1
    card.append(row)
  return card
for row in generate_card():
  print(row)内側のfor文のループを抜けると、cardに作成されたrowが追加される。その後、外側のfor文の次のループが始まり、rowがリセットされる。
def generate_card():
  card = []
  num = 0
  for r in range(5):
    row = []
    for c in range(5):
      row.append(num)
      num += 1
    card.append(row)
  return card
for row in generate_card():
  print(row)行のリスト作成の5ループによって作成された行のリスト(row)が、5回cardに追加される。
それを以下で順番に出力している。
def generate_card():
  card = []
  num = 0
  for r in range(5):
    row = []
    for c in range(5):
      row.append(num)
      num += 1
    card.append(row)
  return card
for row in generate_card():
  print(row)[0, 1, 2, 3, 4]
[5, 6, 7, 8, 9]
[10, 11, 12, 13, 14]
[15, 16, 17, 18, 19]
[20, 21, 22, 23, 24]実際のビンゴゲームの仕様に合わせると以下のようになる。
import random
B_RANGES = [(1, 15), (16, 30), (31, 45), (46, 60), (61, 75)]
def generate_card():
  cols = []
  for lo, hi in B_RANGES:
    col = random.sample(range(lo, hi + 1), 5)
    cols.append(col)
  card = [[cols[c][r] for c in range(5)] for r in range(5)]
  card[2][2] = "FR"
  return card
for row in generate_card():
  print(row)[8, 16, 33, 46, 61]
[14, 19, 41, 49, 75]
[12, 18, 'FR', 51, 74]
[3, 25, 43, 47, 68]
[1, 20, 31, 53, 70]print_card関数を追加して、以下のようにした。
import random
B_RANGES = [(1, 15), (16, 30), (31, 45), (46, 60), (61, 75)]
def generate_card():
  cols = [random.sample(range(lo, hi + 1), 5) for lo, hi in B_RANGES]
  card = [[cols[c][r] for c in range(5)] for r in range(5)]
  card[2][2] = "FR"
  return card
def print_card(card):
  print('B  I  N  G  O')
  for row in card:
    row_str = ""
    for v in row:
      if v == "FR":
        row_str += " FR "
      else:
        row_str += f"{v:>3} "
    print(row_str)
def main():
  card = generate_card()
  print_card(card)
if __name__ == "__main__":
  main()B  I  N  G  O
  1  22  32  56  67 
  9  23  34  54  63 
  8  24  FR  57  62 
 14  28  36  48  75 
  7  21  44  50  71 BINGOという文字列が揃っていないという問題を解決していく。
以下の形にすると、きれいになった。
import random
B_RANGES = [(1, 15), (16, 30), (31, 45), (46, 60), (61, 75)]
CELL_W = 4
def generate_card():
  cols = [random.sample(range(lo, hi + 1), 5) for lo, hi in B_RANGES]
  card = [[cols[c][r] for c in range(5)] for r in range(5)]
  card[2][2] = "FR"
  return card
def print_card(card, marked=None):
  header = "".join(f"{ch:^{CELL_W}}" for ch in "BINGO")
  print(header)
  for r in range(5):
    cells = []
    for c in range(5):
      v = card[r][c]
      if v == "FR":
        s = "FR"
      elif marked and marked[r][c]:
        s = f"[{str(v).rjust(2)}]"  
      else:
        s = f"{str(v).rjust(2)}"
      cells.append(f"{s:^{CELL_W}}")
    print("".join(cells))
def main():
  card = generate_card()
  print_card(card)
if __name__ == "__main__":
  main() B   I   N   G   O  
  3  22  33  53  61 
 10  23  32  50  74 
  8  19  FR  57  64 
  4  26  35  60  66 
 14  25  34  55  63 rjust(2)は、右寄せで2桁という意味。
  for r in range(5):
    cells = []
    for c in range(5):
      v = card[r][c]
      if v == "FR":
        s = "FR"
      elif marked and marked[r][c]:
        s = f"[{str(v).rjust(2)}]"  
      else:
        s = f"{str(v).rjust(2)}"
      cells.append(f"{s:^{CELL_W}}")
    print("".join(cells))ビンゴカードの描画が完了した。

現状の進捗率は35%
完了
- 5×5生成+中央FREE
- 列ごとの範囲・重複なし
- ヘッダ「BINGO」
- 数字2桁右寄せ
- Python 3.10+
- 標準ライブラリのみ
- 単一ファイル


未完了
- Enter(次の番号)/ h(履歴)/ q(終了)の入力
- FREEは[FR]
- コーラーが1-75から重複なく番号を引く
- コール時に番号があれば自動でマークする
- マーク済みの表示
- 1ラインで勝利判定
- Turn/Called/Remainingの表示
- 勝利/引き分けメッセージ
FREEは[FR]
これはすぐに終わらせられるはずだ。
import random
B_RANGES = [(1, 15), (16, 30), (31, 45), (46, 60), (61, 75)]
CELL_W = 4
def generate_card():
  cols = [random.sample(range(lo, hi + 1), 5) for lo, hi in B_RANGES]
  card = [[cols[c][r] for c in range(5)] for r in range(5)]
  card[2][2] = "FR"
  return card
def print_card(card, marked=None):
  header = "".join(f"{ch:^{CELL_W}}" for ch in "BINGO")
  print(header)
  for r in range(5):
    cells = []
    for c in range(5):
      v = card[r][c]
      if v == "FR":
        s = "[FR]"
      elif marked and marked[r][c]:
        s = f"[{str(v).rjust(2)}]"  
      else:
        s = f"{str(v).rjust(2)}"
      cells.append(f"{s:^{CELL_W}}")
    print("".join(cells))
def main():
  card = generate_card()
  print_card(card)
if __name__ == "__main__":
  main()
進捗には、ほとんど影響しない。
が、着実な一歩である。
マーク状態を持つ
def new_marked():
  m = [[False]*5 for _ in range(5)]
  m[2][2] = True # FREEは最初からマーク
  return m番号をマークする
def mark_number(card, marked, n):
  for r in range(5):
    for c in range(5):
      if card[r][c] == n:
        marked[r][c] = True
        return True
  return Falseライン数を数える
def count_lines(marked):
  lines = 0
  for r in range(5):
    if all(marked[r][c] for c in range(5)): lines += 1
  for c in range(5):
    if all(marked[r][c] for r in range(5)): lines += 1  
  if all(marked[i][i] for i in range(5)): lines += 1
  if all(marked[i][4-i] for i in range(5)): lines += 1  
  return lines表示関数でmarkedを使う
def main():
  card = generate_card()
  marked = new_marked()
  print_card(card, marked)main()を1ターンだけ試す
def main():
  card = generate_card()
  marked = new_marked()
  print_card(card, marked)
  pool = list(range(1, 76))
  random.shuffle(pool)
  n = pool.pop()
  mark_number(card, marked, n)
  lines = count_lines(marked)
  print(f"\nCalled: {n}  Remaining: {len(pool)}  Lines: {lines}")
  print_card(card, marked)hiroki@shibatahiroshitakanoiMac bingo % /Users/hiroki/.pyenv/versions/3.12.2/bin/python /Users/hiroki/Downloads/bingo/from-zero.py
 B   I   N   G   O  
  5  22  38  54  70 
 10  18  40  48  68 
 11  17 [FR] 46  72 
  2  25  45  47  69 
 15  27  32  57  74 
Called: 22  Remaining: 74  Lines: 0
 B   I   N   G   O  
  5 [22] 38  54  70 
 10  18  40  48  68 
 11  17 [FR] 46  72 
  2  25  45  47  69 
 15  27  32  57  74 Enterで次の番号をコール

def main():
  card = generate_card()
  marked = new_marked()
  pool = list(range(1, 76))
  random.shuffle(pool)
  history = []
  turn = 0
  print_card(card, marked)
  print("Enter=next  h=history  q=quit") 
  
  while True:
    cmd = input("> ").strip().lower()
    
    if cmd == "q":
      print("Bye!")
      break
    if cmd == "h":
      print(f"Called: {', '.join(map(str, history)) or '(none)'}")
      continue
    # Enter(空文字)以外は無視して続行
    if cmd not in ("",):
      continue
    if not pool:
      print("No numbers left. Drow game.")
      break
    # ここから1ターン進行
    n = pool.pop()
    history.append(n)
    turn += 1
    lines = count_lines(marked)
    print(f"\nTurn {turn}  Called: {n}  Remaining: {len(pool)}  Lines: {lines}")
    print_card(card, marked)
    if lines >= 1:
      print("\nBUNGO! congrats!")
      breakターン数、呼ばれた番号、残りの番号の総数を表示

ターン数 = 赤、呼ばれた番号 = 青、残りの番号の総数 = 緑
def main():
  card = generate_card()
  marked = new_marked()
  pool = list(range(1, 76))
  random.shuffle(pool)
  history = []
  turn = 0
  print_card(card, marked)
  print("Enter=next  h=history  q=quit") 
  
  while True:
    cmd = input("> ").strip().lower()
    
    if cmd == "q":
      print("Bye!")
      break
    if cmd == "h":
      print(f"Called: {', '.join(map(str, history)) or '(none)'}")
      continue
    # Enter(空文字)以外は無視して続行
    if cmd not in ("",):
      continue
    if not pool:
      print("No numbers left. Drow game.")
      break
    # ここから1ターン進行
    n  = pool.pop()
    history.append(n)
    turn += 1
    lines = count_lines(marked)
    print(f"\nTurn {turn}  Called: {n}  Remaining: {len(pool)}  Lines: {lines}")
    print_card(card, marked)
    if lines >= 1:
      print("\nBUNGO! congrats!")
      breakカードにマークする
現状、カードにマークがされない。
そのため、ゲームが進んでも、以下のようになる。

原因は、mark_number関数を使用していないから。
def mark_number(card, marked, n):
  for r in range(5):
    for c in range(5):
      if card[r][c] == n:
        marked[r][c] = True
        return True
  return Falsemain関数のwhileループ内に以下の赤字部分を追加した。
def main():
  card = generate_card()
  marked = new_marked()
  pool = list(range(1, 76))
  random.shuffle(pool)
  history = []
  turn = 0
  print_card(card, marked)
  print("Enter=next  h=history  q=quit") 
  
  while True:
    cmd = input("> ").strip().lower()
    
    if cmd == "q":
      print("Bye!")
      break
    if cmd == "h":
      print(f"Called: {', '.join(map(str, history)) or '(none)'}")
      continue
    # Enter(空文字)以外は無視して続行
    if cmd not in ("",):
      continue
    if not pool:
      print("No numbers left. Drow game.")
      break
    # ここから1ターン進行
    n  = pool.pop()
    history.append(n)
    turn += 1
    lines = count_lines(marked)
    mark_number(card, marked, n)
    print(f"\nTurn {turn}  Called: {n}  Remaining: {len(pool)}  Lines: {lines}")
    print_card(card, marked)
    if lines >= 1:
      print("\nBUNGO! congrats!")
      breakこれで、カードにマークされるようになった。

BINGO!になるようにする
現状、1行目がすべてマークされているのに、BINGO!と表示されていない。

ラインの数も増えない。
ラインの数が増えないから、以下の条件に当てはまらない。
    if lines >= 1:
      print("\nBUNGO! congrats!")
      breakcount_lines関数にmarkedを渡すことで、linesの状態を変化させようとしている。
    lines = count_lines(marked)現状、markedの状態を変化させるmark_number関数が、count_lines関数の後に来てしまっている。
    lines = count_lines(marked)
    mark_number(card, marked, n)これを反対にすれば、markedが正しく変化する。
そして、正しくBINGOになった。(BUNGOとタイポしている)

hで履歴が見える、qで即終了できる
hで履歴が見える。
def main():
  card = generate_card()
  marked = new_marked()
  pool = list(range(1, 76))
  random.shuffle(pool)
  history = []
  turn = 0
  print_card(card, marked)
  print("Enter=next  h=history  q=quit") 
  
  while True:
    cmd = input("> ").strip().lower()
    
    if cmd == "q":
      print("Bye!")
      break
    if cmd == "h":
      print(f"Called: {', '.join(map(str, history)) or '(none)'}")
      continue
    # Enter(空文字)以外は無視して続行
    if cmd not in ("",):
      continue
    if not pool:
      print("No numbers left. Drow game.")
      break
    # ここから1ターン進行
    n  = pool.pop()
    history.append(n)
    turn += 1
    mark_number(card, marked, n)
    lines = count_lines(marked)
    print(f"\nTurn {turn}  Called: {n}  Remaining: {len(pool)}  Lines: {lines}")
    print_card(card, marked)
    if lines >= 1:
      print("\nBUNGO! congrats!")
      break以下の部分について解説しよう。
    if cmd == "h":
      print(f"Called: {', '.join(map(str, history)) or '(none)'}")
      continuehistoryに値がない場合は、(none)になる。

値がある場合は、historyに入っている数値を文字列に変換して、「,」区切りにする。

qで即終了できる。

def main():
  card = generate_card()
  marked = new_marked()
  pool = list(range(1, 76))
  random.shuffle(pool)
  history = []
  turn = 0
  print_card(card, marked)
  print("Enter=next  h=history  q=quit") 
  
  while True:
    cmd = input("> ").strip().lower()
    
    if cmd == "q":
      print("Bye!")
      break
    if cmd == "h":
      print(f"Called: {', '.join(map(str, history)) or '(none)'}")
      continue
    # Enter(空文字)以外は無視して続行
    if cmd not in ("",):
      continue
    if not pool:
      print("No numbers left. Drow game.")
      break
    # ここから1ターン進行
    n  = pool.pop()
    history.append(n)
    turn += 1
    mark_number(card, marked, n)
    lines = count_lines(marked)
    print(f"\nTurn {turn}  Called: {n}  Remaining: {len(pool)}  Lines: {lines}")
    print_card(card, marked)
    if lines >= 1:
      print("\nBUNGO! congrats!")
      break仕様を満たすビンゴゲームの作成が完了した

import random
B_RANGES = [(1, 15), (16, 30), (31, 45), (46, 60), (61, 75)]
CELL_W = 4
def generate_card():
  cols = [random.sample(range(lo, hi + 1), 5) for lo, hi in B_RANGES]
  card = [[cols[c][r] for c in range(5)] for r in range(5)]
  card[2][2] = "FR"
  return card
def print_card(card, marked=None):
  header = "".join(f"{ch:^{CELL_W}}" for ch in "BINGO")
  print(header)
  for r in range(5):
    cells = []
    for c in range(5):
      v = card[r][c]
      if v == "FR":
        s = "[FR]"
      elif marked and marked[r][c]:
        s = f"[{str(v).rjust(2)}]"  
      else:
        s = f"{str(v).rjust(2)}"
      cells.append(f"{s:^{CELL_W}}")
    print("".join(cells))
def new_marked():
  m = [[False]*5 for _ in range(5)]
  m[2][2] = True # FREEは最初からマーク
  return m
def mark_number(card, marked, n):
  for r in range(5):
    for c in range(5):
      if card[r][c] == n:
        marked[r][c] = True
        return True
  return False
def count_lines(marked):
  lines = 0
  for r in range(5):
    if all(marked[r][c] for c in range(5)): lines += 1
  for c in range(5):
    if all(marked[r][c] for r in range(5)): lines += 1  
  if all(marked[i][i] for i in range(5)): lines += 1
  if all(marked[i][4-i] for i in range(5)): lines += 1  
  return lines
def main():
  card = generate_card()
  marked = new_marked()
  pool = list(range(1, 76))
  random.shuffle(pool)
  history = []
  turn = 0
  print_card(card, marked)
  print("Enter=next  h=history  q=quit") 
  
  while True:
    cmd = input("> ").strip().lower()
    
    if cmd == "q":
      print("Bye!")
      break
    if cmd == "h":
      print(f"Called: {', '.join(map(str, history)) or '(none)'}")
      continue
    # Enter(空文字)以外は無視して続行
    if cmd not in ("",):
      continue
    if not pool:
      print("No numbers left. Draw game.")
      break
    # ここから1ターン進行
    n  = pool.pop()
    history.append(n)
    turn += 1
    mark_number(card, marked, n)
    lines = count_lines(marked)
    print(f"\nTurn {turn}  Called: {n}  Remaining: {len(pool)}  Lines: {lines}")
    print_card(card, marked)
    if lines >= 1:
      print("\nBINGO! congrats!")
      break
if __name__ == "__main__":
  main()hiroki@shibatahiroshitakanoiMac bingo % python from-zero.py
 B   I   N   G   O  
 14  23  41  52  65 
  3  27  31  53  74 
 12  20 [FR] 49  68 
 10  17  36  59  61 
  6  18  37  57  69 
Enter=next  h=history  q=quit
> 
Turn 1  Called: 44  Remaining: 74  Lines: 0
 B   I   N   G   O  
 14  23  41  52  65 
  3  27  31  53  74 
 12  20 [FR] 49  68 
 10  17  36  59  61 
  6  18  37  57  69 
> 
Turn 2  Called: 5  Remaining: 73  Lines: 0
 B   I   N   G   O  
 14  23  41  52  65 
  3  27  31  53  74 
 12  20 [FR] 49  68 
 10  17  36  59  61 
  6  18  37  57  69 
> 
Turn 3  Called: 70  Remaining: 72  Lines: 0
 B   I   N   G   O  
 14  23  41  52  65 
  3  27  31  53  74 
 12  20 [FR] 49  68 
 10  17  36  59  61 
  6  18  37  57  69 
> 
Turn 4  Called: 60  Remaining: 71  Lines: 0
 B   I   N   G   O  
 14  23  41  52  65 
  3  27  31  53  74 
 12  20 [FR] 49  68 
 10  17  36  59  61 
  6  18  37  57  69 
> 
Turn 5  Called: 74  Remaining: 70  Lines: 0
 B   I   N   G   O  
 14  23  41  52  65 
  3  27  31  53 [74]
 12  20 [FR] 49  68 
 10  17  36  59  61 
  6  18  37  57  69 
> 
Turn 6  Called: 40  Remaining: 69  Lines: 0
 B   I   N   G   O  
 14  23  41  52  65 
  3  27  31  53 [74]
 12  20 [FR] 49  68 
 10  17  36  59  61 
  6  18  37  57  69 
> 
Turn 7  Called: 45  Remaining: 68  Lines: 0
 B   I   N   G   O  
 14  23  41  52  65 
  3  27  31  53 [74]
 12  20 [FR] 49  68 
 10  17  36  59  61 
  6  18  37  57  69 
> 
Turn 8  Called: 7  Remaining: 67  Lines: 0
 B   I   N   G   O  
 14  23  41  52  65 
  3  27  31  53 [74]
 12  20 [FR] 49  68 
 10  17  36  59  61 
  6  18  37  57  69 
> 
Turn 9  Called: 55  Remaining: 66  Lines: 0
 B   I   N   G   O  
 14  23  41  52  65 
  3  27  31  53 [74]
 12  20 [FR] 49  68 
 10  17  36  59  61 
  6  18  37  57  69 
> 
Turn 10  Called: 67  Remaining: 65  Lines: 0
 B   I   N   G   O  
 14  23  41  52  65 
  3  27  31  53 [74]
 12  20 [FR] 49  68 
 10  17  36  59  61 
  6  18  37  57  69 
> 
Turn 11  Called: 41  Remaining: 64  Lines: 0
 B   I   N   G   O  
 14  23 [41] 52  65 
  3  27  31  53 [74]
 12  20 [FR] 49  68 
 10  17  36  59  61 
  6  18  37  57  69 
> 
Turn 12  Called: 51  Remaining: 63  Lines: 0
 B   I   N   G   O  
 14  23 [41] 52  65 
  3  27  31  53 [74]
 12  20 [FR] 49  68 
 10  17  36  59  61 
  6  18  37  57  69 
> 
Turn 13  Called: 29  Remaining: 62  Lines: 0
 B   I   N   G   O  
 14  23 [41] 52  65 
  3  27  31  53 [74]
 12  20 [FR] 49  68 
 10  17  36  59  61 
  6  18  37  57  69 
> 
Turn 14  Called: 69  Remaining: 61  Lines: 0
 B   I   N   G   O  
 14  23 [41] 52  65 
  3  27  31  53 [74]
 12  20 [FR] 49  68 
 10  17  36  59  61 
  6  18  37  57 [69]
> 
Turn 15  Called: 4  Remaining: 60  Lines: 0
 B   I   N   G   O  
 14  23 [41] 52  65 
  3  27  31  53 [74]
 12  20 [FR] 49  68 
 10  17  36  59  61 
  6  18  37  57 [69]
> 
Turn 16  Called: 30  Remaining: 59  Lines: 0
 B   I   N   G   O  
 14  23 [41] 52  65 
  3  27  31  53 [74]
 12  20 [FR] 49  68 
 10  17  36  59  61 
  6  18  37  57 [69]
> 
Turn 17  Called: 23  Remaining: 58  Lines: 0
 B   I   N   G   O  
 14 [23][41] 52  65 
  3  27  31  53 [74]
 12  20 [FR] 49  68 
 10  17  36  59  61 
  6  18  37  57 [69]
> 
Turn 18  Called: 9  Remaining: 57  Lines: 0
 B   I   N   G   O  
 14 [23][41] 52  65 
  3  27  31  53 [74]
 12  20 [FR] 49  68 
 10  17  36  59  61 
  6  18  37  57 [69]
> 
Turn 19  Called: 35  Remaining: 56  Lines: 0
 B   I   N   G   O  
 14 [23][41] 52  65 
  3  27  31  53 [74]
 12  20 [FR] 49  68 
 10  17  36  59  61 
  6  18  37  57 [69]
> 
Turn 20  Called: 58  Remaining: 55  Lines: 0
 B   I   N   G   O  
 14 [23][41] 52  65 
  3  27  31  53 [74]
 12  20 [FR] 49  68 
 10  17  36  59  61 
  6  18  37  57 [69]
> 
Turn 21  Called: 8  Remaining: 54  Lines: 0
 B   I   N   G   O  
 14 [23][41] 52  65 
  3  27  31  53 [74]
 12  20 [FR] 49  68 
 10  17  36  59  61 
  6  18  37  57 [69]
> 
Turn 22  Called: 75  Remaining: 53  Lines: 0
 B   I   N   G   O  
 14 [23][41] 52  65 
  3  27  31  53 [74]
 12  20 [FR] 49  68 
 10  17  36  59  61 
  6  18  37  57 [69]
> 
Turn 23  Called: 24  Remaining: 52  Lines: 0
 B   I   N   G   O  
 14 [23][41] 52  65 
  3  27  31  53 [74]
 12  20 [FR] 49  68 
 10  17  36  59  61 
  6  18  37  57 [69]
> 
Turn 24  Called: 62  Remaining: 51  Lines: 0
 B   I   N   G   O  
 14 [23][41] 52  65 
  3  27  31  53 [74]
 12  20 [FR] 49  68 
 10  17  36  59  61 
  6  18  37  57 [69]
> 
Turn 25  Called: 73  Remaining: 50  Lines: 0
 B   I   N   G   O  
 14 [23][41] 52  65 
  3  27  31  53 [74]
 12  20 [FR] 49  68 
 10  17  36  59  61 
  6  18  37  57 [69]
> 
Turn 26  Called: 19  Remaining: 49  Lines: 0
 B   I   N   G   O  
 14 [23][41] 52  65 
  3  27  31  53 [74]
 12  20 [FR] 49  68 
 10  17  36  59  61 
  6  18  37  57 [69]
> 
Turn 27  Called: 52  Remaining: 48  Lines: 0
 B   I   N   G   O  
 14 [23][41][52] 65 
  3  27  31  53 [74]
 12  20 [FR] 49  68 
 10  17  36  59  61 
  6  18  37  57 [69]
> 
Turn 28  Called: 48  Remaining: 47  Lines: 0
 B   I   N   G   O  
 14 [23][41][52] 65 
  3  27  31  53 [74]
 12  20 [FR] 49  68 
 10  17  36  59  61 
  6  18  37  57 [69]
> 
Turn 29  Called: 27  Remaining: 46  Lines: 0
 B   I   N   G   O  
 14 [23][41][52] 65 
  3 [27] 31  53 [74]
 12  20 [FR] 49  68 
 10  17  36  59  61 
  6  18  37  57 [69]
> 
Turn 30  Called: 43  Remaining: 45  Lines: 0
 B   I   N   G   O  
 14 [23][41][52] 65 
  3 [27] 31  53 [74]
 12  20 [FR] 49  68 
 10  17  36  59  61 
  6  18  37  57 [69]
> 
Turn 31  Called: 31  Remaining: 44  Lines: 0
 B   I   N   G   O  
 14 [23][41][52] 65 
  3 [27][31] 53 [74]
 12  20 [FR] 49  68 
 10  17  36  59  61 
  6  18  37  57 [69]
> 
Turn 32  Called: 18  Remaining: 43  Lines: 0
 B   I   N   G   O  
 14 [23][41][52] 65 
  3 [27][31] 53 [74]
 12  20 [FR] 49  68 
 10  17  36  59  61 
  6 [18] 37  57 [69]
> 
Turn 33  Called: 2  Remaining: 42  Lines: 0
 B   I   N   G   O  
 14 [23][41][52] 65 
  3 [27][31] 53 [74]
 12  20 [FR] 49  68 
 10  17  36  59  61 
  6 [18] 37  57 [69]
> 
Turn 34  Called: 46  Remaining: 41  Lines: 0
 B   I   N   G   O  
 14 [23][41][52] 65 
  3 [27][31] 53 [74]
 12  20 [FR] 49  68 
 10  17  36  59  61 
  6 [18] 37  57 [69]
> 
Turn 35  Called: 36  Remaining: 40  Lines: 0
 B   I   N   G   O  
 14 [23][41][52] 65 
  3 [27][31] 53 [74]
 12  20 [FR] 49  68 
 10  17 [36] 59  61 
  6 [18] 37  57 [69]
> 
Turn 36  Called: 21  Remaining: 39  Lines: 0
 B   I   N   G   O  
 14 [23][41][52] 65 
  3 [27][31] 53 [74]
 12  20 [FR] 49  68 
 10  17 [36] 59  61 
  6 [18] 37  57 [69]
> 
Turn 37  Called: 15  Remaining: 38  Lines: 0
 B   I   N   G   O  
 14 [23][41][52] 65 
  3 [27][31] 53 [74]
 12  20 [FR] 49  68 
 10  17 [36] 59  61 
  6 [18] 37  57 [69]
> 
Turn 38  Called: 22  Remaining: 37  Lines: 0
 B   I   N   G   O  
 14 [23][41][52] 65 
  3 [27][31] 53 [74]
 12  20 [FR] 49  68 
 10  17 [36] 59  61 
  6 [18] 37  57 [69]
> 
Turn 39  Called: 39  Remaining: 36  Lines: 0
 B   I   N   G   O  
 14 [23][41][52] 65 
  3 [27][31] 53 [74]
 12  20 [FR] 49  68 
 10  17 [36] 59  61 
  6 [18] 37  57 [69]
> 
Turn 40  Called: 56  Remaining: 35  Lines: 0
 B   I   N   G   O  
 14 [23][41][52] 65 
  3 [27][31] 53 [74]
 12  20 [FR] 49  68 
 10  17 [36] 59  61 
  6 [18] 37  57 [69]
> 
Turn 41  Called: 38  Remaining: 34  Lines: 0
 B   I   N   G   O  
 14 [23][41][52] 65 
  3 [27][31] 53 [74]
 12  20 [FR] 49  68 
 10  17 [36] 59  61 
  6 [18] 37  57 [69]
> 
Turn 42  Called: 14  Remaining: 33  Lines: 0
 B   I   N   G   O  
[14][23][41][52] 65 
  3 [27][31] 53 [74]
 12  20 [FR] 49  68 
 10  17 [36] 59  61 
  6 [18] 37  57 [69]
> 
Turn 43  Called: 68  Remaining: 32  Lines: 0
 B   I   N   G   O  
[14][23][41][52] 65 
  3 [27][31] 53 [74]
 12  20 [FR] 49 [68]
 10  17 [36] 59  61 
  6 [18] 37  57 [69]
> 
Turn 44  Called: 32  Remaining: 31  Lines: 0
 B   I   N   G   O  
[14][23][41][52] 65 
  3 [27][31] 53 [74]
 12  20 [FR] 49 [68]
 10  17 [36] 59  61 
  6 [18] 37  57 [69]
> 
Turn 45  Called: 63  Remaining: 30  Lines: 0
 B   I   N   G   O  
[14][23][41][52] 65 
  3 [27][31] 53 [74]
 12  20 [FR] 49 [68]
 10  17 [36] 59  61 
  6 [18] 37  57 [69]
> 
Turn 46  Called: 26  Remaining: 29  Lines: 0
 B   I   N   G   O  
[14][23][41][52] 65 
  3 [27][31] 53 [74]
 12  20 [FR] 49 [68]
 10  17 [36] 59  61 
  6 [18] 37  57 [69]
> 
Turn 47  Called: 3  Remaining: 28  Lines: 0
 B   I   N   G   O  
[14][23][41][52] 65 
[ 3][27][31] 53 [74]
 12  20 [FR] 49 [68]
 10  17 [36] 59  61 
  6 [18] 37  57 [69]
> 
Turn 48  Called: 11  Remaining: 27  Lines: 0
 B   I   N   G   O  
[14][23][41][52] 65 
[ 3][27][31] 53 [74]
 12  20 [FR] 49 [68]
 10  17 [36] 59  61 
  6 [18] 37  57 [69]
> 
Turn 49  Called: 72  Remaining: 26  Lines: 0
 B   I   N   G   O  
[14][23][41][52] 65 
[ 3][27][31] 53 [74]
 12  20 [FR] 49 [68]
 10  17 [36] 59  61 
  6 [18] 37  57 [69]
> 
Turn 50  Called: 66  Remaining: 25  Lines: 0
 B   I   N   G   O  
[14][23][41][52] 65 
[ 3][27][31] 53 [74]
 12  20 [FR] 49 [68]
 10  17 [36] 59  61 
  6 [18] 37  57 [69]
> 
Turn 51  Called: 10  Remaining: 24  Lines: 0
 B   I   N   G   O  
[14][23][41][52] 65 
[ 3][27][31] 53 [74]
 12  20 [FR] 49 [68]
[10] 17 [36] 59  61 
  6 [18] 37  57 [69]
> 
Turn 52  Called: 54  Remaining: 23  Lines: 0
 B   I   N   G   O  
[14][23][41][52] 65 
[ 3][27][31] 53 [74]
 12  20 [FR] 49 [68]
[10] 17 [36] 59  61 
  6 [18] 37  57 [69]
> 
Turn 53  Called: 65  Remaining: 22  Lines: 1
 B   I   N   G   O  
[14][23][41][52][65]
[ 3][27][31] 53 [74]
 12  20 [FR] 49 [68]
[10] 17 [36] 59  61 
  6 [18] 37  57 [69]
BINGO! congrats!所感
仕様からゼロベースでプログラムを作成していくのは難しい。
短期間でパズルを組み立てるように完成まで持っていくスキルが問われている。
今後の課題にしておこう。
コメントを残す