跳至主要内容
← 返回博客

如何精通哈希游戏

核心要点:哈希游戏隐藏了一条转换规则,你通过向函数输入测试值并观察输出来推导它。每轮最多可测试十次;使用的测试越少,分数越高。制胜策略是假设驱动测试·设计能区分竞争假设的输入,而非向函数随机投入字符串。

什么是哈希游戏

一个隐藏函数将你的输入转换为输出。你看不到代码,只能观察行为。输入一个字符串,观察返回什么,从规律推断规则。

三个难度级别控制规则的复杂程度。简单模式使用线性位移·将每个字母前移相同量的凯撒密码,或简单的镜像,或加倍。中等模式使用条件规则·“元音前进到下一个元音,辅音保持不变”或”大写字母反转,小写字母不变”。困难模式使用位置或算术规则·转换取决于字符在字符串中的位置,或字母位置的数学运算。

每轮游戏以种子作为键值,同一谜题可重玩或分享。分数取决于使用了多少次测试。游戏奖励效率,不奖励运气。

难度概述:简单·统一规则,对每个字符同等应用。中等·条件规则,根据字符类型分支(元音与辅音,大写与小写)。困难·位置规则,转换取决于字符的索引,或算术规则,取决于整个输入中的计数或总和。

HashOpen game →
Loading…

核心方法:假设驱动测试

朴素策略是向函数投入随机字符串并寻找规律。这样使用测试效率低下,并且经常留下模糊的信息。

高效策略与科学家和程序员使用的相同:形成具体假设,设计能区分该假设与其他假设的测试,观察结果,更新你的模型。

在每次测试之前,知道如果你当前的假设正确会期待什么结果,以及不同的输出会告诉你什么。测试后检查:输出是否与预测相符?如果是,对假设的信心增加。如果不是,哪些假设在新数据面前仍能存活?

技巧:每轮都以基线测试开始。在形成强假设之前,先输入”AAAA”或”ABCD”。“AAAA”告诉你所有字符是否以相同方式转换。“ABCD”告诉你转换是否与位置相关(如果 A 变为 B,B 变为 C,那是统一位移;如果 A 变为 B,B 变为 D,C 变为 F,那么增量在增长)。

六种测试策略

策略 1 - 测试统一性。 输入”AAAA”。如果输出是”BBBB”或”ZZZZ”或某个重复字符,规则可能对每个字符同等应用。如果输出是混合的·比如”BCDE”·规则与位置相关。

策略 2 - 测试字符类型敏感性。 分别输入”AEIOU”(仅元音)和”BCDFG”(仅辅音)。如果它们的转换方式不同,规则对字符类型有条件。如果相同,类型不重要。

策略 3 - 测试大小写敏感性。 输入”AAAaaa”。如果大写和小写转换方式不同,大小写是规则的一部分。如果相同,则不是。

策略 4 - 测试位置依赖性。 输入”ABCDE”。如果输出是简单的统一位移(每个字母前进相同量),规则是全局的。如果不同位置产生不同转换,规则是位置相关的。

策略 5 - 确定参数。 一旦确定了规则类型(统一位移、类型条件、位置),用剩余测试找到确切参数。对于统一位移,测试”A”·如果变为”N”,位移为 +13(即 ROT-13)。你现在知道了规则。

策略 6 - 测试边界情况。 Z 会发生什么?它会回绕到 A,还是会出现意外情况?一旦有了涉及字母位移的主导假设,输入一次”ZZZ”。边界情况通常揭示规则是使用模运算还是有硬性限制。

二分搜索位移值。如果你已确认统一位移并需要找到位移量:测试”A”。输出字母直接告诉你位移·如果”A”变为”D”,位移为 +3。无需测试 B、C 或任何其他字母。一次测试就能完全确定参数。

每次只隔离一个变量。如果你测试”AEIOUAEIOU”,你同时改变了字符类型和输入长度。你无法判断是哪个变量导致了输出的任何差异。每次测试只改变一件事。这种纪律是两步解法和七步解法的差别所在。

按难度的策略

简单模式: 从”AAAA”开始。如果输出是”BBBB”,位移为 +1·用”CCCC”确认,然后猜测。如果输出是”AAAA”的镜像,你已经用一次测试找到了规则。两次精心选择的测试就能在简单模式下给你高度信心。

