:- module laba.
:- interface.
:- import_module io.
:- pred main
(io
::di
, io
::uo
) is det
. :- implementation.
:- import_module int, list, string, solutions.
main(!IO) :-
io.format("rsrx + zvv = srxs\n", [], !IO),
( if
solutions.solutions(find, Results),
list.length(Results, Count), Count > 0
then
io.format("found %d results:\n", [i(Count)], !IO),
write_list(Results, "", print_solution, !IO)
else
io.format("has no solutions\n", [], !IO)
).
:- pred print_solution
({int
,int
,int
}::in
, io
::di
, io
::uo
) is det
. print_solution({RSRX, ZVV, SRXS}, !IO) :-
io.format("%d + %d = %d\n", [i(RSRX) , i(ZVV), i(SRXS)], !IO).
:- pred find
({int
, int
, int
}::out
) is nondet
. find({RSRX, ZVV, SRXS}) :-
Ds0 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], C0 = 0,
pick
(Ds0
, X
, Ds1
), S1
= X
+V
+C0
, S
= S1
mod 10, C1
= S1
/10,pick(Ds1, R, Ds2),
pick
(Ds2
, V
, Ds3
), S2
= R
+V
+C1
, X
= S2
mod 10, C2
= S2
/10, R \
= 0,pick(Ds3, S, Ds4),
pick
(Ds4
, Z
, _
), S3
= S
+Z
+C2
, R
= S3
mod 10, C3
= S3
/10, Z \
= 0,S4
= R
+ C3
, S
= S4
mod 10, C4
= S4
/10,C4 = 0,
RSRX = 1000 R + 100 S + 10 R + X,
ZVV = 100 Z + 10 V + V,
SRXS = 1000 S + 100 R + 10 X + S.
:- pred pick
(list
(int
)::in
, int
::out
, list
(int
)::out
) is nondet
. pick([X | Xs], X, Xs).
pick([X | Xs], Y, [X | Zs]) :- pick(Xs, Y, Zs).
Oi0gbW9kdWxlIGxhYmEuCjotIGludGVyZmFjZS4KOi0gaW1wb3J0X21vZHVsZSBpby4KOi0gcHJlZCBtYWluKGlvOjpkaSwgaW86OnVvKSBpcyBkZXQuCjotIGltcGxlbWVudGF0aW9uLgo6LSBpbXBvcnRfbW9kdWxlIGludCwgbGlzdCwgc3RyaW5nLCBzb2x1dGlvbnMuCgptYWluKCFJTykgOi0KaW8uZm9ybWF0KCJyc3J4ICsgenZ2ID0gc3J4c1xuIiwgW10sICFJTyksCiggaWYgCnNvbHV0aW9ucy5zb2x1dGlvbnMoZmluZCwgUmVzdWx0cyksCmxpc3QubGVuZ3RoKFJlc3VsdHMsIENvdW50KSwgQ291bnQgPiAwCnRoZW4KaW8uZm9ybWF0KCJmb3VuZCAlZCByZXN1bHRzOlxuIiwgW2koQ291bnQpXSwgIUlPKSwKd3JpdGVfbGlzdChSZXN1bHRzLCAiIiwgcHJpbnRfc29sdXRpb24sICFJTykKZWxzZQppby5mb3JtYXQoImhhcyBubyBzb2x1dGlvbnNcbiIsIFtdLCAhSU8pCikuCgo6LSBwcmVkIHByaW50X3NvbHV0aW9uKHtpbnQsaW50LGludH06OmluLCBpbzo6ZGksIGlvOjp1bykgaXMgZGV0LgpwcmludF9zb2x1dGlvbih7UlNSWCwgWlZWLCBTUlhTfSwgIUlPKSA6LQppby5mb3JtYXQoIiVkICsgJWQgPSAlZFxuIiwgW2koUlNSWCkgLCBpKFpWViksIGkoU1JYUyldLCAhSU8pLgoKOi0gcHJlZCBmaW5kKHtpbnQsIGludCwgaW50fTo6b3V0KSBpcyBub25kZXQuCmZpbmQoe1JTUlgsIFpWViwgU1JYU30pIDotCkRzMCA9IFswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5XSwgQzAgPSAwLApwaWNrKERzMCwgWCwgRHMxKSwgUzEgPSBYK1YrQzAsIFMgPSBTMSBtb2QgMTAsIEMxID0gUzEvMTAsCnBpY2soRHMxLCBSLCBEczIpLApwaWNrKERzMiwgViwgRHMzKSwgUzIgPSBSK1YrQzEsIFggPSBTMiBtb2QgMTAsIEMyID0gUzIvMTAsIFIgXD0gMCwKcGljayhEczMsIFMsIERzNCksCnBpY2soRHM0LCBaLCBfKSwgUzMgPSBTK1orQzIsIFIgPSBTMyBtb2QgMTAsIEMzID0gUzMvMTAsIFogXD0gMCwKUzQgPSBSICsgQzMsIFMgPSBTNCBtb2QgMTAsIEM0ID0gUzQvMTAsCkM0ID0gMCwKUlNSWCA9IDEwMDAgUiArIDEwMCBTICsgMTAgUiArIFgsClpWViA9IDEwMCBaICsgMTAgViArIFYsClNSWFMgPSAxMDAwIFMgKyAxMDAgUiArIDEwIFggKyBTLgoKOi0gcHJlZCBwaWNrKGxpc3QoaW50KTo6aW4sIGludDo6b3V0LCBsaXN0KGludCk6Om91dCkgaXMgbm9uZGV0LgpwaWNrKFtYIHwgWHNdLCBYLCBYcykuCnBpY2soW1ggfCBYc10sIFksIFtYIHwgWnNdKSA6LSBwaWNrKFhzLCBZLCBacyku