解决密码问题的有效方法
你好,我遇到了这个谜题,它是著名的基于单词和数字的谜题的子集,称为 Cryptarithms。 假设您有一个表达式
S END + MORE = MONEY
现在有趣的部分是,每个字母表代表 0-9 之间的唯一数字。 我想编写一个通用求解器,但最终我为其编写了一个强制解决方案。 有哪位高手帮我解决一下吗?
我认为可以使用谓词逻辑或集合论来解决。 我对寻找基于 C# 或 Python 的解决方案特别感兴趣。 任何人。?
Hi i came across this puzzle which is a subset of famous kind of word and numbers based puzzles called Cryptarithms. Say you have an expression as
S E N D + M O R E = M O N E Y
Now the interesting part there is that, each alphabet is representing a unique digit from 0-9. I wanted to write a generalized solver, but i ended up writing a brute forced solution for it. Any takers as how can i solve it?
I think it can be solved using predicate logic or set theory. And i'm particularly interested in finding C# or Python based solutions. Any one.?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
在 PyCon 2009 上,Raymond Hettinger 谈论了 Python 中的 AI 编程,并讨论了密码学。
整个演讲的视频可以在这里观看,使用Python 2.6解决方案的食谱可以在< a href="http://code.activestate.com/recipes/576615/" rel="nofollow noreferrer">此链接。
At PyCon 2009 Raymond Hettinger talked about AI programing in Python, and covered Cryptarithms.
The video of entire talk can be seen here, and cookbook with Python 2.6 solution can be found at this link.
这是一个很小的问题,暴力解决方案并不是一个坏方法。 假设每个字母必须代表一个唯一的数字(即我们不允许解决方案 S = 9、M = 1、* = 0),我们看到要尝试的组合数量为 n!,其中n 是密码中唯一字母的数量。 理论上要评估的最大组合数为 10! = 3 628 800,这对于计算机来说确实是一个很小的数字。
如果我们允许多个字母代表相同的数字,则尝试的组合数量将受到 10^n 的限制,其中 n 是唯一字母的数量。 假设只有大写英文字母,理论上我们的最大组合数为 10^26,因此对于理论上最坏的情况,我们可能需要一些启发式方法。 不过,大多数实用密码的唯一字母都少于 26 个,因此正常情况下的 n 可能会小于 10,这对于计算机来说也是相当合理的。
This is such a small problem that a brute-force solution is not a bad method. Assuming that each letter must represent a unique digit (i.e. we won't allow the solution S = 9, M = 1, * = 0) we see that number of combinations to try is n!, where n is the number of unique letters in the cryptarithm. The theoretical max number of combinations to evaluate is 10! = 3 628 800, which is really small number for a computer.
If we allow several letters to represent the same number, the number of combinations to try will be bounded by 10^n, again where n is the number of unique letters. Assuming only capital English letters we have a theoretical max number of combinations of 10^26, so for that theoretical worst case we might need some heuristics. Most practical cryptarithms have a lot less than 26 unique letters though, so the normal case will probably be bounded by an n less than 10, which is again pretty reasonable for a computer.
这是一种有效的蛮力方法,它递归地循环所有可能性,但也注意到特定问题的结构以简化问题的解决。
每个方法的前几个参数代表每个分支的试验值,参数 v1、v2 等是尚未分配的值,可以在任何
命令。 该方法非常高效,因为它最多有 8x7x5 种可能的尝试解决方案,而不是暴力破解的 10!/2 种可能解决方案
Here is an efficient brute force method that cycles through all of the possibilities recursively but also takes note of the structure of the particular problem to shortcut the problem.
The first few arguments to each method represent trial values for each branch, the arguments v1, v2 etc are the values yet to be allocated and can be passed in any
order. the method is efficient because it has a maximum of 8x7x5 possible trial solutions rather than the 10!/2 possible solutions by brute force
好吧,尝试将其写为函数列表:
如果我记得我的初中数学,这应该是:
Well, try writing it as a list of functions:
If I remember my lower school math, this should be:
这可能会有所帮助
编辑:您发布的维基链接上的答案也很有用!
this may be of some help
Edit: the answer on the wiki link you posted is also useful!