È il 20 gennaio, e l'Avvento è finalmente finito. Ovviamente non parlo dell'Avvento inteso come il periodo di attesa che precede il Natale: quello si è concluso come si conviene il 25 dicembre scorso. L'Avvento a cui faccio riferimento è Advent of Code, una sorta di calendario dell'avvento fatto di piccoli problemi e rompicapi di programmazione inventato qualche anno fa da Eric Wastl. Con la scusa di una storia che ruota intorno al tema del Natale (quest'anno tutti i rompicapi avevano a che vedere con un viaggio nel sistema solare per raggiungere Babbo Natale), ogni giorno Eric pubblica un nuovo problema, da risolvere con un programmino scritto nel linguaggio preferito. Il sito fornisce qualche genere di input al problema (una mappa, una serie di istruzioni, un valore numerico) sotto forma di file di testo, e valida il risultato (di nuovo un numero numerico, o una stringa di caratteri) per assegnare una stella nel caso di una risposta corretta. Ogni giorno Advent of Code propone due problemi, il secondo accessibile solo dopo aver risolto il primo: si tratta sempre di una variazione del tema iniziale, spesso perso con condizioni al contorno più complete, che obbligano a ripensare la prima soluzione in un ambito più generale. Ci sono programmatori professionisti che partecipano in modo competitivo, altri invece che approfittano l'occasione per imparare un nuovo linguaggio di programmazione, altri ancora che usano i rompicapo come esercizi per i loro corsi universitari. E poi, almeno da quest'anno, ci sono i fisici delle particelle come me.
Come sono arrivato a Advent of Code? Sul quel socialino di nicchia che continua a essere uno dei social che frequento di più in rete, uno dei miei amici immaginari a inizio dicembre ha segnalato l'iniziativa. Presi dall'entusiasmo, un paio di informatici, un'ingegneressa, un matematico e il sottoscritto ci siamo messi partecipare, un po' in giocosa competizione tra noi, un po' (soprattutto) con la scusa di condividere gli sforzi, i problemi incontrati e le soluzioni, magari persino aiutandoci a vicenda. Un po' perché i miei amici immaginari ed io abitiamo in Europa (e Eric pubblica i problemi a orari impossibili per chi vive qui), un po' perché tutti quanti abbiamo lavori e famiglie che non ci permettono di dedicare a questi giochini il tempo che richiederebbero, non abbiamo certo partecipato in modo competitivo. Per me, la motivazione principale è stata invece sforzarmi di formulare le mie soluzioni in Python, un linguaggio che uso per lavoro ma non conosco (conoscevo!) abbastanza bene da potermi dire esperto, con lo scopo di imparare ad usarlo meglio.
Dicevo dunque che oggi, 20 gennaio 2020, ho finalmente terminato Advent of Code 2019. Ben oltre il 25 dicembre 2019, dunque! Un po' per la difficoltà crescente degli ultimi problemi, un po' perché il tempo da dedicarci prima di Natale (e durante le vacanze) si è ridotto drammaticamente rispetto a quello disponibile all'inizio di dicembre, ho finito i problemi dei quattro giorni che ancora mi mancavano nei ritagli di tempo delle ultime due settimane. Non vi tedierò con i dettagli dei problemi e delle mie soluzioni: i primi sono ormai liberamente accessibili sul sito, mentre le mie soluzioni sono consultabili qui (questo vale anche per le immagini che trovate in questo articolo: se siete curiosi di sapere a che cosa corrispondono, andate a scavare tra problemi e soluzioni). Mi interessava invece segnalare alcune cose che mi sembra di aver imparato nel corso di questa divertente esperienza. Ecco qui:
- La formazione influenza fortemente il modo con cui affrontiamo i problemi. Dicevo che tra i miei compagni di avventura c'erano informatici, ingegneri e matematici. Confrontando gli approcci scelti per affrontare i vari problemi (specie quelli della prima metà dell'Avvento, sufficientemente semplici da permettere approcci anche molto diversi) mi sono reso conto che avevamo modi spesso radicalmente opposti di analizzare i problemi e immaginare le soluzioni. Informatici e ingegneri hanno mostrato una certa preferenza per il rappresentare i problemi in maniera "discreta", immaginando strutture semplificate per rappresentare i dati, e soluzioni rapide e efficienti per trovare le risposte. Il fisico (io!) sembra invece preferire astrazioni tridimensionali, e pensare subito a soluzioni le più generali possibili, spesso a scapito dell'efficienza. Un certo problema, per esempio, descriveva due fili, rappresentati da una serie di coordinate bidimensionali, i cui tratti potevano incrociarsi, e chiedeva di contarne appunto gli incroci. Il sottoscritto ha descritto i fili come una serie di segmenti nel piano, scrivendo poi un programma che cercava le eventuali intersezioni di ogni coppia di segmenti. Almeno un paio dei miei colleghi hanno invece descritto il tutto come una matrice di punti, cercando le intersezioni come proprietà dei punti sulla matrice. Il matematico ama lavorare con precisione infinita, il fisico non disdegna le approssimazioni: un altro problema richiedeva di contare una certo numero di oggetti nello spazio, cosa che per me era evidentemente un problema di trigonometria, mentre per il matematico l'idea di usare funzioni trigonometriche con numeri interi rappresentava un'eresia inaccettabile. Confrontare le mie soluzioni con quelle degli amici con formazioni e mestieri diversi è stato dunque molto formativo.
- Nonostante io sia un fisico, ci sono branche (anche relativamente accessibili) della matematica che non conosco per niente. Questo potrebbe sembrare ovvio, ma la mia tendenza è sempre stata quella di pensare che tutta la matematica che non conosco è matematica difficile e avanzatissima. Diversi problemi di Advent of Code mi hanno insegnato invece che ci sono aspetti della matematica anche potenzialmente accessibili di cui semplicemente non ho mai sentito parlare, semplicemente perché in quanto fisico non ho ragione di conoscerli e usarli. È il caso per esempio degli aspetti fondamentali della teoria dei numeri, o dell'aritmetica modulare, che stanno alla base per esempio delle crittografia, e che invece io non conoscevo per niente e le cui basi ho dovuto imparare per risolvere uno specifico problema.
- La stessa ammissione di ignoranza vale anche per molti algoritmi di calcolo. I fisici studiano certamente programmazione all'università, ma gli argomenti toccati sono molto orientati alle necessità specifiche del fisico: risoluzione numerica di equazioni, calcolo differenziale, simulazioni Monte Carlo. Di fatto, non studiamo niente di, per esempio, algoritmi di ricerca e navigazioni di grafi, che, da quanto ho potuto imparare, sono tra le altre cose alla base dell'esplorazione dei labirinti.
- L'approccio didattico di Advent Of Code funziona molto bene. Mentre dedicavo le mia pause caffè (prima) e qualche nottata (verso la fine) a risolvere i problemi di quest'anno ho pensato che il meccanismo "un problema la giorno di difficoltà crescente, con un po' di competizione a motivare i solutori" funziona molto bene. La conquista di una stella mi ha sempre portato un grande senso di soddisfazione, l'attesa del prossimo problema un grande anticipazione, e la dimensione competitiva, anche solo in un gruppetto scalcagnato di amici, una buona motivazione a continuare. Penso che un meccanismo simile, magari con tempi diversi, si possa usare con successo per i "compiti a casa" di un corso universitario di qualunque disciplina.
- Certi aspetti specifici di Advent Of Code 2019 non funzionano molto bene dal punto didattico. Non so dire se fosse una caratteristica di quest'anno, o se il formato fosse simile anche nelle edizioni precedenti, ma quest'anno ogni giorno dispari aveva un problema basato su un programma (o l'estensione di un programma) realizzato nei giorni precedenti. La cosa aveva il suo fascino, ma posso immaginare che abbia frustrato più di un partecipante che non fosse riuscito a risolvere correttamente uno dei problemi precedenti necessari a continuare. Rendere la soluzione di un rompicapo sistematicamente dipendente dall'aver risolto un rompicapo precedente può facilmente alienare parte del proprio uditorio, e non è qualcosa che userei con leggerezza in un corso. La cosa non mi ha toccato personalmente, ma ha rappresentato un problema per almeno uno dei miei compagni di avventura, ed è stato un peccato.
- Imparare cose nuove è molto gratificante. Partecipare a Advent of Code 2019 mi ha obbligato a "uscire dalla mia zona di conforto" intellettuale, e ho dovuto dedicare un po' di tempo a imparare le basi di nuova matematica, qualche nuovo algoritmo, e diversi dettagli sull'uso di un linguaggio di programmazione che non conoscevo così bene. A qualunque età, imparare è allo stesso tempo faticoso, divertente e gratificante, e non bisognerebbe mai smettere!
In conclusione, grazie a Agnello per aver segnalato la sfida, a Zar, Frugola, Dario, Larsen per aver attivamente partecipato e condiviso, e pure a .Mau. e Ghira per aver lurkato le nostre discussioni ed aver di tanto in tanto espresso qualche opzione o dato un suggerimento. Lo rifacciamo l'anno prossimo, d'accordo? Oppure ci lanciamo su Project Euler?
Luigi Buccelletti dice
BUENO
Oriella dice
è una mia impressione o non è ottimizzato per mobile?
Marco dice
Ciao Oriella, ti riferisci al blog? Da qualche anno uso un tema responsive che dovrebbe scalare perfettamente su dispositivi mobili, e di fatto lo fa sul mio telefono (un iPhone SE con schermo "piccolo"). Cosa vedi dal tuo che ti disturba?
Se invece ti riferisci a Github che ospita il codice delle mie risposte, anche quel sito mi pare risponda bene a dispositivi mobili, anche se forse non è il modo migliore per vederne i contenuti.