Dal momento che prima delle feste abbiamo comprato casa, e di conseguenza mi sono ritrovato piuttosto impegnato per accollarmi anche Advent of Code, eccoci qui a Pasqua a risolvere i problemi di AOC 2024.
Per penitenza, ho scelto di provarci in C, linguaggio che ho usato per l’ultima volta un decennio fa e di cui non ricordo quasi nulla. Ma siccome ho intenzione di realizzare prossimamente alcuni progetti hardware, ho colto l’occasione per dargli una rinfrescata.
Qui tutte le soluzioni: https://github.com/michelefenu/advent-of-code/tree/main/advent-of-code-2024
Day 1: printf(“Hello World!”)
Come facilmente prevedibile, ho impegnato il 90% del tempo per ricordare le basi del C e fare il parsing dell’input e il 10% per risolvere il problema. Ma spero che questa proporzione si inverta andando avanti.
Day 2: The brute side of the force
Dopo aver cercato di riciclare l’approccio usato ieri, ovvero quello di passare l’input su stdin quando si lancia l’applicazione e di leggerlo con una normale scanf, ho deciso di cambiare stratagemma, usando fgets per leggere direttamente il contenuto del file riga per riga ed avere un minimo di flessibilità in più.
La prima parte è andata comunque via abbastanza liscia, mentre la seconda mi ha fatto dannare, dapprima perché ho cercato di scrivere un algoritmo complicatissimo e incomprensibile e poi perché ho perso un edge case che ha messo a dura prova la mia autostima.
Alla fine ho scritto un algoritmo molto più semplice che fa uso della forza bruta per scartare uno alla volta i livelli problematici e marcare la riga come safe o unsafe. Ad ogni modo, giorno 2 completato.
Day 3: C language and pattern recognition, what could go wrong?
Il giorno tre è andato più liscio del previsto. Dopo aver tentato invano di riconoscere i pattern mul(x,y) utilizzando delle regex, che ancora non ho ben capito quanto siano supportate, ho dovuto desistere (e menomale!).
Ho quindi ripiegato su un piccolo automa a stati per riconoscere i vari token e si è rivelata la scelta vincente perché è bastato aggiungere qualche stato per gestire quanto richiesto dalla parte due.
Sto nuovamente prendendo confidenza col linguaggio, e infatti devo dire che il codice del giorno tre - per quanto perfettibile - fa molto meno schifo di quello dei giorni precedenti.
Day 4: Bruteforce again?
Per risolvere la prima parte ho semplicemente cercato la parola XMAS in tutte e 8 le direzioni possibili per ogni punto della griglia, andando di volta volta a verificare che le parole ricadano all’interno dei bordi della board e restituendo il conteggio da ogni posizione.
Per la seconda parte l’approccio è stato simile. Per ogni posizione sono andato a semplicemente controllare le configurazioni legittime per la scritta X-MAS. Verificato che il carattere centrale sia una A, si tratta solo di verificare 4 configurazioni possibili.
Questa volta ho cercato di allocare dinamicamente gli array piuttosto che accroccare, definire alcuni tipi e cercare di tenere tutto abbastanza ordinato.
Day 5: Back to JS for today
Dopo aver perso due ore a cercare di fare il parsing dell’input in C mi sono arreso e ho risolto questo giorno in JavaScript. Da domani si riprova col C.
Day 6: Mazes
Oggi non c’è un input complicato da leggere, quindi torniamo al C. Entrambe le parti sono state abbastanza veloci da risolvere, forse complice la fortuna di aver azzeccato al primo colpo il metodo per individuare i loop nella seconda parte.
Ho ignorato completamente i consigli sulla rappresentazione indicati nel testo del problema e ho semplicemente ipotizzato che si verifichi un loop se la guarda passa nella stessa posizione più volte, andando nella stessa direzione dell’ultima volta che è passata di là.
Day 7:
…to be continued…