From 38ab065eaaf98f189c13aeaecdd5c1ba6c940c74 Mon Sep 17 00:00:00 2001 From: Clyne Sullivan Date: Thu, 8 Dec 2022 21:47:46 -0500 Subject: [PATCH] day8: annotate --- day8/both.bas | 127 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 day8/both.bas 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 +