实现4位PIN码与单词数组双向编解码,适配寻宝/密室逃脱游戏场景
方案1:顺序相关实现(零复杂度,快速落地)
你之前尝试的索引遍历方案只需要补一层反向映射即可跑通,逻辑如下:
- 提前准备固定的总单词表,长度建议选10的整数倍(比如1000个词完全够用),每个单词对应唯一的索引值
编码逻辑(输入4位PIN→输出4个单词)
把4位PIN拆成4个独立数字d1 d2 d3 d4(比如8370拆为[8,3,7,0]),对每个位置的数字di,从单词表里取索引 = di * 100 + 自定义场次偏移量的单词即可,场次偏移量可以每换一批谜题就修改一次,完全灵活自定义。
解码逻辑(输入4个单词→输出4位PIN)
提前构建哈希表存储单词→对应数字的反向映射,输入单词后直接查表得到4个数字,拼接就是最终PIN。你之前解码卡壳就是缺了这层反向映射,几行代码就能实现。
方案2:顺序无关实现(满足理想需求)
逻辑同样简单,不需要复杂算法:
- 提前给所有备选秘密单词各分配一个唯一的随机整数(范围随便选,比如0~99999即可),存储正反映射表:
单词→随机数、随机数→单词
编码逻辑(输入4位PIN→输出4个单词)
- 从单词库中选4个单词,要求这4个单词对应的随机数相加后,
总和 % 10000等于输入的PIN值 - 把生成的PIN和对应4个单词的映射提前存好,每场游戏直接调用即可
解码逻辑(输入4个单词→输出PIN)
- 查表得到每个输入单词对应的随机数,把四个数加总
- 计算总和对10000取模的结果,就是输出的4位PIN,天然无视输入顺序
这个方案完全匹配你给出的示例效果,不管单词输入顺序怎么换,求和结果一致,得到的PIN自然相同。
可用参考思路
- BIP39助记词算法:加密货币领域常用的随机数转单词方案,原生支持双向转换,你可以直接裁剪它的映射逻辑使用,不用管密码学相关的安全部分,它自带2048个固定单词的映射表,刚好满足需求
- 极简哈希方案:如果不想提前建映射表,直接对每个单词计算ASCII编码和,或者用编程语言内置的哈希方法,求和取模即可,连提前存储单词映射的步骤都能省,游戏场景下极低概率的碰撞完全可以忽略。
极简实现代码示例(JS,顺序无关)
// 提前配置的单词-随机数映射,每场游戏可自定义修改 const wordMap = { "danger": 1234, "writer": 5678, "negative": 9012, "origin": 3456, // 其余单词按格式补充即可 } // 解码功能 function decode(words) { const sum = words.reduce((acc, word) => acc + (wordMap[word] || 0), 0) return sum % 10000 } // 编码功能 function encode(pin) { // 提前存储PIN和对应4个单词的映射,直接返回即可 const pinMap = { 8370: ["danger", "writer", "negative", "origin"], 2455: ["party", "fish", "cookie", "cactus"] } return pinMap[pin] || [] }
内容的提问来源于stack exchange,提问作者Victor
相关产品推荐
相关产品推荐

