基于Python的无重复数字三位数比对功能优化方案咨询
实现无重复数字三位数的猜数比对功能
需求说明
- 用
random模块生成各位数字不重复的三位数 - 用户输入一个同样满足「各位数字不重复」的三位数
- 比对规则:
- 若某一数字在两个数中的位置完全相同,输出一个
+ - 若某一数字在两个数中都存在但位置不同,输出一个
-
- 若某一数字在两个数中的位置完全相同,输出一个
- 示例:随机数为
579,输入为591→ 输出+-(数字5位置相同,数字9存在但位置不同)
原代码存在的问题
- 随机数生成逻辑混乱:一开始生成的
a、b、c仅做了一次重复校验,进入循环后又重新随机生成x、y、z,这部分与用户输入的逻辑完全冲突,x、y、z应该是对用户输入的数字拆分,而非随机生成 - 用户输入处理错误:用
input()的结果直接覆盖了之前的estimate变量,没有对输入的三位数进行拆分和合法性校验(比如是否是三位数、数字是否重复) - 比对逻辑漏洞多:用零散的
if/elif判断无法完整统计所有符合条件的+和-,存在重复判断、遗漏场景的问题
优化实现方案
实现思路
- 生成合法随机数:通过打乱0-9的数字列表,确保百位不为0,取前三位即可得到无重复数字的三位数
- 校验用户输入:检查输入是否为三位数、是否全为数字、是否存在重复数字
- 高效比对逻辑:
- 先逐个位置对比,统计位置相同的数字数量(即
+的数量) - 用集合求两个数字的交集,得到共同数字的总数,减去位置相同的数量就是
-的数量 - 最后按数量拼接
+和-输出结果
- 先逐个位置对比,统计位置相同的数字数量(即
完整代码
import random def generate_unique_three_digit(): # 生成无重复数字的三位数 digits = list(range(10)) random.shuffle(digits) # 确保百位不为0 if digits[0] == 0: # 交换第一个非0数字到百位 for i in range(1, 10): if digits[i] != 0: digits[0], digits[i] = digits[i], digits[0] break return digits[:3] def validate_input(user_input): # 校验输入是否是各位不重复的三位数 if len(user_input) != 3 or not user_input.isdigit(): return False return len(set(user_input)) == 3 # 生成目标三位数 target = generate_unique_three_digit() print("已生成一个无重复数字的三位数,请开始猜测!") while True: guess_str = input("请输入一个无重复数字的三位数:") if not validate_input(guess_str): print("输入无效,请输入各位数字不重复的三位数!") continue guess = [int(c) for c in guess_str] # 统计位置相同的+数量 plus_count = sum(1 for t, g in zip(target, guess) if t == g) # 统计数字存在但位置不同的-数量 common_digits = set(target) & set(guess) minus_count = len(common_digits) - plus_count # 输出结果 result = "+" * plus_count + "-" * minus_count print(f"结果:{result}") # 猜对则结束游戏 if plus_count == 3: print("恭喜你猜对了!") break
代码说明
generate_unique_three_digit():通过随机打乱数字列表的方式,高效生成无重复的三位数,同时保证百位不为0validate_input():简洁校验输入的合法性,避免无效输入干扰游戏流程- 比对逻辑:用
zip逐个位置对比统计+,用集合交集快速获取共同数字,再计算-的数量,逻辑清晰且无遗漏
内容的提问来源于stack exchange,提问作者Betül
相关产品推荐
相关产品推荐

