Код:
CREATE COMMANDS C" 1222223222221223222221222333" ",
0 VALUE START-X
0 VALUE START-Y
0 VALUE START-DIR
10 VALUE END-X
10 VALUE END-Y
: TOSS, ( XM .. XN .. X0 X N -- XM .. X .. X0 ) \ PUT X TO N-TH PLACE IN STACK
0x8B C, 0x4D C, 0x00 C, \ MOV ECX, [EBP]
0xFF C, 0xC0 C, \ INC ECX
0x89 C, 0x4C C, 0x85 C, 0x00 C, \ MOV [EAX*4+EBP], ECX
0x8B C, 0x45 C, 0x04 C, \ MOV EAX, [EBP+4]
0x8D C, 0x6D C, 0x08 C, \ LEA EBP, [EBP+8]
; IMMEDIATE
(
http://fforum.winglion.ru/viewtopic.php?p=45524#p45524
LEA EBP, 4 [EAX*4] [EBP]
MOV EAX, -4 [EBP]
)
: DROPN, ( X1 .. X[i] N -- X1 .. X[i-N] ) \ DROP N CELLS FROM DATA STACK
0x8D C, 0x6C C, 0x85 C, 0x04 C, \ LEA EBP, EAX*4 + EBP + 4
0x8B C, 0x45 C, 0xFC C, \ MOV EAX, EBP - 4
; IMMEDIATE
: TURN-LEFT ( DIR -- DIR' )
DUP 0 = IF 90 ELSE
DUP 90 = IF 180 ELSE
DUP 180 = IF 270 ELSE
DUP 270 = IF 0
THEN THEN THEN THEN
NIP
;
: TURN-RIGHT ( DIR -- DIR' )
DUP 0 = IF 270 ELSE
DUP 90 = IF 0 ELSE
DUP 180 = IF 90 ELSE
DUP 270 = IF 180
THEN THEN THEN THEN
NIP
;
: FORWARD ( POS-X POS-Y DIR -- POS-X' POS-Y' DIR )
DUP 0 = IF 2 PICK 1+ 2 TOSS, ELSE
DUP 90 = IF 1 PICK 1+ 1 TOSS, ELSE
DUP 180 = IF 2 PICK 1- 2 TOSS, ELSE
DUP 270 = IF 1 PICK 1- 1 TOSS,
THEN THEN THEN THEN
;
: SIMULATE-SINGLE-STEP ( START-X START-Y DIR LRF -- END-X END-Y DIR )
DUP [CHAR] L = IF OVER TURN-LEFT 1 TOSS, ELSE
DUP [CHAR] R = IF OVER TURN-RIGHT 1 TOSS, ELSE
3 PICK 3 PICK 3 PICK FORWARD
DROP 3 TOSS, 3 TOSS,
THEN THEN
DROP
;
: EXPAND-CODE ( CODE -- CODE-L CODE-R CODE-F )
DUP 255 AND SWAP
DUP 8 RSHIFT 255 AND SWAP
16 RSHIFT 255 AND
;
: COMPRESS-CODE ( CODE-L CODE-R CODE-F -- CODE )
16 LSHIFT 1 PICK 8 LSHIFT OR
2 PICK OR
NIP NIP
;
: DECODE-COMMAND ( COMMAND CODE -- LRF )
EXPAND-CODE
3 PICK 3 PICK = IF [CHAR] L ELSE
3 PICK 2 PICK = IF [CHAR] R ELSE
[CHAR] F
THEN THEN \ COMMAND CODE-L CODE-R CODE-F LRF
3 TOSS, 3 DROPN, \ LRF
;
: SIMULATE ( START-X START-Y DIR COMMANDS CODE -- END-X END-Y DIR )
SWAP COUNT ROT \ START-X START-Y DIR COMMANDS U CODE
0 \ START-X START-Y DIR COMMANDS U CODE I=0
BEGIN
2 PICK OVER > \ WHILE U > I
WHILE \ X Y DIR COMMANDS U CODE I
6 PICK 6 PICK 6 PICK 6 PICK 4 PICK \ X Y DIR COMMANDS U CODE I X Y DIR COMMANDS I
+ C@ 5 PICK DECODE-COMMAND \ X Y DIR COMMANDS U CODE I X Y DIR LRF
SIMULATE-SINGLE-STEP ( START-X START-Y DIR LRF -- END-X END-Y DIR )
6 TOSS, 6 TOSS, 6 TOSS, \ X Y DIR COMMANDS U CODE I
1+
REPEAT
4 DROPN,
;
: ENUM-COMMANDS ( COMMANDS -- CODE )
COUNT
0 0 0 0 \ COMMANDS U L R F I
BEGIN
DUP 5 PICK < \ COMMANDS U L R F I I<U?
4 PICK 0 <> 4 PICK 0 <> 4 PICK 0 <> \ COMMANDS U L R F I I<U? L<>0 R<>0 F<>0
OVER AND -ROT AND AND NOT AND \ COMMANDS U L R F I I<U&!(L,R,F<>0)
WHILE \ COMMANDS U L R F I
5 PICK OVER + C@ \ COMMANDS U L R F I COMMAND
4 PICK 0 = IF
DUP 4 TOSS,
ELSE
4 PICK OVER <> IF \ COMMANDS U L R F I COMMAND
3 PICK 0 = IF
DUP 3 TOSS,
ELSE
3 PICK OVER <> IF \ COMMANDS U L R F I COMMAND
DUP 2 TOSS,
THEN
THEN
THEN
THEN
DROP
1+
REPEAT \ COMMANDS U L R F I
DROP COMPRESS-CODE NIP NIP
;
(
code permutations:
code swap step
123 12 1
132 6
213 23 2
312 12 5
231 12 3
321 23 4
)
\ I = 0 | 1
: SWAP-CODE ( CODE I -- CODE )
SWAP EXPAND-CODE \ I CODE0 CODE1 CODE2
3 PICK 0 = IF
ROT SWAP \ I 1 0 2
ELSE
SWAP \ I 0 2 1
THEN
COMPRESS-CODE NIP
;
: PERMUTATE-CODE ( CODE PERMUTATION-NUMBER -- CODE )
2 MOD SWAP-CODE
;
: MAIN ( START-X START-Y START-DIR END-X END-Y COMMANDS -- )
DUP ENUM-COMMANDS
0 \ X Y DIR EX EY COMMANDS CODE PERMUTATION-NUMBER=0
BEGIN
DUP 6 <
WHILE \ X Y DIR EX EY COMMANDS CODE PN
DUP
." Permutation number: " . CR
OVER EXPAND-CODE -ROT SWAP
." Simulation code: " EMIT SPACE EMIT SPACE EMIT CR
7 PICK 7 PICK 7 PICK 5 PICK 5 PICK
SIMULATE DROP \ X Y DIR EX EY COMMANDS CODE PN SIM-X SIM-Y
2DUP SWAP
." Simulation end coordinates: " . ." , " . CR
5 PICK = SWAP 6 PICK = AND IF \ X Y DIR EX EY COMMANDS CODE PN
DROP EXPAND-CODE -ROT SWAP
." Code for 'left' is: " EMIT CR
." Code for 'right' is: " EMIT CR
." Code for 'forward' is: " EMIT CR
2DROP 2DROP 2DROP EXIT
THEN
CR
SWAP OVER PERMUTATE-CODE SWAP
1+
REPEAT
2DROP 2DROP 2DROP 2DROP
." Simulation failed!" CR
;
START-X START-Y START-DIR END-X END-Y COMMANDS MAIN
Код:
Permutation number: 0
Simulation code: 1 2 3
Simulation end coordinates: 0 , -3
Permutation number: 1
Simulation code: 2 1 3
Simulation end coordinates: 0 , 3
Permutation number: 2
Simulation code: 2 3 1
Simulation end coordinates: 1 , 0
Permutation number: 3
Simulation code: 3 2 1
Simulation end coordinates: 1 , 0
Permutation number: 4
Simulation code: 3 1 2
Simulation end coordinates: 10 , -10
Permutation number: 5
Simulation code: 1 3 2
Simulation end coordinates: 10 , 10
Code for 'left' is: 1
Code for 'right' is: 3
Code for 'forward' is: 2
Ok