69 lines
1.4 KiB
Text
69 lines
1.4 KiB
Text
100 MODE 2
|
|
110 level = 5
|
|
120 step1 = 8
|
|
130 '
|
|
140 ' stack
|
|
150 DIM alevel(level+1), agap(level+1), aflip(level+1)
|
|
160 '
|
|
170 ' directions
|
|
180 DIM dx(3), dy(3)
|
|
190 dx(0)=1: dy(0)=0
|
|
200 dx(1)=0: dy(1)=-1
|
|
210 dx(2)=-1: dy(2)=0
|
|
220 dx(3)=0: dy(3)=1
|
|
230 '
|
|
240 ' GAPS encoding: max 2 ops per gap
|
|
250 DIM glen(4), gseq1(4), gseq2(4), gnext(4)
|
|
260 '
|
|
270 ' gap 0: [+] -> B
|
|
280 glen(0)=1: gseq1(0)=1: gnext(0)=1
|
|
290 ' gap 1: [F,-] -> A
|
|
300 glen(1)=2: gseq1(1)=0: gseq2(1)=-1: gnext(1)=0
|
|
310 ' gap 2: [F] -> A
|
|
320 glen(2)=1: gseq1(2)=0: gnext(2)=0
|
|
330 ' gap 3: [-,F] -> B
|
|
340 glen(3)=2: gseq1(3)=-1: gseq2(3)=0: gnext(3)=1
|
|
350 ' gap 4: [+] -> end
|
|
360 glen(4)=1: gseq1(4)=1: gnext(4)=-1
|
|
370 '
|
|
380 ' turtle
|
|
390 x = 100: y = 100: dir = 0
|
|
400 MOVE x,y
|
|
410 '
|
|
420 ' init stack
|
|
430 sp = 1
|
|
440 alevel(1)=level
|
|
450 agap(1)=0
|
|
460 aflip(1)=0
|
|
470 '
|
|
480 WHILE sp > 0
|
|
490 lv = alevel(sp)
|
|
500 gap = agap(sp)
|
|
510 flip = aflip(sp)
|
|
520 IF lv = 0 THEN sp = sp - 1 ELSE GOSUB 570
|
|
530 WEND
|
|
540 END
|
|
550 '
|
|
560 ' execute gap
|
|
570 FOR i = 1 TO glen(gap)
|
|
580 IF i=1 THEN t = gseq1(gap) ELSE t = gseq2(gap)
|
|
590 IF t = 0 THEN GOSUB 710 ELSE GOSUB 760
|
|
600 NEXT i
|
|
610 '
|
|
620 nt = gnext(gap)
|
|
630 IF nt = -1 THEN sp = sp - 1: RETURN
|
|
640 agap(sp) = gap + 1
|
|
650 sp = sp + 1
|
|
660 alevel(sp) = lv - 1
|
|
670 agap(sp) = 0
|
|
680 aflip(sp)=flip XOR nt
|
|
690 RETURN
|
|
700 '
|
|
710 x = x + dx(dir) * step1
|
|
720 y = y - dy(dir) * step1
|
|
730 DRAW x,y
|
|
740 RETURN
|
|
750 '
|
|
760 IF flip=1 THEN t = -t
|
|
770 dir = (dir + t + 4) AND 3
|
|
780 RETURN
|