著者:関 勝寿
公開日:2016年12月13日
キーワード: game math python

素数判定の問題に答えるターミナルで動くゲームを作った。 「パッと見素数」に気をつけろ!という記事に紹介されている素数大富豪というゲームでは、素数を素早く判定することが要される。 そのための練習用プログラムとして考えたものであるが、素数大富豪とは独立した一人遊びゲームとして成立している。

シルルさん作成の素数大富豪のCPU対戦ゲームもある。

遊び方

Python 3 が必要。こちらからプログラムをダウンロードして、

chmod +x primequiz.py

で実行可能としてから、

./primequiz.py

でプログラムを実行する。

10 questions for primality.
[371, 61, 101, 337, 143, 237, 239, 153, 57, 311]
371 is prime? Type return to show the answer.

のように表示される。371が素数かどうかを聞かれているので、頭の中で答えを出してリターンキーを押すと

Composite. 371 = 7 * 53

のように表示される。「素数だと思ったけど7で割れたか」といったように一人納得するゲームである。

同様に、このように続けられる。

61 is prime? Type return to show the answer. 
Prime!
101 is prime? Type return to show the answer. 
Prime!
337 is prime? Type return to show the answer. 
Prime!
143 is prime? Type return to show the answer. 
Composite. 143 = 11 * 13
237 is prime? Type return to show the answer. 
Composite. 237 = 3 * 79
239 is prime? Type return to show the answer. 
Prime!
153 is prime? Type return to show the answer. 
Composite. 153 = 3 * 3 * 17
57 is prime? Type return to show the answer. 
Composite. 57 = 3 * 19
311 is prime? Type return to show the answer. 
Prime!

ここで、「すぐに分かる数」は

のいずれかを満たす数字である。three 変数を True に設定すると、3の倍数が「すぐに分かる数」とされるため、出題される数字の難易度が全体的に上がる。

現状の設定で慣れてきたら、少しずつ firstlast の数字を上げたり、three=True としたり、obvious リストを追加したりすることで、自分好みの難易度に調整することができる。

正答数を数えたり時間を計ったりすればもう少しゲームっぽくなるが、面倒なのでとりあえずはこんな感じで。お好みで、パスの通っている場所に置いて遊んでください。

出題される数字の一覧

./primequiz.py p

とすることで、出題範囲の素数と合成数の一覧が次のように表示される。

List of primes
[29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397]
List of composite numbers
51 = 3 * 17
57 = 3 * 19
87 = 3 * 29
91 = 7 * 13
111 = 3 * 37
117 = 3 * 3 * 13
119 = 7 * 17
121 = 11 * 11
123 = 3 * 41
129 = 3 * 43
133 = 7 * 19
141 = 3 * 47
143 = 11 * 13
147 = 3 * 7 * 7
153 = 3 * 3 * 17
159 = 3 * 53
161 = 7 * 23
169 = 13 * 13
171 = 3 * 3 * 19
177 = 3 * 59
183 = 3 * 61
187 = 11 * 17
189 = 3 * 3 * 3 * 7
201 = 3 * 67
203 = 7 * 29
207 = 3 * 3 * 23
209 = 11 * 19
213 = 3 * 71
217 = 7 * 31
219 = 3 * 73
221 = 13 * 17
231 = 3 * 7 * 11
237 = 3 * 79
243 = 3 * 3 * 3 * 3 * 3
247 = 13 * 19
249 = 3 * 83
253 = 11 * 23
259 = 7 * 37
261 = 3 * 3 * 29
267 = 3 * 89
273 = 3 * 7 * 13
279 = 3 * 3 * 31
287 = 7 * 41
289 = 17 * 17
291 = 3 * 97
297 = 3 * 3 * 3 * 11
299 = 13 * 23
301 = 7 * 43
319 = 11 * 29
321 = 3 * 107
323 = 17 * 19
327 = 3 * 109
329 = 7 * 47
341 = 11 * 31
343 = 7 * 7 * 7
351 = 3 * 3 * 3 * 13
357 = 3 * 7 * 17
361 = 19 * 19
371 = 7 * 53
377 = 13 * 29
381 = 3 * 127
387 = 3 * 3 * 43
391 = 17 * 23