RosettaCodeData/Task/Hilbert-curve/Locomotive-Basic/hilbert-curve.basic
2026-04-30 12:34:36 -04:00

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