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 venv
Pythonの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 venv
venvに入って、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 False
main関数の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!")
break
count_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)'}")
continue
historyに値がない場合は、(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!
所感
仕様からゼロベースでプログラムを作成していくのは難しい。
短期間でパズルを組み立てるように完成まで持っていくスキルが問われている。
今後の課題にしておこう。
コメントを残す