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