]> code.bitgloo.com Git - clyne/advent-of-code.git/commitdiff
day6: undo extra stuff
authorClyne Sullivan <clyne@bitgloo.com>
Fri, 9 Dec 2022 08:36:32 +0000 (03:36 -0500)
committerClyne Sullivan <clyne@bitgloo.com>
Fri, 9 Dec 2022 08:36:32 +0000 (03:36 -0500)
day6/both.bas

index cbac38843a9c27ee124f831bf195e37783b783d1..9887f8e126e703b71ef2e2dff74880bc17ffc9b9 100644 (file)
@@ -2,11 +2,7 @@ REM Advent of Code 2022: Day 6, part 1 and 2
 REM Written in Applesoft BASIC
 
  5  HOME 
- 10 R1 = 3
- 20 R2 = 13
- 30 G1 = 0
- 40 G2 = 0
- 50 M = 0
+ 10 R = 0
  50  PRINT  CHR$ (4),"OPEN INPUT"
  60  PRINT  CHR$ (4),"READ INPUT"
  70  ONERR  GOTO 900
@@ -26,53 +22,65 @@ REM The routine at 1000 spins an empty FOR I = 0 TO A loop for a delay.
  220  GOSUB 1000
  230  PRINT ".";
  240  NEXT I
- 250  PRINT : PRINT
+ 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 "||||||||||||||";
-
+ 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
- 403  VTAB 9
- 406  PRINT S$;
- 410  GET C$
- 413 S$ = C$ + S$
- 420  IF  LEN (S$) > 40 THEN S$ =  MID$ (S$,1,40)
- 430  IF M > 0 THEN M = M - 1: GOTO 400
- 440  IF  G1 = 0 AND LEN (S$) >  = 4 THEN GOSUB 500
- 450  IF  G2 = 0 AND LEN (S$) >  = 14 THEN GOSUB 2200
- 460  IF G1 = 1 AND G2 = 1 GOTO 900
+ 410  VTAB 9
+ 420  PRINT S$;
+ 430  IF  LEN (S$) >  = 4 GOTO 500
+ 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 R1 = R1 + 1
  500  HTAB 1
  510  VTAB 7
- 530  IF  MID$ (S$,1,1) =  MID$ (S$,2,1) THEN  PRINT "/\  ";
- 540  IF  MID$ (S$,1,1) =  MID$ (S$,3,1) THEN  PRINT "/-\ ";
- 550  IF  MID$ (S$,1,1) =  MID$ (S$,4,1) THEN  PRINT "/--\";
- 560  IF  MID$ (S$,2,1) =  MID$ (S$,3,1) THEN  PRINT " /\ ";
- 570  IF  MID$ (S$,2,1) =  MID$ (S$,4,1) THEN  PRINT " /-\";
- 580  IF  MID$ (S$,3,1) =  MID$ (S$,4,1) THEN  PRINT "  /\";
+ 530  IF  MID$ (S$,1,1) =  MID$ (S$,2,1) THEN  PRINT "/\  ";: GOTO 600
+ 540  IF  MID$ (S$,1,1) =  MID$ (S$,3,1) THEN  PRINT "/-\ ";: GOTO 600
+ 550  IF  MID$ (S$,1,1) =  MID$ (S$,4,1) THEN  PRINT "/--\";: GOTO 600
+ 560  IF  MID$ (S$,2,1) =  MID$ (S$,3,1) THEN  PRINT " /\ ";: GOTO 600
+ 570  IF  MID$ (S$,2,1) =  MID$ (S$,4,1) THEN  PRINT " /-\";: GOTO 600
+ 580  IF  MID$ (S$,3,1) =  MID$ (S$,4,1) THEN  PRINT "  /\";: GOTO 600
  590  PRINT "    ";
+ 595  GOTO 700
+ 600  GOTO 440
+
+REM Part 1 complete! Indicate that part 2 is beginning...
+
  700  HTAB 1
  710  VTAB 13
  715 A = 1300
- 718 G1 = 1
  720  PRINT "MARKER FOUND AT INDEX ";R;"."
- 599  RETURN
+ 725  GOSUB 1000
+ 730  PRINT 
+ 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.
 
@@ -84,10 +92,46 @@ 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.
 
- 2200 I = 1
- 2205 M = 0
  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
@@ -98,22 +142,30 @@ REM If we've gone through all indices, marker found. GOTO 2400.
 
  2250 I = I + 1
  2260  IF I < 14 GOTO 2200
-
- 2270  HTAB 1
- 2275  VTAB 23
- 2280  G2 = 1
- 2285  PRINT "MESSAGE FOUND AT INDEX ";R"."
- 2290  RETURN
+ 2270  GOTO 2400
 
 REM A match was found. Show dashes between the two characters.
 
  2300  HTAB I
- 2310  VTAB 11
+ 2310  VTAB 18
  2314  PRINT "              ";
  2318  HTAB I
  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  RETURN
+ 2350  GOTO 2100
+
+REM Yay, we did it!
+
+ 2400  HTAB 1
+ 2410  VTAB 23
+ 2420  PRINT "MESSAGE FOUND AT INDEX ";R"."
+ 2425  GOSUB 1000
+ 2430  GOTO 900