aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClyne Sullivan <clyne@bitgloo.com>2022-12-03 14:14:20 -0500
committerClyne Sullivan <clyne@bitgloo.com>2022-12-03 14:14:20 -0500
commitf0702f04833ffc640ec0299f60f2251b5e0690a0 (patch)
tree888e19b3a83eb032cb1080eb9414c0d0e8bc07e6
parentec22d6d0c30cc0d896d302866059a603701d8094 (diff)
day3: explain part 2
-rw-r--r--day3/part2_documented.bas71
1 files changed, 71 insertions, 0 deletions
diff --git a/day3/part2_documented.bas b/day3/part2_documented.bas
new file mode 100644
index 0000000..245d648
--- /dev/null
+++ b/day3/part2_documented.bas
@@ -0,0 +1,71 @@
+REM Advent of Code 2022: Day 3, part 2
+REM Written in Applesoft BASIC
+
+ 10 ONERR GOTO 900
+
+REM PT = Priority total
+REM SN = String number (capture three strings per group)
+REM GN = Group number
+
+ 20 PT = 0:SN = 0:GN = 1
+
+REM Open input file. Bytes retrieved with GET.
+
+ 30 PRINT CHR$ (4),"OPEN INPUT"
+ 40 PRINT CHR$ (4),"READ INPUT"
+
+ REM Collect the next string. Transferring to the Apple produced
+ REM newlines between each byte, so GET D$ discards them.
+
+ 100 S$ = ""
+ 110 GET C$: GET D$
+ 120 IF ASC (C$) = 13 GOTO 200
+ 130 S$ = S$ + C$
+ 140 GOTO 110
+
+REM Repeat if necessary to collect all strings in group of three.
+
+ 200 IF SN = 0 THEN X$ = S$:SN = 1: GOTO 100
+ 210 IF SN = 1 THEN Y$ = S$:SN = 2: GOTO 100
+ 220 Z$ = S$
+ 230 SN = 0
+
+ 240 PRINT "SEARCHING GROUP ";GN;"'s RUCKSACKS..."
+ 250 GN = GN + 1
+
+REM Iterate through string X$. Search Y$, if both strings share
+REM a character then GOTO 340 to search Z$. If present in all three,
+REM GOTO 400. Otherwise, move to next character in X$.
+
+ 300 FOR I = 1 TO LEN (X$)
+ 310 FOR J = 1 TO LEN (Y$)
+ 320 IF MID$ (X$,I,1) = MID$ (Y$,J,1) GOTO 340
+ 330 NEXT J: NEXT I
+ 340 FOR J = 1 TO LEN (Z$)
+ 370 IF MID$ (X$,I,1) = MID$ (Z$,J,1) GOTO 400
+ 380 NEXT J: NEXT I
+
+REM Put badge character in XC$. Calculate priority in PR, then add to total.
+
+ 400 XC$ = MID$ (X$,I,1)
+ 410 PR = ASC (XC$)
+ 420 PR = PR - 64
+ 430 IF PR > 32 THEN PP = PR - 32
+ 440 IF PR < 32 THEN PP = PR + 26
+ 450 PT = PT + PP
+
+REM Print results, continue to next group of strings.
+REM If end-of-file, read error is caught and we exit from 900.
+REM Would have manually confirmed authentication of each groups' stickers,
+REM but I could not figure out reading the keyboard while the input file is
+REM opened.
+
+ 460 PRINT "FOUND ITEM TYPE FOR GROUP ";GN - 1;"'S BADGES: ";XC$
+ 470 PRINT "APPLYING AUTHENTICITY STICKERS..."
+ 480 FOR Q = 1 TO 1000: NEXT Q
+ 490 PRINT "PRIORITY TOTAL IS NOW ";PT
+ 499 GOTO 100
+
+ 900 PRINT CHR$ (4),"CLOSE"
+ 910 END
+