De antwoorden op PiF 5. Lees dit als een 'log' van de zitting op 13 oktober 2007.
>SYMBOOL
: >symbool1 ( icode -- ch )
dup 9 < if [char] 1 + exit then
drop [char] : ;
Dat kan korter:
: >symbool2 ( icode -- ch ) 9 min [char] 1 + ;
Nu met de symbolen 'MAISFORTH'
create symbolen 9 allot align
s" MAISFORTH" symbolen swap move
: >symbool3 ( icode -- ch )
dup 9 < if symbolen + c@ exit then
drop [char] : ;
Ook dat kan korter:
create symbolen 9 allot
char : c, \ teken voor lege vakjes
align
s" MAISFORTH" symbolen swap move
: >symbool4 ( icode -- ch ) 9 min symbolen + c@ ;
.SDK
create (sdk 81 allot align
: .vakje ( nr -- ) space (sdk + c@ >symbool emit space ;
: .sdk1 ( -- )
81 0
do i
dup 27 mod 0= if cr cr then
dup 9 mod 0= if cr cr then
dup 3 mod 0= if 3 spaces then
.vakje
loop ;
MOD 0= IF wordt hierbij 81*3 = 243 maal uitgevoerd.
: .sdk2 ( -- )
81 0
do i
dup 3 mod 0= if
dup 9 mod 0= if
dup 27 mod 0= if cr cr then
cr cr then
3 spaces then
.vakje
loop ;
MOD 0= IF wordt nu 81+27+9 = 108 maal uitgevoerd.
: .sdk3 ( -- ) 0 \ teller
3 0 do
cr cr 3 0 do
cr cr 3 0 do
3 spaces 3 0 do dup .vakje 1+
loop loop loop loop
drop ;
MOD 0= IF komt helemaal niet meer voor.
Het uiteindelijke resultaat
anew -sdk
\ : align ; immediate
3 constant zb \ Zijde van een blok, 3
zb zb * constant z \ Zijde van de sudoku, 9
z z * constant zz \ Totaal aantal vakjes, 81
create (symbolen z allot
char : c, \ teken voor lege vakjes
align
: !symbolen ( adr len -- ) z min (symbolen swap move ;
s" 123456789" !symbolen
\ s" MAISFORTH" !symbolen
: >symbool ( icode -- ch ) z min (symbolen + c@ ;
create (sdk zz allot align
: .vakje ( nr -- ) space (sdk + c@ >symbool emit space ;
: .sdk ( -- ) 0 \ teller
zb 0 do
cr cr zb 0 do
cr cr zb 0 do
3 spaces zb 0 do dup .vakje 1+
loop loop loop loop
drop ;