Advent of Code 2020 – Weihnachtsstimmung mal anders

„Machst du auch beim Advent of Code mit?“, fragte mich ein Kollege im November. Ich bin noch kein halbes Jahr bei Method Park, kenne das Format also auch nicht vom Vorjahr. Lass mal schnell recherchieren: Es geht los am 1. Dezember und es gibt jeden Tag ein Problem mittels Code zu lösen. Als alter Project-Euler-Tüftler muss ich da nicht lange überlegen. Na klar bin ich dabei!

Kompetitiv oder kooperativ?

Ich erfahre, dass der Park diese Art der freiwilligen Mitarbeiterweiterbildung schätzt und fördert. Wir dürfen in der Adventszeit eine Stunde pro Tag an den Code-Rätseln knobeln und es gibt täglich zwei feste Termine in Microsoft Teams. In diesen beiden „Therapiegruppen“ wird über die Probleme debattiert, gerätselt und geflucht. Man solle sich auch gerne zum Pair-Programming zusammenfinden und die Probleme gemeinsam lösen, heißt es.

Gemeinsam? Denkste. Als ich zum ersten Mal in der Morgengruppe anwesend bin – das Tagesproblem noch vor mir – haben alle Anwesenden ihr Tagespensum bereits vor Arbeitsbeginn gelöst. Der frühe Vogel sammelt die meisten Punkte.

Wie ich später höre, wird die Sache in der Nachmittagsgruppe anders gehandhabt. In der Morgengruppe jedoch treffen sich vornehmlich diejenigen, die schon um 6 Uhr morgens mit dem Finger auf F5 vorm Rechner sitzen, um ohne Zeitverlust mit dem Lösen zu beginnen. „Dafür so früh aufstehen?“ – Ende Dezember saß ich selbst früh in der Dunkelheit und weihnachtlichen Stille, durchbrochen nur vom Klackern der F5-Taste.

Ich nutzte diese Gelegenheit, um mal wieder eine neue Programmiersprache zu lernen und meine Wahl fiel auf Julia. Julia ist eine Sprache, die momentan in der wissenschaftlichen Community wächst und mich schon länger interessiert. Von der Syntax und Lesbarkeit finde ich sie mit Python vergleichbar. Leider wurde die Einrückung nicht übernommen, sondern das end von Pascal wiederbelebt.

Method Park Ninja Advent of Code 2020

Two problems a day keep the doctor away shrink close by

Nach anfänglichen Aufwärmübungen zum Einlesen von Dateien, regulären Ausdrücken und Umgang mit mehrdimensionalen Arrays wurde es für mich spätestens mit Tag 7 spannend. Hier müssen Säcke in Säcke in Säcke usw. gepackt werden nach abstrusen Flugregularien – ähnlich wie die Sache mit den Flüssigkeiten. Dieses Problem hätte ich gerne mit Graphalgorithmen gelöst. Wenn ich nur verstanden hätte, wie die Graph-Library funktioniert. Am Ende macht es dann doch die Rekursion.

Für Tag 8 mussten wir eine Art Assembler-Code interpretieren und durch Austausch von Instruktionen zur Termination bringen. Die alten Hasen wurden hier ganz hoffnungsvoll, denn im AoC 2019 hat sich der Intcode großer Beliebtheit erfreut. Leider war dies aber die letzte Aufgabe dieser Art.

Tag 10 war der erste, bei dem auch die Zeit fürs Debuggen zweistellig wurde (zumindest in meiner Erinnerung). Code, bei dem man schwören könnte, dass der doch funktionieren muss. Schließlich sieht er nach dem vierten Neuschreiben im Kern wieder gleich aus. Wahrscheinlich war auch jede Iteration korrekt, wenn man ihn denn nur auch auf das eine Element am Rand angewendet hätte.

Es wird kniffliger, zur Not mit Mathe

Für mathematisch Interessierte war Tag 13 eine Freude. Wie so oft funktioniert die erste Hälfte der Problemstellung noch mit dem hemdsärmeligen Algorithmus, den man im frühmorgendlichen Koffein-Adrenalinrausch in die Tasten gepresst hat. Beim zweiten Teil blinkt auch noch nach 30 Minuten nur ein Cursor in der Konsole. Also Strg+C und schlauer denken…

Ich glaube, das war das erste Mal, dass ich ins zugehörige Reddit-Forum schaute: natürlich, der chinesische Restsatz! Leider zu gut verkleidet oder zu viel Tunnelblick. Man hört von einigen, deren Algorithmus für das CRT Wolfram Alpha heißt. Ich hatte noch genügend Programmierbenzin im Kessel.

Der Tag 19 war einer, für den ich fürchterlich lange gebraucht habe. Dabei war Teil 1 noch lustig. Die Regeln konnte man nämlich programmatisch in einen gigantischen Regex übersetzen und einfach dem die Arbeit überlassen.

Teil 2 war wegen selbst referenzierender Regeln damit nicht mehr zu machen, so weit so klar. Was man jedoch aus folgendem Hinweis Verwertbares machen sollte, war (mir) leider nicht klar:

(Remember, you only need to handle the rules you have; building a solution that could handle any hypothetical combination of rules would be significantly more difficult.)

Mit mehreren Tagen Verspätung habe ich vermutlich doch – in Ermangelung von vereinfachenden Abkürzungen – das generelle Problem gelöst.

Am Tag 20 konnte ich mich zum ersten (und einzigen) Mal freuen, in der firmeninternen Gruppe der erste mit einer Komplettlösung zu sein. So wie auch die Beschreibung des Problems war der Code zur Lösung hier am umfangreichsten.

Es war aber auch fies: neun Bildkacheln in jeder Rotation, Spiegelung und korrekt permutiert so zusammensetzen, dass die Zwischenränder passen. Und im resultierenden Bild dann noch Mustererkennung – pardon – Monstererkennung machen.

Advent of Code bedeutet: 25 Tage Hirnschmalz

Insgesamt haben mir besonders die Spiele mit den Elfen und den beiden Krabben Spaß gemacht. Auch die in Gedenken an John Conway präsentierten drei Spielarten (Tag 11, 17, 24) von Game of Life bzw. zellulären Automaten waren schön. Weitere Themen waren das Brechen zweier Verschlüsselungen (XMAS, RSA), das Dechiffrieren fremder Sprachen/Symbole und vor allem Schleifen in Schleifen in Schleifen in Schleifen etc.

Von Julia bin ich insgesamt äußerst angetan, weil es zum einen funktional angehaucht ist und andererseits sehr stark wegen Multiple Dispatch. Warum haben das nicht mehr Sprachen? Es geht schließlich auch äußerst schnell. Interessierte finden hier meine lose zusammengetragenen Gedanken.

Mein Fazit zum Advent of Code

Advent of Code ist ein großartiges Format, um an trüben Wintermorgen und -tagen die Hirnmuskeln zu trainieren und eine neue Sprache zu lernen. Nächstes Jahr könnte ich so viel geschickter an die Sache gehen. Wenn mir meine Freundin nur nicht verboten hätte, da noch mal mitzumachen. ?