Harvard CS50P PSET4 Little Professor 程序退出超时问题求助
问题描述
- 完成CS50P Little Professor编程习题时,本地自测代码运行逻辑正常,提交官方自动化校验时触发报错:
:( Little Professor accepts valid level // timed out while waiting for program to exit
- 现有代码已通过全部3项无效难度等级输入的校验,无法定位超时触发原因,原实现代码如下:
def main(): level = get_level() q=1 s=0 while q<=10: try: x = generate_integer(level) y = generate_integer(level) ans = x + y eq = int(input(f'{x} + {y} = ')) if ans == eq: s += 1 pass elif ans != eq: c = 1 while c <= 2: print('EEE') eq = int(input(f'{x} + {y} = ')) if ans == eq: s += 1 break else: c += 1 if c == 3: print('EEE') print(f'{x} + {y} = {ans}') q += 1 except EOFError: pass print(f'Score: {s}') def get_level(): valid_inputs = (1,2,3) while True: try: level = int(input('Level: ')) if level in valid_inputs: return level else: pass except ValueError: pass def generate_integer(level): max = 10**level-1 min = 10**(level-1) if level == 1: min == 0 num = random.randint(min,max) return num main()
根因分析
代码共有3处核心问题,其中异常捕获逻辑缺陷直接导致超时:
- 缺失依赖导入:代码调用
random.randint()生成随机数,但未在开头导入random模块,运行到题目生成环节会直接抛出NameError阻断流程。 - 赋值语法错误:
generate_integer函数中,难度1对应的数字范围应为0-9,代码写为min == 0(双等号是比较运算,不会修改变量值),导致难度1下仅能生成1-9的数字,不符合题目要求。 - 异常捕获导致死循环:主循环捕获
EOFError后直接执行pass,无任何退出逻辑。自动化测试用例跑完所有预设输入后会发送EOF终止信号,此时程序会跳过报错,继续停在循环中等待新的输入,测试端迟迟等不到程序退出,就会触发超时报错。
额外逻辑缺陷:现有代码未处理答题时输入非整数的场景,用户输入非整数内容时会触发ValueError导致程序直接崩溃,不符合题目“非整数输入算答错”的要求。
修正后代码
import random def main(): level = get_level() q = 1 s = 0 while q <= 10: x = generate_integer(level) y = generate_integer(level) ans = x + y wrong_count = 0 correct = False while wrong_count < 3: try: eq = int(input(f'{x} + {y} = ')) if eq == ans: s += 1 correct = True break else: wrong_count += 1 print('EEE') except ValueError: wrong_count += 1 print('EEE') except EOFError: print(f'Score: {s}') return if not correct: print(f'{x} + {y} = {ans}') q += 1 print(f'Score: {s}') def get_level(): valid_inputs = (1,2,3) while True: try: level = int(input('Level: ')) if level in valid_inputs: return level except (ValueError, EOFError): pass def generate_integer(level): max_val = 10**level - 1 min_val = 10**(level-1) if level == 1: min_val = 0 return random.randint(min_val, max_val) if __name__ == "__main__": main()
内容的提问来源于stack exchange,提问作者REL
相关产品推荐
相关产品推荐

