\ Newsgroups: comp.lang.forth \ Date: Tue, 7 Feb 2023 10:34:06 -0800 (PST) \ Message-ID: <78cfcd0a-5bc4-4584-8a92-9e8005a0e306n@googlegroups.com> \ Subject: SEND+MORE=MONEY \ From: "minf...@arcor.de" \ Today I doodled with constraint logic programming in Forth. \ A classic beginner's example is the SEND+MORE=MONEY puzzlee, \ where each letter stands for a digit in the range of 0 to 9 \ and which when concatenated represent a decimal number. \ Constraint: all digits must be different. \ I came up with the little program below using brute force. \ It does its job, but ugly. Any ideas for improvement and acceleration? \ Or syntax-wise? (Prolog does it so much more nicely). \ ##### SENDMORE.FTH ##### : ALLDIFFERENT {: a b c d e f g h -- flag :} false a b = IF exit THEN a c = IF exit THEN a d = IF exit THEN a e = IF exit THEN a f = IF exit THEN a g = IF exit THEN a h = IF exit THEN b c = IF exit THEN b d = IF exit THEN b e = IF exit THEN b f = IF exit THEN b g = IF exit THEN b h = IF exit THEN c d = IF exit THEN c e = IF exit THEN c f = IF exit THEN c g = IF exit THEN c h = IF exit THEN d e = IF exit THEN d f = IF exit THEN d g = IF exit THEN d h = IF exit THEN e f = IF exit THEN e g = IF exit THEN e h = IF exit THEN f g = IF exit THEN f h = IF exit THEN g h = IF exit THEN drop true ; : SENDMOREMONEY {: | s e n d m o r y s1 s2 s3 ct -- :} 0 to ct 1 9 DO i to s 1 9 DO i to m 1 9 DO i to e 1 9 DO i to d 0 9 DO i to n 0 9 DO i to o 0 9 DO i to r 0 9 DO i to y s e n d m o r y alldifferent IF ct 1+ to ct s 1000 * e 100 * + n 10 * + d + to s1 m 1000 * o 100 * + r 10 * + e + to s2 m 10000 * o 1000 * + n 100 * + e 10 * + y + to s3 s1 s2 + s3 = IF cr ." S=" s . ." E=" e . ." N=" n . ." D=" d . cr ." M=" m . ." O=" o . ." R=" r . ." Y=" y . cr ." " s1 . cr ." +" s2 . cr ." -----" cr ." " s3 . THEN THEN -1 +LOOP -1 +LOOP -1 +LOOP -1 +LOOP -1 +LOOP -1 +LOOP -1 +LOOP -1 +LOOP ." loops:" ct . ; SENDMOREMONEY