You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CS50P Problem Set4 Little Professor:check50超时错误排查求助

CS50P Problem Set 4 Little Professor:check50超时问题修复

本地运行代码时可正常输入level、验证答案并输出预期响应,但check50执行单元测试时返回timed out while waiting for program to exit错误。原代码如下:

import random

def main():
    num_repeat = 10
    score = 0
    level = get_level()

    while num_repeat > 0:
        x = generate_integer(level)
        y = generate_integer(level)
        guess_remain = 3
        try:
            while guess_remain > 0:
                answer = int(input(f'{x} + {y} = '))
                if answer == x + y:
                    score += 1
                    break
                else:
                    print('EEE')
                    guess_remain -= 1
                    if guess_remain == 0:
                        print(f'{x} + {y} = {x+y}')
                    continue

        except ValueError:
            print('EEE')
            pass
        else:
            num_repeat -= 1

    print(f'Score: {score}')
    return 0


def get_level():
    while True:
        try:
            level = int(input("Level: "))
            if level in [1, 2, 3]:
                break
        except:
            pass
    return level


def generate_integer(digits):
    if digits == 1:
        min_num = 0
    else:
        min_num = 10 ** (digits - 1)
    max_num = (10 ** digits) -1
    rand_num = random.randint(min_num, max_num)
    return rand_num

main()

问题原因

超时的核心是输入非整数触发ValueError时,代码未消耗剩余尝试次数。当测试用例模拟非数字输入时,except块仅打印EEE后直接pass,内部的while guess_remain > 0循环会持续等待输入,check50的自动测试无法处理这种无限等待,最终触发超时。

修复方案

调整错误处理逻辑,确保每次错误输入(无论数字错误还是非整数)都消耗剩余尝试次数,同时保证每完成一题后正确递减num_repeat,避免循环卡住。

修改后的代码:

import random

def main():
    num_repeat = 10
    score = 0
    level = get_level()

    while num_repeat > 0:
        x = generate_integer(level)
        y = generate_integer(level)
        guess_remain = 3
        correct = False
        while guess_remain > 0:
            try:
                answer = int(input(f'{x} + {y} = '))
                if answer == x + y:
                    score += 1
                    correct = True
                    break
                else:
                    print('EEE')
                    guess_remain -= 1
            except ValueError:
                print('EEE')
                guess_remain -= 1
            
            # 尝试次数耗尽时输出正确答案
            if guess_remain == 0:
                print(f'{x} + {y} = {x+y}')
        num_repeat -= 1

    print(f'Score: {score}')
    return 0


def get_level():
    while True:
        try:
            level = int(input("Level: "))
            if level in [1, 2, 3]:
                break
        except ValueError:
            pass
    return level


def generate_integer(digits):
    if digits == 1:
        min_num = 0
    else:
        min_num = 10 ** (digits - 1)
    max_num = (10 ** digits) - 1
    rand_num = random.randint(min_num, max_num)
    return rand_num

main()

关键修改点

  • 将try-except移到内部循环的单次输入操作中,确保每次错误输入都正确减少guess_remain
  • 移除外层try-except-else结构,改为无论答题结果如何,每完成一题都递减num_repeat
  • 统一数字错误和非整数错误的尝试次数消耗逻辑,彻底避免无限循环

内容的提问来源于stack exchange,提问作者Ahadul Islam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 23:01:22