【问题标题】:how to find cryptarithmetic letter value?如何找到密码字母值?
【发布时间】:2023-03-20 05:30:01
【问题描述】:

十字路口 + 道路 = 危险 ==> 答案是 ==> 96233 + 62513=158746

我正在寻找一个说明,以便更容易地找到另一个示例的答案。我的一位老师说我们可以用树来找到它。但有时使用树来找到答案是不可能的。

你通常如何找到你的密码解决方案?

【问题讨论】:

标签: math wolfram-mathematica cryptarithmetic-puzzle


【解决方案1】:

一种简单的方法:

定义变量(只是为了方便):

vars = Symbol[#] & /@ ("abc" <> ToString[#] & /@ Range[26]) ;

将变量与字母表中的每个字母关联:

alphabet = Transpose[{CharacterRange["a", "z"], vars}];

编写一个辅助函数将字符串转换为表达式:

formDigits[astring_] := FromDigits[alphabet[[alphabet[[#, 2]] & /@ 
   Position[alphabet[[All, 1]], #][[1, 1]] & /@ Characters[astring], 2]]]

例子:

formDigits["cross"]
(* abc19 + 10 (abc19 + 10 (abc15 + 10 (abc18 + 10 abc3))) *)

写出对应于“十字路口+道路=危险”的方程组:

equation = formDigits["cross"] + formDigits["roads"] == formDigits["danger"]

最终解决带有明显附加约束的系统:

sol = First@FindInstance[{equation, Sequence @@ Thread[Thread[0 <= vars <= 9]], 
    Not[Apply[And, Thread[vars == 0]]]}, alphabet[[All, 2]], Integers] ;

检查:

formDigits["cross"] /. sol
formDigits["roads"] /. sol
formDigits["danger"] /. sol
(* 78644
   86614
  165258 *)

【讨论】:

  • 是的,+1。但可能是Mathematica标签被误用了
  • 所以,如果是为了好玩:您并不要求每个字母代表不同的数字。这是故意的吗? :)
  • 顺便说一句,要求每个字母使用不同值的蛮力方法无法在合理的时间内完成此问题。代码在这里NotebookPut@ImportString[Uncompress@FromCharacterCode@Flatten@ImageData[Import@ "http://i.stack.imgur.com/sOrph.png","Byte"],"NB"]
【解决方案2】:

这在 Prolog 中自然得到解决。另见Faster implementation of verbal arithmetic in Prolog

%% unique selection from narrowing domain
selectM([A|As],S,Z):- select(A,S,S1),selectM(As,S1,Z).
selectM([],Z,Z).

%% a puzzle
cryp([[C,R,O,S,S]+[R,O,A,D,S]=[D,A,N,G,E,R]]):- 
   Dom=[0,1,2,3,4,5,6,7,8,9],
   selectM([S],Dom,D0), 
   N1 is S+S,          R is N1 mod 10, R=\=0, 
   selectM([R,D],D0,D1),               D=\=0,
   N2 is (N1//10)+S+D, E is N2 mod 10,
   selectM([E,O,A,G],D1,D2),
   N3 is (N2//10)+O+A, G is N3 mod 10,
   N4 is (N3//10)+R+O, N is N4 mod 10,
   selectM([N,C],D2,_), C=\=0, 
   N5 is (N4//10)+C+R, A is N5 mod 10,
   D  is  N5//10.

效率的关键是逐个选择数字的实例化,立即测试以尽快废弃无效的选择。我确信这可以翻译成 Mathematica。

【讨论】:

    【解决方案3】:

    另一个像这个总和的问题是

     CROSS + ROADS = DENGER 

    这个问题的解决方法是

     68244 + 82714 = 150958 

    【讨论】:

    • 那么你在这里的意义何在?它已经在问题中给出了
    猜你喜欢
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    • 2011-02-07
    • 1970-01-01
    • 2021-03-11
    • 2015-12-19
    • 1970-01-01
    相关资源
    最近更新 更多