aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClyne Sullivan <clyne@bitgloo.com>2022-12-08 21:47:46 -0500
committerClyne Sullivan <clyne@bitgloo.com>2022-12-08 21:47:46 -0500
commit38ab065eaaf98f189c13aeaecdd5c1ba6c940c74 (patch)
treef6d18b37f5b9e5bfed5bc02ca12884db5d3c70ac
parent1efcf6b597f0c6feb7ff01ef9caeae8296f93951 (diff)
day8: annotate
-rw-r--r--day8/both.bas127
1 files changed, 127 insertions, 0 deletions
diff --git a/day8/both.bas b/day8/both.bas
new file mode 100644
index 0000000..8067047
--- /dev/null
+++ b/day8/both.bas
@@ -0,0 +1,127 @@
+REM Advent of Code 2022: Day 8, part 1 and 2
+REM Written in Applesoft BASIC
+
+REM Store the map as an array of strings.
+
+ 10 SZ = 40
+ 20 DIM MP$(SZ)
+ 30 VI = 0
+ 40 SC = 0:SX = 2:SY = 1
+
+ 60 GR
+ 70 PRINT "LEARNING ABOUT TREES";
+ 80 SPEED= 60: PRINT "...";: SPEED= 255
+
+ 100 PRINT CHR$ (4),"open input"
+ 110 PRINT CHR$ (4),"read input"
+
+REM Read all lines of the input file, adding them into the MP$ array.
+
+ 120 I = 0
+ 140 S$ = ""
+ 150 GET C$
+ 160 IF ASC (C$) > 31 THEN S$ = S$ + C$: GOTO 150
+ 170 MP$(I) = S$
+ 180 I = I + 1
+ 185 IF I = SZ GOTO 200
+ 190 GOTO 140
+
+REM Close the file once we've finished reading.
+REM Initialize the visible count to include border trees.
+
+ 200 PRINT CHR$ (4),"close"
+ 210 VI = 2 * LEN (MP$(0)) - 4 + 2 * SZ
+ 220 HTAB 1
+ 230 PRINT "PLOTTING... "
+
+REM Main loop: Iterate through all possibly-hidden and/or scenic trees.
+REM GOSUB 3000 is a (test) graphical routine to draw the tree.
+REM GOSUB 1000 checks hidden-ness of the tree, possibly incrementing the
+REM visibility count. If not visible, the tree is colored dark green.
+REM GOSUB 2000 calculates the scenic score for the tree. If a new more
+REM scenic spot is found, it is colored pink.
+
+ 300 FOR Y = 1 TO SZ - 2
+ 310 S$ = MP$(Y)
+ 320 FOR X = 2 TO LEN (S$) - 1
+ 325 GOSUB 3000
+ 328 OV = VI
+ 330 GOSUB 1000
+ 332 IF OV = VI THEN COLOR= 4: GOSUB 3100
+ 335 GOSUB 2000
+ 340 NEXT X
+ 360 NEXT Y
+ 370 PRINT "VISIBLE TREES: ";VI
+ 375 PRINT "BEST VIEW SCORE: ";SC
+ 380 END
+
+REM Check hidden-ness of tree at X, Y. Current map row is in S$.
+REM In order, checks to the west, east, north, and south.
+REM If visible, increments the total counter and exits.
+
+ 1000 V$ = "0"
+ 1010 FOR I = 1 TO X - 1
+ 1020 C$ = MID$ (S$,I,1)
+ 1040 IF V$ < C$ THEN V$ = C$
+ 1050 NEXT I
+ 1060 IF V$ < MID$ (S$,X,1) THEN VI = VI + 1: RETURN
+ 1100 V$ = "0"
+ 1110 FOR I = LEN (S$) TO X + 1 STEP - 1
+ 1120 C$ = MID$ (S$,I,1)
+ 1130 IF V$ < C$ THEN V$ = C$
+ 1140 NEXT I
+ 1150 IF V$ < MID$ (S$,X,1) THEN VI = VI + 1: RETURN
+ 1200 V$ = "0"
+ 1210 FOR I = 0 TO Y - 1
+ 1220 C$ = MID$ (MP$(I),X,1)
+ 1230 IF V$ < C$ THEN V$ = C$
+ 1240 NEXT I
+ 1250 IF V$ < MID$ (S$,X,1) THEN VI = VI + 1: RETURN
+ 1300 V$ = "0"
+ 1310 FOR I = SZ - 1 TO Y + 1 STEP - 1
+ 1320 C$ = MID$ (MP$(I),X,1)
+ 1330 IF V$ < C$ THEN V$ = C$
+ 1340 NEXT I
+ 1350 IF V$ < MID$ (S$,X,1) THEN VI = VI + 1
+ 1360 RETURN
+
+REM Score scenery for the given tree, same parameters as 1000.
+REM Does linear checks to the west, east, north, and south, in that order.
+
+ 2000 C$ = MID$ (S$,X,1)
+ 2010 N = 0:S = 0:E = 0:W = 0
+ 2020 FOR I = X - 1 TO 1 STEP - 1
+ 2030 W = W + 1
+ 2040 IF C$ < = MID$ (MP$(Y),I,1) THEN I = 1
+ 2050 NEXT I
+ 2100 FOR I = X + 1 TO LEN (S$)
+ 2110 E = E + 1
+ 2120 IF C$ < = MID$ (MP$(Y),I,1) THEN I = LEN (S$)
+ 2130 NEXT I
+ 2200 FOR I = Y - 1 TO 0 STEP - 1
+ 2210 N = N + 1
+ 2220 IF C$ < = MID$ (MP$(I),X,1) THEN I = 0
+ 2230 NEXT I
+ 2300 FOR I = Y + 1 TO SZ - 1
+ 2310 S = S + 1
+ 2320 IF C$ < = MID$ (MP$(I),X,1) THEN I = SZ - 1
+ 2330 NEXT I
+ 2400 R = N * S * E * W
+ 2405 IF R < = SC GOTO 2450
+ 2410 A = X:B = Y
+ 2415 X = SX:Y = SY
+ 2420 GOSUB 3000
+ 2425 SC = R:SX = A:SY = B
+ 2430 X = A:Y = B
+ 2435 COLOR= 11: GOSUB 3100
+ 2450 RETURN
+
+REM Plots the current tree on the screen. Lighter green for taller trees.
+REM Visible trees are drawn dark green, see 332.
+
+ 3000 C$ = MID$ (S$,X,1)
+ 3010 IF C$ < "4" THEN COLOR= 12: GOTO 3100
+ 3020 COLOR= 14
+ 3100 PLOT X - 2,Y - 1
+ 3110 RETURN
+