Nerdy Advent of Code

Pour le jour 3 de l’Advent of Code 2022, je me suis un peu amusé et j’ai fait l’algo en Basic AppleSoft sur mon Apple //c !

Bon comme c’est la galère de taper sur ce vieux clavier de 40 ans, et que de toutes façons, c’était inenvisageable de recopier le fichier d’input à la main, j’ai ressorti mon vieux câble série qui permet à un ordinateur de 2016 de discuter avec un ordinateur de 1978 :

USB B vers USB A vers DB9 vers DB25 vers DIN5, facile !

On boote l’Apple //c sur une disquette ProDOS (une disquette ADTPro convient, on quittera vers BASIC), puis on configure le port série de l’Apple //c avec

] IN #2
] <Ctrl-a>14B

Puis le port série du laptop avec

sudo stty -F /dev/ttyUSB0 9600 -parity cs8 -parenb -parodd -crtscts

Et ensuite on peut envoyer le fichier source avec

ascii-xfr -nsv -l 500 -c 5 day-3-1.applesoft.basic > /dev/ttyUSB0

Une fois fait, on le lance avec RUN sur l’apple //c, et dès qu’il est prêt, on envoie les données (avec 7 secondes entre chaque ligne pour laisser le temps au petit processeur à 1MHz de traiter son petit algo en O(n²) (le code est là ainsi que ci-dessous), et 30ms entre chaque caractère pour éviter des erreurs de communication.

ascii-xfr -nsv -l 7000 -c 30 inputs/3.txt > /dev/ttyUSB0

Et voilà le travail !

NEW

10 REM Init counters
15 SUM = 0
16 NL = 0
17 DUP = 0

20 INPUT "Line (empty to stop):"; LINE$
22 IF LINE$ = "" THEN GOTO 200

25 NL = NL + 1
30 L = LEN(LINE$)
40 HALF = L / 2

49 REM For debugging purposes
50 FH$ = LEFT$(LINE$, HALF)
60 SH$ = RIGHT$(LINE$, HALF)
65 PRINT "Halves: "; FH$; ", "; SH$

69 REM Loop on the first half
70 FOR I = 1 TO HALF
80 C$ = MID$(LINE$, I, 1)

89 REM Loop on the second half
90 FOR J = HALF + 1 TO L
100 O$ = MID$(LINE$, J, 1)

109 REM Found the same character
110 IF C$ = O$ THEN GOTO 140

120 NEXT J
130 NEXT I

135 REM Being there is not normal
136 PRINT "Did not find duplicate!"
137 GOTO 20

140 REM Figure the priority
141 DUP = DUP + 1
142 V = ASC(C$)
145 PRIO = 0

146 REM Ascii code for "a" is 97
147 REM prio for a-z is 1-26
148 REM hence substract 96
150 IF V > 96 THEN PRIO = V - 96

156 REM Ascii code for "A" is 65
157 REM prio for A-Z is 27-52
158 REM hence substract 65-27
160 IF V < 91 THEN PRIO = V - 38

170 SUM = SUM + PRIO

174 REM For debugging purposes
175 PRINT "Found ";C$;"
180 PRINT NL; " lines ";DUP;" dups"

189 REM Now go read next line
190 GOTO 20

199 REM We are done!
200 PRINT "Sum is: ";SUM