]> code.bitgloo.com Git - clyne/advent-of-code.git/commitdiff
day8: annotate
authorClyne Sullivan <clyne@bitgloo.com>
Fri, 9 Dec 2022 02:47:46 +0000 (21:47 -0500)
committerClyne Sullivan <clyne@bitgloo.com>
Fri, 9 Dec 2022 02:47:46 +0000 (21:47 -0500)
day8/both.bas [new file with mode: 0644]

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