#!/usr/bin/env python3
import os, sys
from time import sleep
from random import randint
message = {True: '正', False: '誤'}
# Environment
class Env(object):
def __init__(self, flag, digits, num, seconds, lst):
self.flag = flag # 入力フェーズと回答の正誤を示すフラグ
self.digits = digits # 桁数
self.num = num # 計算する数値の個数
self.seconds = seconds # 表示秒数
self.lst = lst # 数値格納用リスト
# デバッグ用
def __repr__(self):
return f'<flag: {self.flag}, digits: {self.digits}, num: {self.num}, seconds: {self.seconds}, lst: {self.lst}>'
# Read
def read(env):
if len(env.lst) == env.num:
return int(input('>>> '))
elif isinstance(env.flag, bool): # フラッシュ暗算ソフト終了の為の入力
return input('quit?[y/n]): ')
else:
return ""
# Eval
def engine(x, env):
# 入力が「フラッシュ暗算ソフト」を止める場合
if isinstance(env.flag, bool) and x.lower() == 'y':
sys.exit()
else:
return Env(x == sum(env.lst) if len(env.lst) == env.num
else None if isinstance(env.flag, bool) and env.lst == []
else env.flag,
env.digits, env.num, env.seconds,
[] if len(env.lst) == env.num
else [randint(10 ** (env.digits - 1), 10 ** env.digits - 1)]
+ env.lst)
# Print
def display(env):
if env.flag != None:
print(message[env.flag])
else:
os.system('clear') # MS-DOS/Windows では clear の代わりに cls コマンド
print(env.lst[0])
sleep(env.seconds)
# デバッグ用
# print(env)
return env
if __name__ == '__main__':
try:
env = Env(None,
int(input('桁数 >> ')),
int(input('個数 >> ')),
int(input('秒数 >> ')),
[])
except ValueError:
sys.exit()
while True:
try:
env = display(engine(read(env), env))
except ValueError:
env
IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwoKaW1wb3J0IG9zLCBzeXMKZnJvbSB0aW1lIGltcG9ydCBzbGVlcApmcm9tIHJhbmRvbSBpbXBvcnQgcmFuZGludAoKbWVzc2FnZSA9IHtUcnVlOiAn5q2jJywgRmFsc2U6ICfoqqQnfQoKIyBFbnZpcm9ubWVudApjbGFzcyBFbnYob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmbGFnLCBkaWdpdHMsIG51bSwgc2Vjb25kcywgbHN0KToKICAgICAgICBzZWxmLmZsYWcgPSBmbGFnICAgICAgICMg5YWl5Yqb44OV44Kn44O844K644Go5Zue562U44Gu5q2j6Kqk44KS56S644GZ44OV44Op44KwCiAgICAgICAgc2VsZi5kaWdpdHMgPSBkaWdpdHMgICAjIOahgeaVsAogICAgICAgIHNlbGYubnVtID0gbnVtICAgICAgICAgIyDoqIjnrpfjgZnjgovmlbDlgKTjga7lgIvmlbAKICAgICAgICBzZWxmLnNlY29uZHMgPSBzZWNvbmRzICMg6KGo56S656eS5pWwCiAgICAgICAgc2VsZi5sc3QgPSBsc3QgICAgICAgICAjIOaVsOWApOagvOe0jeeUqOODquOCueODiAogICAgIyDjg4fjg5Djg4PjgrDnlKgKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gZic8ZmxhZzoge3NlbGYuZmxhZ30sIGRpZ2l0czoge3NlbGYuZGlnaXRzfSwgbnVtOiB7c2VsZi5udW19LCBzZWNvbmRzOiB7c2VsZi5zZWNvbmRzfSwgbHN0OiB7c2VsZi5sc3R9PicKCiMgUmVhZApkZWYgcmVhZChlbnYpOgogICAgaWYgbGVuKGVudi5sc3QpID09IGVudi5udW06CiAgICAgICAgcmV0dXJuIGludChpbnB1dCgnPj4+ICcpKQogICAgZWxpZiBpc2luc3RhbmNlKGVudi5mbGFnLCBib29sKTogIyDjg5Xjg6njg4Pjgrfjg6Xmmpfnrpfjgr3jg5Xjg4jntYLkuobjga7ngrrjga7lhaXlipsKICAgICAgICByZXR1cm4gaW5wdXQoJ3F1aXQ/W3kvbl0pOiAnKQogICAgZWxzZToKICAgICAgICByZXR1cm4gIiIKICAgIAojIEV2YWwKZGVmIGVuZ2luZSh4LCBlbnYpOgogICAgIyDlhaXlipvjgYzjgIzjg5Xjg6njg4Pjgrfjg6Xmmpfnrpfjgr3jg5Xjg4jjgI3jgpLmraLjgoHjgovloLTlkIgKICAgIGlmIGlzaW5zdGFuY2UoZW52LmZsYWcsIGJvb2wpIGFuZCB4Lmxvd2VyKCkgPT0gJ3knOgogICAgICAgIHN5cy5leGl0KCkKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIEVudih4ID09IHN1bShlbnYubHN0KSBpZiBsZW4oZW52LmxzdCkgPT0gZW52Lm51bQogICAgICAgICAgICAgICAgICAgZWxzZSBOb25lIGlmIGlzaW5zdGFuY2UoZW52LmZsYWcsIGJvb2wpIGFuZCBlbnYubHN0ID09IFtdCiAgICAgICAgICAgICAgICAgICBlbHNlIGVudi5mbGFnLAogICAgICAgICAgICAgICAgICAgZW52LmRpZ2l0cywgZW52Lm51bSwgZW52LnNlY29uZHMsCiAgICAgICAgICAgICAgICAgICBbXSBpZiBsZW4oZW52LmxzdCkgPT0gZW52Lm51bQogICAgICAgICAgICAgICAgICAgZWxzZSBbcmFuZGludCgxMCAqKiAoZW52LmRpZ2l0cyAtIDEpLCAxMCAqKiBlbnYuZGlnaXRzIC0gMSldCiAgICAgICAgICAgICAgICAgICArIGVudi5sc3QpCgojIFByaW50CmRlZiBkaXNwbGF5KGVudik6CiAgICBpZiBlbnYuZmxhZyAhPSBOb25lOgogICAgICAgIHByaW50KG1lc3NhZ2VbZW52LmZsYWddKQogICAgZWxzZToKICAgICAgICBvcy5zeXN0ZW0oJ2NsZWFyJykgIyBNUy1ET1MvV2luZG93cyDjgafjga8gY2xlYXIg44Gu5Luj44KP44KK44GrIGNscyDjgrPjg57jg7Pjg4kKICAgICAgICBwcmludChlbnYubHN0WzBdKQogICAgICAgIHNsZWVwKGVudi5zZWNvbmRzKQogICAgIyDjg4fjg5Djg4PjgrDnlKgKICAgICMgcHJpbnQoZW52KQogICAgcmV0dXJuIGVudgoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIHRyeToKICAgICAgICBlbnYgPSBFbnYoTm9uZSwKICAgICAgICAgICAgICAgICAgaW50KGlucHV0KCfmoYHmlbAgPj4gJykpLAogICAgICAgICAgICAgICAgICBpbnQoaW5wdXQoJ+WAi+aVsCA+PiAnKSksCiAgICAgICAgICAgICAgICAgIGludChpbnB1dCgn56eS5pWwID4+ICcpKSwKICAgICAgICAgICAgICAgICAgW10pCiAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICBzeXMuZXhpdCgpCiAgICB3aGlsZSBUcnVlOgogICAgICAgIHRyeToKICAgICAgICAgICAgZW52ID0gZGlzcGxheShlbmdpbmUocmVhZChlbnYpLCBlbnYpKQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICBlbnYK