fork download
  1. #!/usr/bin/env python3
  2.  
  3. from itertools import permutations
  4. from random import choice
  5. import os, subprocess, sys
  6.  
  7. # カウンター最大値
  8. max_count = 8
  9.  
  10. # データ
  11. data = [''.join(i) for i in permutations('0123456789', 4)]
  12.  
  13. # メッセージ
  14. msg = {'at': 'Please input \'Yes\' or \'No\'.',
  15. 'bc': '{} bull{} and {} cow{}.',
  16. 'i': 'Input: ',
  17. 'l': 'Haha, you lose. It is {}.',
  18. 'n': 'New Game?',
  19. 'p': 's',
  20. 's': '',
  21. 'v': 'Please input a 4-digit defferent number.',
  22. 'w': 'You win! 😊'}
  23.  
  24. # 情報
  25. class Info(object):
  26. def __init__(self, guess, result):
  27. self.guess = guess
  28. self.result = result
  29. def __repr__(self):
  30. return f'Guess: {self.guess} Result: {self.result}'
  31.  
  32. # 環境
  33. class Env(object):
  34. def __init__(self, answer, flag, tries):
  35. self.answer = answer
  36. self.flag = flag
  37. self.tries = tries
  38. def __repr__(self):
  39. return f'Answer: {self.answer}, Flag: {self.flag}, Tries: {self.tries}'
  40.  
  41. # 初期化
  42. def init():
  43. return Env(choice(data), False, [])
  44.  
  45. # ゲーム終了条件
  46. def is_gameover(x, env):
  47. return x == env.answer or len(env.tries) + 1 == max_count
  48.  
  49. # 判定関数
  50. def judge(x, env):
  51. bc = sum([env.answer.count(i) for i in x])
  52. bull = sum([1 if i[0] == i[1] else 0 for i in zip(x, env.answer)])
  53. return bull, bc - bull
  54.  
  55. # Read
  56. def read(env):
  57. x = input(msg['n' if env.flag else 'i'])[:4]
  58. if env.flag or (x.isdigit() and len(x) == 4 and x in data and x not in
  59. [i.guess for i in env.tries]):
  60. return x
  61. else:
  62. raise ValueError
  63.  
  64.  
  65. # Eval
  66. def interp(x, env):
  67. if env.flag:
  68. x = x[0].lower()
  69. if x == 'y':
  70. return init()
  71. elif x == 'n':
  72. sys.exit()
  73. else:
  74. bull, cow = judge(x, env) # アンパック
  75. return Env(env.answer,
  76. is_gameover(x, env), # ゲーム終了条件を満たすか調べる
  77. env.tries +
  78. [Info(x, msg['bc'].format(bull,
  79. # 単数か複数か
  80. msg['p' if bull > 1 else 's'],
  81. cow,
  82. # 単数か複数か
  83. msg['p' if cow > 1 else's']))])
  84.  
  85. # Print
  86. def display(env):
  87. subprocess.run('cls'if os.name == 'nt' else 'clear')
  88. # print(env) デバッグ用
  89. [print(f'{i} {j}') for i, j in enumerate(env.tries, 1)]
  90. if env.flag:
  91. print(msg['w'] if env.answer == env.tries[-1].guess else
  92. msg['l'].format(env.answer))
  93. return env
  94.  
  95. # REPL
  96. if __name__ == '__main__':
  97. env = init()
  98. subprocess.run('cls'if os.name == 'nt' else 'clear')
  99. while True:
  100. try:
  101. env = display(interp(read(env), env))
  102. except AttributeError:
  103. print(msg['at'])
  104. except ValueError:
  105. print(msg['v'])
  106.  
Runtime error #stdin #stdout #stderr 0.17s 26076KB
stdin
Standard input is empty
stdout
Input: 
stderr
TERM environment variable not set.
Traceback (most recent call last):
  File "./prog.py", line 101, in <module>
  File "./prog.py", line 57, in read
EOFError: EOF when reading a line