中等模式: 排除统一性(或确认)后,分别测试元音与辅音,然后测试大写与小写。中等函数通常有一或两个条件分支。一旦确定了哪些字符类型分支方式不同,再用一次测试确认每个分支上的确切转换通常就足够了。

困难模式: 从”ABCDEFGH”开始,以暴露位置依赖性。如果不同位置转换方式不同,映射规律:每个位置是否加上其自身的索引(位置 0 加 0,位置 1 加 1,位置 2 加 2)?还是有固定的交替规则(偶数位置 +1,奇数位置 -1)?使用受控输入的测试·比较”AAAA”和”AAAB”·以将位置效应与字符值效应隔离。

技巧:在心里保存每次测试和输出的运行日志。每次测试后,写一行总结:“AAAA 输出 BBBB·建议统一 +1 位移。“当你看到完整历史而非仅看最近一次测试时,假设变得更清晰。

HashOpen game →
Loading…

常见错误

注意·随机测试:以”QWERTY”或”HELLO”作为第一次输入确实能给你信息,但效率不高。没有明确假设,你无法解读输出。每次测试都应该回答一个具体问题:“字符类型重要吗?""位移是统一的吗?“设计输入来回答问题,而不是为了产生有趣的输出。

注意·过早下结论:如果你的第一次测试建议了简单的 +1 位移,不要立即猜测。中等和困难函数在第一次测试时往往看起来简单,但有隐藏的条件。用不同的字符类型再测试一次,然后再猜测。两次确认测试几乎总是足够的;一次测试后就猜通常为时过早。

确信后过度测试。 经过三次精心设计的测试,你可能已将规则空间缩小到单一假设。现在猜测比消耗剩余测试以达到绝对确定性更有效率。如果三次测试后你有 90% 的把握,就猜。使用更少测试的分数优势是真实的。

不知道预期结果就进行测试。 如果你无法预测测试在当前假设下会产生什么,那测试设计就不好。重新设计,直到你能说:“如果假设 A 正确,我期待 X;如果假设 B 正确,我期待 Y。“

自适应假设细化。每次测试后,写下你更新后的可信假设列表,并排除输出所推翻的假设。设计下一个测试来区分剩余候选假设。这种迭代缩减·形成假设、测试、排除、重复·是在简单模式 2-3 次测试内和困难模式 6-7 次测试内解决问题的方法。

练习常规

从简单模式开始以建立测试思维。争取每道谜题在三次测试以内破解。每轮结束后,问问自己:“我能用更少的测试获得同样的信息吗?理想的第一次测试会是什么?“这种反思比多玩一轮更有价值。

转向中等模式,当你持续在三次测试内破解简单模式时。中等模式引入条件逻辑。你的目标是在一两次精准测试中干净地隔离字符类型,然后确认分支行为。五到六次测试是个好目标。

挑战困难模式,当中等模式感觉有条理时。困难模式需要思考位置和算术。如果需要,把位置规律明确写在纸上。七到八次测试是合理的;六次是优秀的。

分享种子与他人比较策略。“我四次测试就解出来了·你怎么用三次做到的?“这是学习你未曾考虑过的新区分性测试设计的最快方式。

技巧:每轮结束后,问自己一个问题:“哪次测试给了我最多信息?“找出它能强化设计高信息量实验的习惯。随着时间推移,你会自然地将那些高价值测试放在前面,并压低测试次数。

效率目标:简单模式 2-3 次测试,中等 5-6 次,困难 7-8 次。持续达到这些数字意味着假设驱动的思维模式正在发挥作用。分数与测试次数成反比,因此这些效率目标也是高分的途径。

为什么这项技能能迁移

哈希游戏训练的认识论习惯,正是程序员有效调试、科学家有效设计实验、产品团队有效进行用户研究所需要的。你无法直接看到系统,只能观察其输出并推断其结构。设计有区分度的测试而非随机测试的纪律,以及在每次观察后更新假设而非锚定第一个结果的习惯,正是能够迁移的技能。

十次测试预算映射了现实约束:资源有限,所以效率很重要。种子系统映射了可重现性:好的实验是他人能够重复的。玩哈希游戏不仅仅是为了高分,也是为了建立”我的测试能区分哪些假设?“这种在行动前提问的习惯。

MemPi
下次乘机时玩 · 可离线运行
将 PlayMemorize 添加到主屏幕
在 Safari 中,点击 分享 ,然后选择 "添加到主屏幕"