aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClyne Sullivan <clyne@bitgloo.com>2022-12-06 09:28:31 -0500
committerClyne Sullivan <clyne@bitgloo.com>2022-12-06 09:28:31 -0500
commit87cf8fed02455b10f8015ea77e2d16d688c85c49 (patch)
treea9d635688680437355822474f892017da31ce1c6
parent63cb27c091a8b4b419846f64aa7d541375944703 (diff)
day6: explain basic
-rw-r--r--day6/both.bas67
1 files changed, 64 insertions, 3 deletions
diff --git a/day6/both.bas b/day6/both.bas
index d5a70a3..9887f8e 100644
--- a/day6/both.bas
+++ b/day6/both.bas
@@ -2,11 +2,14 @@ REM Advent of Code 2022: Day 6, part 1 and 2
REM Written in Applesoft BASIC
5 HOME
- 10 A = 1000
- 20 R = 0
+ 10 R = 0
50 PRINT CHR$ (4),"OPEN INPUT"
60 PRINT CHR$ (4),"READ INPUT"
70 ONERR GOTO 900
+
+REM Print some fun messages, going for a hacker feel.
+REM The routine at 1000 spins an empty FOR I = 0 TO A loop for a delay.
+
100 PRINT "INITIALIZING COMMUNICATION SYSTEM";
105 A = 350
110 FOR I = 0 TO 6
@@ -22,12 +25,20 @@ REM Written in Applesoft BASIC
250 PRINT
260 PRINT
300 PRINT "SCANNING FOR START-OF-PACKET MARKER:"
+
+REM Show bars above and below the four characters being tested for part one.
+
310 HTAB 1
320 VTAB 8
330 PRINT "||||";
340 HTAB 1
350 VTAB 10
360 PRINT "||||";
+
+REM Main loop: Print the current string. If it can be checked for uniqueness,
+REM GOTO 500 (which comes back to 440). At 440, we add the next character to
+REM the string and trim off the end if its too long.
+
400 HTAB 1
410 VTAB 9
420 PRINT S$;
@@ -35,10 +46,18 @@ REM Written in Applesoft BASIC
440 GET C$
450 S$ = C$ + S$
455 IF LEN (S$) > 40 THEN S$ = MID$ (S$,1,40)
+
+REM Delay a little for visual effect, count the added character, then repeat.
+
460 A = 80
470 GOSUB 1000
475 R = R + 1
480 GOTO 400
+
+REM Here, we check for matching characters. It's hard-coded because there are
+REM only a few combinations. A little ASCII art "connects" the matched bytes.
+REM GOTO 700 if all unique, otherwise back to 440 for the next character.
+
500 HTAB 1
510 VTAB 7
530 IF MID$ (S$,1,1) = MID$ (S$,2,1) THEN PRINT "/\ ";: GOTO 600
@@ -50,7 +69,9 @@ REM Written in Applesoft BASIC
590 PRINT " ";
595 GOTO 700
600 GOTO 440
- 620 VTAB 14
+
+REM Part 1 complete! Indicate that part 2 is beginning...
+
700 HTAB 1
710 VTAB 13
715 A = 1300
@@ -60,39 +81,71 @@ REM Written in Applesoft BASIC
740 PRINT "ENGAGING FULL-SPEED SEARCH FOR START-OF-MESSAGE MARKER:"
750 GOSUB 1000
760 GOTO 2000
+
+REM I keep the exit routine at 900 out of habit.
+
900 PRINT CHR$ (4),"CLOSE"
910 END
+
+REM The delay routine.
+
1000 FOR Z = 0 TO A: NEXT Z
1010 RETURN
+
+REM Print bars for the 14-character window.
+
2000 HTAB 1
2010 VTAB 19
2020 PRINT "||||||||||||||";
2030 HTAB 1
2040 VTAB 21
2050 PRINT "||||||||||||||";
+
+REM Re-open the input data and reset variables (var M is new).
+
2060 PRINT CHR$ (4),"CLOSE"
2070 PRINT CHR$ (4),"OPEN INPUT"
2080 PRINT CHR$ (4),"READ INPUT"
2090 S$ = "":R = 0
2095 M = 0
+
+REM Print the string, then add and count the next character.
+
2100 HTAB 1
2110 VTAB 20
2120 PRINT S$;
2130 GET C$
2140 S$ = C$ + S$
2145 R = R + 1
+
+REM Same checks as part one, except for 2170 which skips M checks.
+REM See 2345 for explanation.
+
2150 IF LEN (S$) < 14 GOTO 2100
2160 IF LEN (S$) > 40 THEN S$ = MID$ (S$,1,40)
2170 IF M > 0 THEN M = M - 1: GOTO 2100
+
+REM Prepare to search for matches.
+
2190 I = 1
2200 M = 0
+
+REM Search for a matching pair. If found, store 2nd index in M.
+
2210 FOR J = I + 1 TO 14
2220 IF MID$ (S$,I,1) = MID$ (S$,J,1) THEN M = J:J = 14
2230 NEXT J
2240 IF M < > 0 GOTO 2300
+
+REM If no matches, move to next index and repeat.
+REM If we've gone through all indices, marker found. GOTO 2400.
+
2250 I = I + 1
2260 IF I < 14 GOTO 2200
2270 GOTO 2400
+
+REM A match was found. Show dashes between the two characters.
+
2300 HTAB I
2310 VTAB 18
2314 PRINT " ";
@@ -100,8 +153,16 @@ REM Written in Applesoft BASIC
2320 FOR J = I TO M
2330 PRINT "-";
2340 NEXT J
+
+REM M becomes the number of characters to skip/shift in the input string.
+REM E.g. if indices 1 and 3 matched, they will continue to be in the 14-char
+REM window for the next 11 iterations. Skip those.
+
2345 M = 14 - M
2350 GOTO 2100
+
+REM Yay, we did it!
+
2400 HTAB 1
2410 VTAB 23
2420 PRINT "MESSAGE FOUND AT INDEX ";R"."