]> code.bitgloo.com Git - clyne/advent-of-code.git/commitdiff
day9: add part 1 basic
authorClyne Sullivan <clyne@bitgloo.com>
Fri, 9 Dec 2022 18:38:23 +0000 (13:38 -0500)
committerClyne Sullivan <clyne@bitgloo.com>
Fri, 9 Dec 2022 18:38:23 +0000 (13:38 -0500)
day9/part1.bas [new file with mode: 0644]

diff --git a/day9/part1.bas b/day9/part1.bas
new file mode 100644 (file)
index 0000000..fe762b5
--- /dev/null
@@ -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 
+