/* sendmore benchmark in Picat v3. bench/sendmore.pl https://github.com/SWI-Prolog/bench Changes: - replaced digit/1 -> digitx/1 - added output (write/1 -> print/1) This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ main => go. go ?=> digitx(D), digitx(E), D=\=E, sumdigit(0, D, E, Y, C1), digitx(N), N=\=Y, N=\=E, N=\=D, digitx(R), R=\=N, R=\=Y, R=\=E, R=\=D, sumdigit(C1,N, R, E, C2), digitx(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), print(' '),print(S),print(E),print(N),print(D),nl, print('+'),print(M),print(O),print(R),print(E),nl, print('-----'),nl, print(M),print(O),print(N),print(E),print(Y),nl,nl, fail, nl. go => true. % """ % Cryptoaddition: % Find the unique answer to: % SEND % +MORE % ----- % MONEY % where each letter is a distinct digit. % """ top:- digitx(D), digitx(E), D=\=E, sumdigit(0, D, E, Y, C1), digitx(N), N=\=Y, N=\=E, N=\=D, digitx(R), R=\=N, R=\=Y, R=\=E, R=\=D, sumdigit(C1,N, R, E, C2), digitx(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), % print(' '),print(S),print(E),print(N),print(D),nl, % print('+'),print(M),print(O),print(R),print(E),nl, % print('-----'),nl, % print(M),print(O),print(N),print(E),print(Y),nl,nl, fail. top. sumdigit(C, A, B, S, D) :- X is (C+A+B), (X<10 -> S=X, D=0 ; S is X-10, D=1 ). digitx(0). digitx(1). digitx(2). digitx(3). digitx(4). digitx(5). digitx(6). digitx(7). digitx(8). digitx(9). leftdigit(1). leftdigit(2). leftdigit(3). leftdigit(4). leftdigit(5). leftdigit(6). leftdigit(7). leftdigit(8). leftdigit(9).