1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
|
% Cryptoaddition:
% Find the unique answer to:
% SEND
% +MORE
% -----
% MONEY
% where each letter is a distinct digit.
sendmore(ShowResult) :-
digit(D), digit(E), D=\=E,
sumdigit(0, D, E, Y, C1),
digit(N), N=\=Y, N=\=E, N=\=D,
digit(R), R=\=N, R=\=Y, R=\=E, R=\=D,
sumdigit(C1,N, R, E, C2),
digit(O), O=\=R, O=\=N, O=\=Y, O=\=E, O=\=D,
sumdigit(C2,E, O, N, C3),
leftdigit(S), S=\=O, S=\=R, S=\=N, S=\=Y, S=\=E, S=\=D,
leftdigit(M), M=\=S, M=\=O, M=\=R, M=\=N, M=\=Y, M=\=E, M=\=D,
sumdigit(C3,S, M, O, M),
( ShowResult = true ->
write(' '),write(S),write(E),write(N),write(D),nl,
write('+'),write(M),write(O),write(R),write(E),nl,
write('-----'),nl,
write(M),write(O),write(N),write(E),write(Y),nl,nl
; true),
fail.
sendmore(_).
sumdigit(C, A, B, S, D) :-
X is (C+A+B),
(X<10
-> S=X, D=0
; S is X-10, D=1
).
digit(0).
digit(1).
digit(2).
digit(3).
digit(4).
digit(5).
digit(6).
digit(7).
digit(8).
digit(9).
leftdigit(1).
leftdigit(2).
leftdigit(3).
leftdigit(4).
leftdigit(5).
leftdigit(6).
leftdigit(7).
leftdigit(8).
leftdigit(9).
% benchmark interface
benchmark(ShowResult) :-
sendmore(ShowResult).
:- include(common).
|