aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClyne Sullivan <clyne@bitgloo.com>2022-12-09 13:38:23 -0500
committerClyne Sullivan <clyne@bitgloo.com>2022-12-09 13:38:23 -0500
commit5f7e61056af044daa9389fc7612724371e394b83 (patch)
tree8435917b4c2cf3d2f3ffcef31edf9f8e2cb8e1f9
parent8d2311c83bf5e828efc94e035fff9a8759b80cf6 (diff)
day9: add part 1 basic
-rw-r--r--day9/part1.bas87
1 files changed, 87 insertions, 0 deletions
diff --git a/day9/part1.bas b/day9/part1.bas
new file mode 100644
index 0000000..fe762b5
--- /dev/null
+++ b/day9/part1.bas
@@ -0,0 +1,87 @@
+REM Advent of Code 2022: Day 9, part 1
+REM Written in Applesoft BASIC
+
+REM HS is a "set" of unique tail coordinates.
+
+ 10 DIM HS(7000)
+ 20 HX = 0:HY = 0
+ 30 TX = 0:TY = 0
+
+REM Read a line of input.
+
+ 100 S$ = ""
+ 110 GET C$
+ 120 IF ASC (C$) < 32 GOTO 200
+ 130 S$ = S$ + C$
+ 140 GOTO 110
+
+REM If empty, we're done. Otherwise, extract direction and count.
+
+ 200 IF LEN (S$) = 0 THEN GOTO 1000
+ 210 D$ = LEFT$ (S$,1)
+ 220 S = VAL ( MID$ (S$,3, LEN (S$) - 2))
+ 230 PRINT ">>",D$;" ";S
+
+REM For each step...
+REM Handle head movement, then GOTO 400 to handle the tail.
+
+ 300 FOR I = 1 TO S
+ 310 IF D$ = "U" THEN HY = HY + 1: GOTO 400
+ 320 IF D$ = "D" THEN HY = HY - 1: GOTO 400
+ 330 IF D$ = "R" THEN HX = HX + 1: GOTO 400
+ 340 IF D$ = "L" THEN HX = HX - 1: GOTO 400
+ 350 PRINT "ERROR: ";D$
+ 360 END
+
+REM If no movement is necessary, GOTO 460. Otherwise, GOSUB 500 and/or 550
+REM to move the tail as needed.
+
+ 400 DX = HX - TX:DY = HY - TY
+ 410 IF ABS (DX) < = 1 AND ABS (DY) < = 1 GOTO 460
+ 420 IF HX < > TX THEN GOSUB 500
+ 430 IF HY < > TY THEN GOSUB 550
+
+REM Create a hash of the tail coordinates, then try placing it in the "set".
+
+ 440 HH = TX * 1000 + TY
+ 450 GOSUB 600
+
+REM Handle next step for the current direction, or GOTO 100 for next input.
+
+ 460 NEXT I
+ 470 GOTO 100
+
+REM Move tail one place closer to head in the X direction.
+
+ 500 Z = - 1
+ 510 IF HX > TX THEN Z = 1
+ 520 TX = TX + Z
+ 530 RETURN
+
+REM Move tail one place closer to head in the Y direction.
+
+ 550 Z = - 1
+ 560 IF HY > TY THEN Z = 1
+ 570 TY = TY + Z
+ 580 RETURN
+
+REM "Set" insertion:
+REM If hash is already in the set, then exit.
+REM Otherwise, if an empty slot is found, add the hash to the set.
+
+ 600 FOR J = 0 TO 6999
+ 610 IF HS(J) = HH THEN J = 6999: GOTO 630
+ 620 IF HS(J) = 0 THEN HS(J) = HH:J = 9999
+ 630 NEXT J
+ 640 RETURN
+
+REM All input has been read. Count up entries in the "set" and display.
+
+ 1000 CO = 0
+ 1010 FOR I = 0 TO 9999
+ 1020 CO = CO + 1
+ 1030 IF HS(I) = 0 THEN I = 9999
+ 1040 NEXT I
+ 1050 PRINT "TOTAL: ";CO
+ 1060 END
+