【发布时间】:2016-09-05 06:24:15
【问题描述】:
ONE +
ONE +
TWO =
______
FOUR
任何人都可以逐步解决这个密码算法吗 谢谢
【问题讨论】:
-
你的问题很有趣,但你至少应该尝试一些自己的问题。
标签: artificial-intelligence cryptarithmetic-puzzle
ONE +
ONE +
TWO =
______
FOUR
任何人都可以逐步解决这个密码算法吗 谢谢
【问题讨论】:
标签: artificial-intelligence cryptarithmetic-puzzle
Prolog 可以做到! (毕竟这是 Stackoverflow 并且你已经标记了你的问题artificial-intelligence)
solution(O, N, E, T, W, F, U, R) :-
/* All different */
select(O, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], L1),
select(N, L1, L2),
select(E, L2, L3),
select(T, L3, L4),
select(W, L4, L5),
select(F, L5, L6),
select(U, L6, L7),
member(R, L7),
/* Constraints */
FOUR is F * 1000 + O * 100 + U * 10 + R,
ONE is O * 100 + N * 10 + E,
TWO is T * 100 + W * 10 + O,
FOUR is ONE + ONE + TWO.
总体思路是先选择所有变量,然后检查拼图条件。
现在
?- solution(O,N,E,T,W,F,U,R).
将打印找到的第一个解决方案。与:
?- aggregate_all(count, (solution(O,N,E,T,W,F,U,R)), Count).
您可以看到有173 不同的解决方案。
通过跟踪查询的执行,您可以按顺序查看作为查询的一部分执行的所有目标,以及它们是否成功(它还允许您查看 Prolog 回溯时发生的步骤) :
?- trace, solution(O,N,E,T,W,F,U,R).
(您可以使用online SWI-Prolog平台来玩示例)。
传统上(verbal arithmetic):
每个字母应该代表一个不同的数字,并且(与普通算术符号一样)多位数字的前导数字不能为零。一个好的谜题应该有一个独特的解决方案,并且字母应该组成一个短语。
您可以强制“前导数字不能为零”-规则添加:
not(O = 0), not(T = 0), not(F = 0).
不管怎样,这个问题有多种解决方案。
【讨论】: