用Python刷PAT乙级:手把手带你用20行代码搞定‘锤子剪刀布’和‘数字黑洞’

张开发
2026/4/19 20:06:23 15 分钟阅读

分享文章

用Python刷PAT乙级:手把手带你用20行代码搞定‘锤子剪刀布’和‘数字黑洞’
Python实战PAT乙级20行代码玩转锤子剪刀布与数字黑洞每次看到算法题里那些看似复杂但实则精巧的小游戏类题目总忍不住想用Python的简洁特性来降维打击。今天我们就拿PAT乙级中两道经典趣味题——1018锤子剪刀布和1019数字黑洞开刀看看如何用不到20行的Python代码优雅解决。这两道题在考场上常让考生纠结于边界条件但掌握了Python的几项核心技巧后你会发现它们简直是展示语言特性的绝佳案例。1. 锤子剪刀布字典与生成式的妙用先看1018题题目要求统计甲乙两人在N轮猜拳中的胜负并输出各自获胜次数最多的手势。传统解法可能需要大量if-else判断但Python的字典和列表生成式能让代码瞬间精简def game(): n int(input()) win_a {B:0, C:0, J:0} win_b {B:0, C:0, J:0} for _ in range(n): a, b input().split() if (aBand bC) or (aCand bJ) or (aJand bB): win_a[a] 1 elif a ! b: win_b[b] 1 max_a max(win_a.items(), keylambda x:(x[1], -ord(x[0]))) max_b max(win_b.items(), keylambda x:(x[1], -ord(x[0]))) print(sum(win_a.values()), n-sum(win_a.values())-sum(win_b.values()), sum(win_b.values())) print(sum(win_b.values()), n-sum(win_a.values())-sum(win_b.values()), sum(win_a.values())) print(max_a[0], max_b[0])关键技巧解析使用字典统计每种手势的获胜次数避免多重条件判断max()函数配合lambda表达式处理次数相同时按字母序输出的要求胜负判断采用直观的逻辑表达式组合注意测试用例中存在平局轮次计算胜负总数时需要用总轮次减去胜败次数之和2. 数字黑洞字符串与算术的魔法1019题要求对任意四位数字不足补零重复执行特定运算直到得到6174。这个数字黑洞现象用Python实现异常简洁def kaprekar(): n input().zfill(4) while True: asc .join(sorted(n)) desc asc[::-1] if asc desc: print(f{desc} - {asc} 0000) break diff str(int(desc) - int(asc)).zfill(4) print(f{desc} - {asc} {diff}) if diff 6174: break n diff精妙之处zfill(4)自动处理不足四位的输入字符串排序和反转替代数字位操作直接使用字符串比较判断终止条件3. 双题对比Python特性实战分析将两道题的解法并列对比能清晰看出Python在不同场景下的优势特性锤子剪刀布应用场景数字黑洞应用场景字符串处理直接比较字符手势zfill补位、排序反转字典运用统计各手势获胜次数-列表生成式统计结果输出数字位处理函数式编程max配合lambda处理并列情况sorted处理数字位类型转换胜负次数统计字符串与数字的灵活转换两道题虽然领域不同但都充分利用了Python的几项核心能力极简的输入处理直接拆解输入行灵活的字符串操作排序、切片、格式化高效的数据结构字典统计、列表生成4. 进阶优化与边界处理在实际编码中我们还需要考虑一些特殊情况锤子剪刀布的优化空间# 使用collections.Counter可以进一步简化统计 from collections import Counter win_a Counter() win_b Counter() # 胜负判断可改为预定义规则 rules {B:C, C:J, J:B} if b rules[a]: win_a[a] 1 elif a rules[b]: win_b[b] 1数字黑洞的鲁棒性增强# 增加输入校验 while True: n input().strip() if n.isdigit() and 0 int(n) 10000: break print(请输入有效四位正整数)两道题看似简单但想要在保证代码简洁的同时处理所有边界条件需要对这些Python特性有深刻理解。比如数字黑洞中输入为6174时的特殊处理各位数字相同的情况中间运算结果不足四位需要补零5. 从题目到实战的思维转换当我在实际教学中使用这两个案例时发现初学者最容易陷入的误区是过度使用过程式编程思维。比如用多个变量分别存储布、剪刀、石的获胜次数或者用数学运算提取数字的每一位。而Pythonic的解法告诉我们选择合适的数据结构往往能减少一半代码量利用内置函数替代手动实现常见操作字符串与数字的灵活转换可以简化位操作标准库中的工具如collections是解决问题的瑞士军刀在准备PAT等编程考试时建议特别关注那些能展现语言特性的标志性题目。就像这两道题20行代码的解决方案不仅高效更是对Python哲学的最佳诠释——简单问题就应该用简单的方法解决。

更多文章