\ 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 1 occupy< {: m :} try< {: d :} try< {: e :} d e + 10 /modf {: carry0 :} occupy< {: y :} try< {: n :} e carry0 - n - 10 /modf negate {: carry1 :} occupy< {: r :} n carry1 - e - 10 /modf negate {: carry2 :} occupy< {: o :} o carry2 - m - 10 /modf negate m = if occupy< {: s :} cr s e n d m o r y .solution >occupy else drop then >occupy >occupy >try >occupy >try >try >occupy ;