\ SEND+MORE=MONEY program by M. Anton Ertl 2023 create occupationmap 10 allot \ each entry is 0 if free, non-0 if occupied : occupation! ( f u -- ) occupationmap + c! ; : occupy< ( u -- u ) ]] dup >r occupationmap + c@ 0= if true r@ occupation! r@ [[ ; immediate : >occupy ( -- ) ]] false r@ occupation! then rdrop [[ ; immediate : try< ( run-time: -- u ) ]] 10 0 do i occupy< [[ ; immediate : >try ( run-time: -- ) ]] >occupy loop [[ ; immediate : .solution {: s e n d m o r y -- :} s 0 .r e 0 .r n 0 .r d 0 .r ." +" m 0 .r o 0 .r r 0 .r e 0 .r ." =" m 0 .r o 0 .r n 0 .r e 0 .r y 0 .r ; : smm ( -- ) \ SEND+MORE=MONEY occupationmap 10 erase try< {: s :} s 0 > if try< {: m :} m 0 > if try< {: e :} try< {: d :} try< {: n :} try< {: o :} try< {: r :} try< {: y :} s 1000 * e 100 * + n 10 * + d + {: send :} m 1000 * o 100 * + r 10 * + e + {: more :} m 10000 * o 1000 * + n 100 * + e 10 * + y + {: money :} send more + money = if cr s e n d m o r y .solution then >try >try >try >try >try >try then >try then >try ;