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 :
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