È la mattina di Natale, sono le 8 e tutti dormono ancora. Per la prima volta arrivo al 25 con tutti i problemi di Advent of Code dei 24 giorni precedenti completati (incredibile!), e si sa che il problema del 25 è di solito facilotto e consiste in una parte sola. Caffè nel silenzio della casa dei miei, ritmato solo dal vario russare di genitori, moglie e figlia che filtrano dalle porte, e anche le ultime stellette sono conquistate.
È Santo Stefano, e, a ventiquattro ore dalla mia conclusione dell'edizione 2024 di Advent of Code (in seguito AOC), butto giù qualche considerazione.
- Inizio col dire che, nonostante sia la decima edizione, e la sesta che faccio in diretta a dicembre, mi sono divertito. L’idea resta intrigante, ci sono sempre cose nuove da imparare, e il formato (incluse le discussioni sul socialino di nicchia) è proprio bello. Come sempre, complimenti a Eric Wastl per l’idea e lo sforzo organizzativo, e ai miei amici immaginari per aver giocato il gioco insieme, tastiere che fanno clickete-clackete comprese.
- Ho trovato l’edizione di quest’anno più facile di quelle degli anni passati: non vuole necessariamente dire che lo fosse, forse sono migliorato io, forse certi trucchetti per rendere i puzzle difficili cominciano ad apparirmi chiari da subito grazie all’esperienza. Sta di fatto che è la prima volta dal 2019 che chiudo AOC nei tempi canonici ed entro la mattina di Natale, e non nei giorni successivi.
- A posteriori, penso che chi si lamentava su Reddit del fatto che parecchia della difficoltà stesse nei testi a volte oscuri o arzigogolati dei problemi, e non tanto nella complessità della soluzione, non avesse del tutto torto. A me la cosa non è necessariamente spiaciuta: anche saper decodificare le informazioni in un testo oscuro è risolvere un enigma, ma posso capire che la cosa possa non piacere a tutti. Che la capacità di decodificare un testo scritto stia veramente diventando meno diffusa meriterebbe veramente un discorso a parte.
- Mi pare che il tema ricorrente di quest’anno fosse la ricorsione. Una soluzione ricorsiva (spesso con qualche forma di backtracking) era l’unica strada per risolvere certi problemi, per cui una soluzione “greedy” non era proprio possibile. La ricorsione e il backtracking sono cose che ho imparato a conoscere e usare facendo AOC (chi mai le usa per risolvere questioni di fisica delle particelle?), ed è stato dunque un buon ripasso, a volte laborioso, ma mai impossibile.
- Ho trovato la varietà dei puzzle meno stimolante degli anni passati. O meglio, ci sono state cose che saltavano spesso fuori nelle edizioni passate di AOC che mi sono mancate. Quest’anno niente automi cellulari, niente mappe infinite o tridimensionali, poca o niente matematica per aggirare problemi altrimenti insormontabili (i rari casi in cui serviva una soluzione matematica chiusa, questa era piuttosto elementare - tipo un sistema di due equazioni lineari). Peccato.
- Non c’è stato quest’anno nessun puzzle per cui io abbia detto “non so assolutamente come risolverlo, devo andare a guardare una soluzione di qualcun altro”. Ci sono stati momenti in cui certi dettagli dell’implementazione pratica mi sfuggivano, ma mai l’idea di base. Una cosa che mi ha aiutato è stata forse il lasciare decantare i problemi: lettura del testo appena sveglio, ma attacco del problema solo a un certo punto nella giornata, con un po’ di tempo di riflessione - guidando in auto verso l’ufficio, camminando - che si è rivelato utile per iniziare a scartare soluzioni inefficienti nella mente prima ancora di iniziare a implementarle.
- Ho risolto i problemi in Python, che è in questo momento il mio linguaggio di elezione per la maggior parte delle cose che faccio professionalmente. Dal 2019, quando ho veramente iniziato a usarlo, a oggi sono decisamente migliorato. Quest’anno ho cercato di usare qualche libreria esterna per impratichirmi di più (networkx per la soluzione dei grafi, e graphviz per disegnarli, che conoscevo solo di nome e che ho provato a usare per disegnare la rete del giorno 24).
- I miei problemi preferiti dell’anno sono stati anche quelli che mi hanno dato più filo da torcere: il giorno 17 (risolto in aeroporto - e in aereo! - andando e tornando da Parigi per la discussione di una tesi di dottorato!), il 19 e il 21 (simili nella difficoltà imposta dalla seconda parte, e anche nello stile della soluzione), e il giorno 24. Tutti questi avevano in comune - manco a dirlo - la necessità di una soluzione ricorsiva, perché un algoritmo “greedy” non poteva funzionare (in certi casi per la forma della soluzione, nel giorno 17 o 24, o per la sua taglia, nel 19 o 21). Sono anche i giorni in cui la soluzione richiedeva un po’ di reverse engineering del problema (il giorno 24 ne è stato l’esempio più lampante: di fatto lo ho risolto “a mano”, cercando i nodi mal cablati nello schema della rete), che alla fine sono forse i problemi più stimolanti, che escono dalla sola necessità di individuare e scrivere un algoritmo, più o meno complesso che sia.
- Per la prima volta da tanto tempo, non ho problemi di AOC da risolvere tra Natale e Capodanno. Potrei darmi a qualche visualizzazione, ma siccome ci sono in giro visualizzazioni molto più sofisticate di quelle che potrei mai fare io oggi con le mie scarse competenze (tipo queste), penso che semplicemente lascerò tutto a decantare, dedicandomi ad altro.
- Infine, avrei voluto regalarmi una maglietta del decennale di AOC, ma costa 32$, che diventano circa 60 una volta considerate tasse e spedizione in Europa! Un po’ troppo, peccato...
Lascio qui le mie soluzioni, se qualcuno volesse dare un'occhiata all'orribSPLENDIDO codice che ho scritto... 😉
Juhan dice
Bravo (come al solito) ma una domanda, probabilmente sciocca: visto che Python (e le sue librerie) lo conosci bene perché non provare (nel '25) qualche nuovo linguaggio? Per esempio Julia.
Ssscancella se inappropriato ma per intanto buone feste!
Marco dice
Due ragioni: anche in Python ho ancora parecchio da imparare (certe librerie esterne, per esempio), e poi a dire il vero il tempo che ho da dedicare a questo giochino è poco, per cui Python si presta benissimo a lavorare rapidamente nei ritagli di tempo.