Advent of Code 2025
29 grudnia 2025
Eric Wastl, twórca Advent of Code zdecydował, że w tym roku AoC będzie trwało tylko 12 dni, zamiast pełnych dwudziestu pięciu, jak do tej pory. Rozumiem go, widać ogrom pracy, jaką w to wkładał co roku. Można się wypalić, można poczuć znużenie. Niemniej chwała mu za to, że znalazł formułę, która działa dla niego i dla nas wszystkich, biorących udział.
W tym roku zadania rozwiązywałem z użyciem Common Lispa. Nie jest to pierwszy raz, kiedy użyłem jakiegoś Lispa: rok temu używałem Clojure, a w 2022 – Racket. W obu pisało mi się bardzo dobrze. Mimo że niektóre algorytmy w swojej kanonicznej postaci są imperatywne, opierają się na tablicach i pętlach oraz modyfikują dane w miejscu, ich wersje funkcyjne, używające danych niezmiennych (immutable) są łatwe w implementacji i wystarczająco szybkie, by rozwiązać zadania z Advent of Code.
Podejrzewałem, że w tym roku będzie podobnie, że zaimplementuje algorytmy na funkcyjny sposób, bazując na umiejętnościach zdobytych w czasie poprzednich edycji zabawy. A jednak Common Lisp mnie zaskoczył.
Nie posługuję się płynnie tym językiem. Właściwie można powiedzieć, że uczyłem
się go, implementując rozwiązania zadań. Idiomy programowania funkcyjnego –
map, cond, rekurencja itd. – są tu obecne, można ich swobodnie używać. Ale
odkryłem, że CL zawiera także bardzo praktyczne mechanizmy iteracyjne.
Przykładowo, deep-first-search mogłem zaimplementować równie wygodnie za
pomocą rekurencji, co iteracji. Mogłem dobrać pasującą implementację do
konkretnego problemu i w żadnym wypadku nie miałem poczucia, co czasami mi się
zdarzało w Clojure, że łapię się prawą ręką za lewe ucho.
Tegoroczne AoC zostawiło mnie z przeświadczeniem, że Common Lisp jest dużo bardziej praktycznym językiem, niż myślałem. Mam ochotę poznać go lepiej, napisać coś więcej niż proste, bądź co bądź, rozwiązania algorytmicznych zagadek.