Alla esimerkki, mikä käy läpi kaikki taulukon permutaatiot. Testinä yritetään ratkaista alphametics puzzle käymällä läpi ja kokeilemalla permutaatioita (mikähän olisi suomennos?).
: a:swap \ a n n -- a
2dup 2 a:close 3rev 2 a:close -rot a:@
_swap ( rot drop a:! ) a:2each 2drop ;
private
: generate \ a n --
a:new ( 0 a:push ) 2 pick times -rot
over 4 pick w:exec
0
repeat
dup 2 pick n:< if
3 pick over a:_@ over n:< if
dup 2 n:mod 0 n:= if
2 pick 0 2 pick a:swap drop
else
2 pick 4 pick 2 pick a:_@ 2 pick a:swap drop
then
2 pick 5 pick w:exec
3 pick over a:@ n:1+ 2 pick swap a:! drop
drop 0
else
3 pick over 0 a:! drop
n:1+
then
else
break
then
again 2drop 2drop drop ;
public
\ Note: callback word receives array reference
: a:permutations \ a w --
swap a:len #p:generate ;
: s:translate \ s1 s2 s3 -- s
3 a:close ( null s:/ ) a:map a:open m:zip swap dup m:@? nip "" a:join ;
\ Now, try solving alphametics...
\ It might be a good idea to test there are no more than 10 unique alphabets in alphametics puzzle.
"SEND MORE + MONEY =" constant alphametics
alphametics /[A-Z]/ r:/ ' s:cmp a:sort ' s:= a:uniq "" a:join s:len constant num-of-unique-chars constant unique-chars
: any-leading-zeros?
/\b[0]/ r:match nip ;
: app:main
"0123456789" null s:/
( 0 num-of-unique-chars a:slice "" a:join
alphametics unique-chars rot s:translate dup any-leading-zeros? not if
dup eval if
. cr break
else
drop
then
else
drop
then ) a:permutations ;Aihe on jo aika vanha, joten et voi enää vastata siihen.