aboutsummaryrefslogtreecommitdiffstats
path: root/day8/both.bas
blob: 8067047c64724c4fe68ea52b893b4daa0e64ddcf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
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