Shownotes & Links
- Advent of Code
- Eric Wastl auf Twitter
- Jans Lösungen
- Isabels Lösungen Prolog
- Isabels Lösungen Kotlin
- Max' Lösungen
- AoC-Subreddit
- Projekt Euler
- Exercism
- 4clojure
Transkript
Lucas: Hallo und herzlich willkommen zu einer neuen Folge des INNOQ Podcasts. Heute sprechen wir über den Advent of Code und dafür habe ich mir gleich drei Leute eingeladen. Stellt euch doch mal ganz kurz vor.
Max: Moin, ich bin der Max.
Jan: Ich bin Jan.
Isabel: Hi. Ich bin Isabel.
Lucas: Super. Und mehr wollen wir heute auch gar nicht mal dazu sagen. Aber wir wollen ein bisschen mehr dazu sagen, was ist eigentlich der Advent of Code? Isabel, magst du mal kurz sagen, was ist denn der Advent of Code?
Isabel: Ja, gerne. Der Advent of Code ist eine Reihe von Programmier-Rätseln, die immer in der Adventszeit erscheinen wie ein Adventskalender. Und der geht über 25 Tage. Ich glaube, es liegt daran, weil das aus Amerika kommt und da wird Weihnachten erst am 25. gefeiert und pro Tag kann man immer ein Rätsel lösen, was aus zwei Teilen besteht.
Lucas: Cool. Und jetzt schieben wir mal ein Spoiler-Warning ein. Also wir werden in dieser Folge über den Advent of Code von diesem Jahr sprechen und es kann sein, dass dabei Spoiler vorkommen. Also, wenn ihr daran arbeitet und ihr wollt keine Spoiler haben, dann müsst ihr noch ein bisschen warten, bis ihr die Folge hören könnt. Aber sonst ist es immer ein bisschen blöd, über so was zu sprechen, ohne dass man dann konkret werden kann. Das nur mal vorab. Genau, wie ist das hier alles passiert? Also bei INNOQ gibt es seit mehreren Jahren so ein Slack Channel, der heißt Advent of Code. Und der schläft das ganze Jahr lang, wacht dann Ende November auf und dann geht es los und da sind einige Leute sehr aktiv und daher hatte die Isabel einfach die Idee, komm lass uns doch mal eine Folge dazu machen, bisschen darüber quatschen, wie das so funktioniert. Und genau deswegen seid ihr drei heute hier.
Jan: Eine gute Idee.
Lucas: Genau. Wie sieht denn so ein Rätsel überhaupt aus, Jan? Wie muss ich mir denn so ein Rätsel vorstellen bei Advent of Code? Isabel sagte, zwei Teile, wie sieht das denn aus?
Jan: Eingebettet ist das alles in so eine Rahmenstory. Man muss natürlich wie immer Weihnachten retten. Details weiß ich jetzt nicht, weil ich muss ganz ehrlich zugeben, dass ich selber die Rahmenstory immer etwas überfliege, dass ich schnell zum eigentlichen Teil des Problems komme. Aber im Rahmen dieser Rahmenstory gibt es dann immer so eine Problembeschreibung. Also als ganz blödes Beispiel: Die Elfen haben ihre Schlüssel im Auto vergessen und man muss rausfinden, wie man in sein Auto reinkommt. Also das ist diese Problembeschreibung. Ja, man muss irgendwie drehen, um die Tür zu öffnen. Und wenn man richtig dreht, passiert irgendwas, wenn man falsch dreht, passiert was anderes. Man bekommt einen Test Input. Mit dem führt man dann dieses Problem mal durch. Da kann man dann gegen programmieren, dann bekommt man eine Lösung raus, die steht in dem Problem drinnen und dann gibt es zum Schluss noch einen richtigen Input und mit dem führt man dann sein Programm aus und das gibt dann die echte Lösung. Und dieser richtige Input, der ist auch pro Person immer unterschiedlich. Das heißt, man kann auch Lösungen nicht einfach kopieren, sondern man muss halt selbst das irgendwie hinbekommen. Und man wird auch vom Veranstalter oder vom Initiator oder vom Betreiber gebeten, diese Inputs nicht zu teilen, weil das halt sonst witzlos ist, wenn andere Leute das ja auch benutzen können.
Lucas: Also das heißt, ich lade da so eine Textdatei runter und dann schreibe ich ein Programm, was diese Textdatei einliest und dann eine Lösung ausgibt. Und die Lösung füge ich dann da ein in die Webseite.
Isabel: Genau, und dann bekommst du so einen virtuellen Stern. Vielleicht noch mal zur Hintergrundstory: Dieses Jahr geht es darum, dass wir für die Rentiere Futter im Dschungel einsammeln müssen, damit die genug magische Energie haben, um Geschenke auszutragen. Und da brauchen sie so eine spezielle Art von Starfruit. Und das ist, was wir sammeln.
Jan: Weihnachten retten.
Isabel: Genau, Weihnachten retten.
Lucas: Wir sollten vielleicht noch kurz eine Sache ergänzen, fällt mir gerade ein. Wir nehmen das noch vor Weihnachten auf. Das heißt also, von unseren drei Gästen hier hat keiner das bisher vollständig lösen können, weil die Rätsel kommen ja immer erst an dem Tag selbst raus. Also man kann nicht einfach schon am 1. Dezember alle Rätsel durcharbeiten, sondern jeden Tag kommt immer nur ein Rätsel raus und deswegen wissen wir auch noch gar nicht, wie es dieses Jahr ausgeht. Das einfach nur mal als Hintergrund, weil die Folge kommt wahrscheinlich nach Weihnachten raus. Und wie ist das? Also, wenn ich da jetzt mitmachen will, wie funktioniert das dann, Max?
Max: Ja, das ist eine Website. Da kannst du dich ganz normal anmelden, auch Single Sign-on mit GitHub funktioniert’s zum Beispiel. Genau, und dann geht das. Dann kannst du auch die Kalender der letzten Jahre machen und natürlich auch dieses Jahres. Kannst, wenn du möchtest auch dein GitHub und Repository auch für den Advent of Code hinterlegen, aber mehr ist das eigentlich nicht. Also ist eigentlich nur eine Website, ganz normale Anmeldung und dann wirst du zu den Aufgaben bzw. zu deinem personalisierten Input zugelassen.
Lucas: Cool. Und muss ich dann was bezahlen?
Max: Das ist komplett kostenlos. Das ist das Schöne daran. Es gibt tatsächlich die Möglichkeit, den Eric Wastl auch zu unterstützen. Unter anderem bei seiner Sushi Sucht, wie er selbst sagt. Und da gibt es auch so ein Batch hinter deinem Namen. Da steht dann A O C++ dahinter. Aber ich meine, da gibt es sonst keine weiteren Benefits, außer eben genau diese Markierung.
Lucas: Cool, aber ist ja schon erstaunlich. Das scheint ja wirklich eine Person zu sein, die das alles von selbst allein macht, ohne dass sie jetzt da bezahlt wird für, oder? Ist mein Eindruck.
Isabel: Ja, das ist richtig. Der Eric Wastl macht das seit 2015 und der nimmt auch jedes Jahr Sponsoren an, um auch die Infrastrukturkosten ein bisschen zu decken. Aber er hat auch, glaube ich, noch einen ganz normalen anderen Job als Softwareentwickler und denkt sich halt über das Jahr diese ganzen Rätsel aus, generiert den Input, generiert natürlich Lösungen, damit er auch überprüfen kann, ob die Lösung, die wir so produzieren, richtig sind. Und das ist schon ziemlich beeindruckend.
Lucas: Ja, klingt auf jeden Fall sehr aufwendig. Wie lange macht ihr denn da schon mit, Max? Ist das dein erstes Jahr oder machst du das schon eine Weile?
Max: Tatsächlich ist es das erste Jahr, dass ich direkt auch selbst mitmache. Ich habe die letzten Jahre, die letzten zwei, drei Jahre, glaube ich, habe ich mir das auch schon angeschaut. Ich weiß gar nicht, warum ich das am Ende nicht mitgemacht habe. Aber dieses Jahr auch durch Vorankündigungen im INNOQ Slack Kanal. Die Leute haben sich schon darauf gefreut, dann musste es mal sein und hat mich mitgerissen. Also nächstes Jahr wieder.
Lucas: Sehr cool. Und Jan?
Jan: Ich habe gerade noch mal nachgeschaut. Das erste Mal habe ich 2019 mitgemacht. 2020 hat sich viel in meinem Arbeitsleben geändert, da habe ich bei INNOQ angefangen, dann habe ich es sausen lassen. 2021 und 2022, jetzt bin ich wieder dabei.
Lucas: Sehr cool. Und Isabel?
Isabel: Ich habe letztes Jahr zum ersten Mal so richtig mitgemacht. Und ich mache das aber so, ich habe das eigentlich das ganze Jahr über so ein bisschen gemacht, weil du halt die Rätsel aus den letzten Jahren ja immer noch lösen kannst. Immer, wenn ich so ein bisschen Zeit und Lust hatte, habe ich da ein Rätsel gelöst. Und ich habe, glaube ich, jetzt insgesamt 2019 bis 2021 gelöst.
Lucas: Cool. Also ich habe traditionell eigentlich immer jedes Jahr, weiß nicht, wann ich angefangen habe, versucht, den Advent auf Code in Haskell zu lösen, um meine Haskell-Erkenntnisse aus der Uni noch mal aufzutauen. Bin dann nach den ersten drei oder vier Tagen frustriert gewesen, dann habe ich wieder aufgehört. Also die habe ich dann immer geschafft und dann habe ich aufgehört und das habe ich dieses Jahr mal übersprungen. Genau, aber vielleicht hole ich es ja dann noch nach. Aber dann mal zu eurer Motivation, wieso macht man denn so was mit? Also was ist euer Grund das zu machen, Jan?
Jan: Ich finde das immer eine gute Gelegenheit, erstens so ein bisschen zu programmieren und auch das einfach auf der grünen Wiese mehr oder weniger zu tun. Ich meine, es gibt auch Leute, die lösen das dann irgendwie mit Octave oder irgendwelchen symbolischen Mathematik Programmen oder ähnlichem. Letztendlich ist nur wichtig, dass man hinterher die richtige Eingabe bekommt und das ist schon irgendwie sehr nett, man kann ja auch sämtliche Hilfsmittel in Anführungszeichen benutzen. Und das Interessante ist, das ist trotzdem halt nicht trivial. Und ich meine natürlich auch so ein bisschen der Wettbewerbsgedanke. Also erstens natürlich Wettbewerb. Ja, ich bin der Erste, Schnellste, Beste, wie auch immer, mein Code ist der schönste, das ist natürlich am einfachsten, aber das auch von anderen Leuten zu lernen, wie löst man das elegant. Weil meistens gibt es tatsächlich eine elegante Lösung. Also das finde ich interessant, aber primär ist es einfach die Möglichkeit, mal einfach mit irgendeiner Programmiersprache rum zu coden. Mit Problemen, die jetzt nicht so ganz weit weg vom tatsächlichen, vom täglichen Leben sind.
Lucas: Und Isabel, für dich?
Isabel: Ich mag das, weil das oft so algorithmische Probleme sind, wo man mal richtig Algorithmen rauskramen kann und die dann anwenden kann, die man vielleicht mal in der Uni gelernt hat. Und du hast ein Problem und du willst das lösen, und es ist halt nicht trivial. Und das ist einfach mal eine nette Abwechslung zum Arbeitsalltag, wo man ja vielleicht doch manchmal so Sachen macht, die jetzt nicht so algorithmisch das super Schwerste oder super Tollste sind.
Lucas: Gerade so Graphenalgorithmen macht man selten im Berufsalltag.
Isabel: Ja, braucht man selten oder irgendwelchen Input parsen und dann darauf was auch immer machen oder Game of Life kommt auch schon mal vor und das brauchst du ja sonst nicht so.
Lucas: Cool. Und für dich, Max?
Max: Ja, tatsächlich gibt es ja viele Gründe, das zu wollen, oder nicht? Bei mir ist es aktuell so, ich habe sehr viel Spaß daran, dadurch, dass ich aktuell im Projekt einfach nicht programmiere. Und dann ist es eine sehr schöne Abwechslung, auch mal wieder irgendwie Low Level Code zu basteln, Probleme zu lösen und an diesem einen Tag, den du ja meistens daran sitzt, also du sitzt nicht den ganzen Tag daran, aber auf jeden Fall innerhalb eines Tages auch ein Ticket lösen zu können, also eine Aufgabe lösen zu können und ein Erfolgserlebnis zu haben, das ist ganz schön. Außerdem kommt dazu, dass man sich die Technologie ja aussuchen kann. Ich hab, glaube ich, im Projekt seltenst was mit GO gemacht und ich mache das einfach total gerne. Ich mag das und ich habe halt GO mal wieder ausgekramt. Und genau, das ist halt sehr schön. Jan hat eben was zu Wettbewerb gesagt. Da ist mir eingefallen, wir haben auch noch gar nicht darüber gesprochen. Es gibt den Leader Board, einmal ein globales Leader-Board, damit die schnellsten Leute zu sehen sind. Es gibt aber auch private Leader Boards und da kann man eben sehen, wie Leute, mit denen man zusammen arbeitet oder anderweitig zusammen zu tun hat, wie andere Leute abschneiden, wie schnell sie waren oder auch wie viel Problem sie bisher gelöst haben. Das ist auch immer eine ganz schöne Sache, sich so ein bisschen zu messen, auch wenn das Bewertungssystem jetzt nicht wirklich wettbewerbsreif ist.
Jan: Ist nicht sehr transparent. Man bekommt quasi Punkte dafür, wie viele Leute es gibt. Da bekommt der Erste dann diese Anzahl an Punkten und der Zweite bekommt dann diese Anzahl -1 usw., das heißt, der letzte bekommt wahrscheinlich nur einen Punkt. Also die Ergebnisse kann ich mir allerdings so richtig jetzt auch nicht erklären. Das ist schon etwas kompliziert.
Isabel: Aber darum geht es ja auch meistens nicht.
Jan: Max, du hattest gesagt, auch mit der Kleinheit, der Überschaubarkeit, der Probleme. Ich glaube, das ist auch das, was mich sehr anspricht, dass man das einfach komplett lösen kann in einem Tag. Und im restlichen Leben sind halt fast keine Probleme so zu lösen, dass man sagt, ich steck da jetzt ein paar Stunden rein oder eine Stunde und dann ist es fertig und korrekt und das weiß ich.
Isabel: Und was auch schön ist, dass du nicht so einen Overhead hast. Wenn du jetzt ein Projekt hast, dann musst du erst dich darum kümmern, dass es deployed und alles Mögliche drumherum machen. Und da hast du einfach nur, du suchst dir irgendeine Sprache, musst maximal schauen, wie setze ich die auf meinem Rechner auf und dann kannst du loslegen. Und das ist schön.
Lucas: Und ist die Aufgabenstellung so klar, dass man dann direkt loslegen kann oder braucht man auch eine Weile, bis man die erst mal verstanden hat?
Max: Ich glaube, da kommt es darauf an, wen du fragst, wie immer. Also das habe ich mir tatsächlich auch irgendwann aufgeschrieben, dass ich das total gut finde, dass man hier wirklich mal Aufgaben hat, da weiß ich, was zu tun ist und die verstehe ich auch. Aber it depends. Es gibt sicherlich Leute, die halt auch da mal über eine Aufgabe meckern, weil sie doppeldeutig zu verstehen ist oder so. Aber grundsätzlich ist es sehr gut geschrieben.
Isabel: Bei den meisten Problemen ist es ja auch so, dass das dann immer anhand eines kleines Beispiel erklärt wird. Der richtige Input ist meistens so groß, dass du es nicht per Hand lösen kannst. Aber in der Erklärung gibt es oft ein kleines Beispiel, wo dann auch ganz klar so schrittweise erklärt ist, was ist der Input und was soll am Ende damit passieren und wie wird das gemacht? Und auch so, dass du es noch per Hand nachvollziehen kannst. Und das hilft halt total dabei, die Aufgabe zu verstehen.
Lucas: Ja, das ist cool.
Max: Also auf Basis dieser Tests Input, was für alle gleich ist, schreibt man ja irgendwie auch die Tests für den Code, den man da produziert. Und bei mir ist es auch schon vorgekommen, dass beim Test Input da alles super gelaufen ist, aber mein echtes Ergebnis war aus irgendwelchen unerfindlichen Gründen dann falsch. Das passiert auch, aber meistens funktioniert es tatsächlich auch so, dass die ganzen Randfälle schon abgedeckt sind, die auch im benutzerdefinierten Input dann vorkommen können.
Jan: Das finde ich eigentlich immer am schwierigsten an der Beschreibung, was ausgeschlossen wird. Also man kann generell davon ausgehen, dass da keine gemeinen Randbedingungen drin sind, aber oft sind halt dann doch irgendwelche Sachen, die nach der textuellen Beschreibung erlaubt sind und auch im Input auftauchen oder erlaubt sind, aber nicht auftauchen können. Ich weiß nicht, ob wir jetzt konkrete Beispiele schon haben wollen, aber ja.
Isabel: Ich hätte ein Beispiel. Und zwar war das, ich weiß nicht mehr, welcher Tag das war, dieses Jahr. Ich glaube, Tag sieben oder acht, wo man dieses Filesystem hat. Erinnert ihr euch da dran? Welcher Tag war das? Auf jeden Fall war das da so, dass es darum ging, du hast von den Elfen so einen Rekorder bekommen und musst dich durch das Filesystem werkeln und dann hast du so eine kleine Shell und hast cd Befehle und ls Befehle und kannst dann immer mit cd in den Directory gehen und dann mit ls dir ausgeben, was passiert. Und als Input hast du dann diese Shell praktisch bekommen, also die ganzen cd Befehle und die ls Befehle und was da drin ist. Und daraus konntest du dir dann zusammenbauen, welcher Ordner in welchen Ordnern sind und welche Dateien da so drin sind. Und dein Ziel war jetzt den Ordner zu finden, der die größte Größe hat. Also bei den Dateien war halt immer eine Größe in mb oder so angegeben. So relativ simples Filesystem. Ja, und dann habe ich so angefangen das zu programmieren und dachte, der wird ja nicht so gemein sein und gleiche Directory Namen verwenden. Ich dachte, wenn es einen Directory gibt, das irgendwie A heißt, dann kommt auch nicht tiefer noch eins vor, was so heißt. Habe dann meinen Code so programmiert, wie ich das dachte und der ist immer in eine Endlosschleife gelaufen und ich habe richtig lange gebraucht, um herauszufinden, woran es liegt, bis in unserem Slack jemand dann so ein Spoiler geschrieben hatte, so ein Tipp gegeben hatte. Und der Tipp war dann, oh, die Filenames sind nicht eindeutig. Dann habe ich das angepasst und immer mir den ganzen Pfad gespeichert und siehe da, dann ging es ganz fix.
Jan: Gerade in dem Problem fand ich auch, da gab es sehr viele Inputs, die eigentlich legal wären, aber die halt nicht vorgekommen sind, ob zum Beispiel in der Mitte, man kann cd Punkt, Punkt, dann geht man ein Verzeichnis hoch oder man kann cd Verzeichnis, dann geht man in das Verzeichnis. Man kann aber auch cd Slash machen. Wenn jetzt in der Mitte irgendwo ein cd Slash auftaucht und man sich dann noch mal durch Verzeichnisse wühlen muss, das ist bei mir zum Beispiel nicht vorgekommen, aber ich habe die ganze Zeit darüber nachgedacht, was mein Code jetzt tut, wenn da irgendwo ein cd vorkommt oder wenn Verzeichnisse gar nicht betreten werden, was dann deren Größe ist, solche Sachen. Oft finde ich das sehr schwierig, das zu interpretieren.
Max: Tatsächlich zeichnet sich Advent of Code so ein bisschen aus, wenn man YAGNI betreibt.
Lucas: Meinst du auch, dass die Probleme dann nicht so viele Randfälle haben, wie man vielleicht erst mal vermutet, weil man es kennt aus seinem Alltag, oder?
Max: Genau.
Isabel: Aber zu vielen Annahmen darfst du auch nicht treffen, so wie meine Annahme, wo ich so dachte: Ach ja, so gemein wird es nicht sein.
Jan: Die Kunst ist, den Mittelweg zu finden.
Isabel: Ja, genau.
Jan: Ich kann dann oft überhaupt nicht anfangen zu coden, bevor ich mir nicht vorgestellt habe, was passiert, wenn jetzt zum Beispiel dieser Input auftritt. Aber da hast du schon recht, Max. Eigentlich muss man da trotzdem erstmal sagen: Ja, okay, dann crashed es halt erst mal und dann macht man weiter, meistens hilft das meiner Erfahrung nach.
Lucas: Max, du hattest eben auch schon mal kurz erwähnt. Du hast die Gelegenheit genutzt, um noch mal GO zu programmieren. Wenn ich jetzt so in den Channel reinschaue, dann sehe ich da so Programmiersprachen wie Rust, Scala, Python, K und viele andere. Welche Programmiersprache habt ihr denn so gewählt? Max, du bei GO dabei. Was hast du genommen, Jan?
Jan: Ich bin Rust dieses Jahr.
Lucas: Und Isabel?
Isabel: Ich habe Kotlin und Prolog genommen.
Lucas: Okay, und wählst das aus nach Problem? Oder wie machst du das?
Isabel: Ich hatte eigentlich jetzt im letzten Jahr mit Kotlin angefangen, weil ich das gerne lernen wollte. Dann habe ich gesagt, ich mache das dieses Jahr wieder. Und dann gab es an Tag zwei so ein Problem, wo man Schere, Stein, Papier spielen musste. Und ich habe abends im Bett noch mal darüber nachgedacht. Und dann kam mir die Idee, dass das ein perfektes Problem für Prolog ist und habe mich dann am nächsten Tag hingesetzt und das in Prolog gemacht. Und das hat wirklich sehr schön geklappt und habe gedacht, probiere ich mal, wie weit ich damit komme. Und an Tag acht habe ich dann gemerkt, jetzt wird es doch ein bisschen zu anstrengend in Prolog und bin dann wieder zurück zu Kotlin.
Lucas: Prolog ist auch eine Sprache, die man im Alltag eher selten verwendet.
Isabel: Eben. Aber für manche Probleme ist es halt echt gut geeignet. Das war halt so ein cooler Moment, wo ich gemerkt habe: Wow, das würde echt gut passen.
Lucas: Cool. Aber wo wir jetzt schon bei Programmiersprachen sind, man kann offensichtlich das benutzen, um Programmiersprachen noch mal kennenzulernen, die man vielleicht schon aus seinem Alltag kennt. Aber was lernt ihr denn sonst noch dazu dabei? Was macht für euch die Lernerfahrung aus, Max?
Max: Entweder eine neue Programmiersprache zu lernen natürlich oder eben tatsächlich dadurch, dass man andere Aufgaben im Advent of Code erledigt als sonst im Alltag, das Verständnis für bekannte Sprachen oder bekannte Technologien noch mal zu vertiefen. Das ist eine Sache, natürlich. Es gibt halt auch mathematische Aufgaben. Das heißt, da ist vielleicht auch noch mal ein bisschen Lerneffekt, was solche Dinge angeht oder ein anderes lösungsorientiertes Denken. Und Modularisierung vielleicht auch. Ich versuche gerade, die Fachlichkeit in meinen Paketen immer auszulagern. Und dann halt ja, eine schöne in Anführungszeichen Schnittstelle nach außen zu exposen, die ich dann halt, um die beiden Teilaufgaben zu lösen, immer nur nutze. Ist so ein kleines Ziel, was man auch haben kann. Die Möglichkeiten, Modularisierung und Paketierung dann auch noch auszureizen oder das Typ-System kennenzulernen.
Isabel: Was ich auch gerne mache, ist auf Effizienz optimieren. Ich habe letztes Jahr halt die Probleme so programmiert und manche dauern extrem lange in ihrer Lösungszeit, weil du halt manchmal einfach dumm programmierst. Du gehst hin und willst das zum Laufen bringen und machst das dann halt so. Und dann habe ich tatsächlich das mal genutzt, um so ein bisschen zu optimieren und Kotlin auch kennenzulernen oder auch welche Sachen, vielleicht auch bei den Algorithmen. Wo kannst du vielleicht abkürzen? Wo kannst du effizienter sein? Und habe probiert, möglichst kurz die Sachen zu lösen. Und das ist auch eine spannende Herausforderung.
Jan: Ich habe generell das Gefühl, dass man mit dieser dummen Lösung für das erste Problem meistens noch ganz gut hinkommt. Da geht es dann quasi drum, das Problem zu verstehen und zu lösen. Ob das jetzt effizient ist, ist nicht so wichtig. Aber beim zweiten Teil der Aufgabe wird es dann auch oft wichtig, dass man das halt nicht mehr dumm macht, sondern schlau, weil sonst wird das nicht mehr fertig. Das heutige Problem zum Beispiel war dafür so ein Beispiel. Isabel, falls du es noch nicht gemacht hast.
Isabel: Aber das habe ich dann auch manchmal, dass ich Schleifen habe und dann mache ich so Ausgaben da rein. Jetzt bin ich bei Schritt eins, jetzt bin ich bei Schritt zwei und dann sehe ich, dass das in der Shell so ganz langsam läuft und dann denke ich, das wird nicht fertig. Und dann weißt du, du musst deinen Algorithmus noch verbessern.
Lucas: Okay, cool. Aber dann sind wir ja auch schon so ein bisschen bei der Vorgehensweise. Wenn ihr jetzt so ein Rätsel habt, wie geht ihr dann vor? Was macht ihr dann?
Isabel: Gar keine einfache Frage. Erst mal liest man natürlich den Text und dann kommt es immer ein bisschen darauf an, ob du sofort eine Idee hast. Manchmal hat man ja sofort eine Idee und dann fange ich an, erst mal den Input einzulesen. Meistens gebe ich mir den dann erst mal aus, um zu schauen, ob der so ist, wie ich erwarte. Und dann parse ich mir das so, dass ich damit gut arbeiten kann. Und dann fange ich meistens an, einfach mal so los zu programmieren.
Lucas: Aber ich möchte da direkt eine Rückfrage stellen, weil eine Sache, die ihr im Vorgespräch auch gesagt habt, ist ja, dass ein Problem auch immer so ein bisschen ist, das Einlesen des Inputs. Möchtet ihr dazu noch was sagen? Vielleicht ist das ja auch für jemand, der das das erste Mal macht, auch dann ein frustrierender Punkt. Vielleicht mag da einer was zu sagen.
Jan: Am Anfang ist der Input erst mal einfach. Da kommt man dann mit so Regexces oder substring matches oder so was noch ganz gut hin. Aber relativ schnell ist man dann an einem Punkt angekommen, dieses Mal hat es relativ lange gedauert, bis man tatsächlich sich um einen echten Parser bemühen musste, aber da wurde dann so rekursiv geparst. Das ist jetzt die Extra-Spoiler-Lösung. Also man hat quasi eine Liste und die besteht dann teilweise entweder aus Elementen, also Zahlen oder aus anderen Listen, die wiederum Listen und Elemente enthalten. Und ich meine, wenn man das versucht selber das mit Regexces zu lösen, wüsste ich auch gar nicht, wie das geht. Könnte vielleicht funktionieren oder man kann es mit substrings parsen. Aber da ist es dann doch schön, wenn man weiß, wie man einen echten Parser und eine Parser-Bibliothek oder sowas bedient, weil das ist dann schon sehr hilfreich.
Isabel: Manchmal ist das halt total einfach. Dann hast du eine Zahl pro Zeile oder so, musst das nur zeilenweise einlesen und umwandeln. Oder du hast so Kommandoanweisung, einen Buchstaben und dahinter eine Zahl. Und manchmal ist das halt irgendein abgedrehter Kram und du musst richtig tief in die Trickkiste greifen. Es gab auch schon mal Rätsel, da musstest du ein Labyrinth einlesen, so in Ascii-Art. Das war dann auch sehr schwierig, weil du erst mal überlegen musst, wie speicherst du das jetzt ab?
Jan: Seine Datenstrukturen sollte man kennen. So Listen, HashMaps, brauchst du eigentlich bei jedem Problem, jedem normalen Problem der Welt und wie man die handhabt. Auch Graphen sind schon vorgekommen, also kurzen Pfad suchen und so was. Es sind jedes Jahr neue Probleme, mir fällt es jetzt schon auf von letztem Jahr, so einen gewissen Grundstock an ähnlichen Problemen, der kommt schon immer vor.
Isabel: Was vielleicht auch noch wichtig wäre zu erwähnen ist, dass die Rätsel tendenziell schwerer werden, je weiter der Monat voranschreitet und dass die am Wochenende auch immer ein bisschen schwerer sind als die unter der Woche. Und manchmal ist es aber auch ein bisschen danebengegriffen. Oder manchmal empfindet man vielleicht ein Rätsel schwieriger als andere. Und deswegen ist das nur so eine Tendenz.
Jan: Und was auch noch super hilfreich ist, habe ich jetzt gemerkt, wenn man erst mal den Test Input tatsächlich als Test in seinen Code einbaut. Meine Lösungsstrategie ist tatsächlich erst mal Input, erst mal Datenstrukturen für den Input definieren, parsen, dann Tests, ob ich es richtig geparst habe, dann quasi den roten Test, der den Test Input testet, mit der Testlösung und dann fange ich an zu programmieren und dann kann ich auch die einzelnen Teile von der Lösung testen. Dann kann ich mir Tests für die einzelnen Teile der Lösung schreiben, weil ich finde das super hilfreich, weil ich dann auch da spaßig refactoren kann und optimieren, und weiß, dass meine Lösung trotzdem noch korrekt bleibt. Ich habe es mal ohne versucht, da habe ich nie Lust noch da was rumzueditieren hinterher. Ist zu gefährlich.
Lucas: Jetzt habt ihr das schon ein bisschen gesagt, es wird schwieriger. Es wird vielleicht manchmal am Wochenende schwierig. Einfach, wenn man jetzt so das erste Mal mitmacht, vielleicht einfach noch mal, gibt es Rätsel, die ihr nie gelöst bekommen habt oder sind die immer noch lösbar für euch?
Max: Bisher ist es alles noch lösbar. Ich weiß nicht, was noch kommt. Für mich ist es das erste Jahr jetzt, dass ich das mache. Ja, wenn man sich Zeit nimmt, dann kommt man mit Sicherheit voran. Genau, es liegt ja auch wie immer im eigenen Auge und auch irgendwo im eigenen Hirnknoten, wo man dann irgendwann nicht mehr weiterkommt. Es gab einige Kolleginnen und Kollegen, die beim Problem festgehangen haben, wo ich keine Probleme hatte. Und dann gab es ein anderes Problem, da habe ich Ewigkeiten nach der Lösung gesucht und plötzlich tauchen in Slack da innerhalb von fünf Minuten 1000 Lösungen auf. Ja, wenn man etwas nicht schafft, vielleicht funktioniert es auch, mit dem nächsten Tag voranzuschreiten, wenn der Tag schon verfügbar ist.
Jan: Man muss die ja nicht in der Reihenfolge beantworten. Das ist ja auch das Schönste.
Isabel: Man muss nicht bis zum 25. fertig sein. Man kann es ja auch noch nachträglich machen.
Lucas: Aber das heißt auch, wenn ich einen nicht schaffe, dann kann ich die einfach überspringen und trotzdem weitermachen. Ich fliege da nicht raus, weil ich immer alles lösen muss.
Isabel: Genau. Und es gibt schon mal Rätsel, wo ich auch so mehrere Tage, also nicht durchgängig beschäftigt bin, aber wo du immer mal wieder so darüber nachdenkst und die haben auch so eine Tendenz dazu, die Probleme dann nicht loszulassen am Abend. Wenn ich dann einmal was mache, dann will ich auch so lange daran weiterarbeiten, bis ich es fertig habe. Aber man hat ja auch noch andere Verpflichtungen, die dann dazwischenkommen.
Jan: Dem muss ich leider beipflichten. Dieses Zeug, das ist wie Crack für mein Gehirn. Ich weiß nicht, ob das eine gute Formulierung ist. Gerade, weil man halt diesen Eindruck hat: Okay, das ist überschaubar das Problem, das kann man lösen, läuft mir das die ganze Zeit im Kopf rum, dass es da doch einen Weg gibt, das zu lösen und dass ich, wenn ich da jetzt noch darüber nachdenke, dann finde ich diesen Weg. Das ist natürlich sehr schön, weil man es dann macht. Aber andererseits ist es dann auch, wenn man andere Verpflichtungen oder andere Tätigkeiten tun sollte, dann ist das vielleicht nicht so gut.
Max: Außerdem musst du Weihnachten retten.
Lucas: Ja, das stimmt. Aber vielleicht sollten wir dann diskutieren, ob wir nächstes Jahr im Dezember einfach projektfreie Zeit für alle beantragt, damit alle Zeit haben das fertig zu machen. Okay, ihr habt jetzt auch schon gesagt, ihr bleibt auch mal hängen. Was sind denn so Orte, wo man vielleicht Hilfe finden kann? Ich hänge jetzt an einem Tag fest und komme einfach nicht weiter. Wo sucht ihr denn dann nach Hilfe?
Max: Ich schaue tatsächlich im INNOQ Slack. Aber das hilft jetzt natürlich nur Leuten bei INNOQ weiter. Ansonsten habe ich was von einem Subreddit gehört.
Isabel: Ja, es gibt das Subreddit Advent of Code und die sind auch recht aktiv. Die erwachen auch immer so im Dezember natürlich. Und da gibt es immer so ein Thread, wo die Leute ihre Lösungen posten können. Und dann gibt es aber auch manchmal Leute, die nach Hilfe suchen und die dann Erklärung für das Problem finden. Und eigentlich findest du immer irgendjemand, der genau dasselbe Problem hat, wie du und jemanden, der das dann gut erklärt. Und das ist echt hilfreich. Und das ist auch sehr unterhaltsam, das Subreddit, weil manche Leute dann auch Visualisierung posten oder Memes oder über das Problem reden. Und das ist echt immer eine schöne Ergänzung.
Lucas: Da kann man es aber auch schon so lesen, dass man dann keine Spoiler bekommt für Sachen, die man nicht gespoilert bekommen möchte. Oder wie funktioniert das?
Isabel: Ja, das ist meistens auch alles getaggt mit Spoilerwarnungen. Also wenn man möchte, kann man sich das durchlesen und wenn nicht, dann nicht.
Lucas: Weil es könnte ja sein, dass ich irgendwie heute das Problem von vorgestern löse, aber ich will auf jeden Fall noch nichts über das Problem heute erfahren oder so, also das bekommt man dann hin?
Isabel: Ja. Und es ist auch manchmal gar nicht schlecht, sich da eine Idee zu holen, weil man muss es ja trotzdem noch selber lösen. Es kann dann trotzdem noch befriedigend sein, das umzusetzen, auch wenn man sich vielleicht Hilfe geholt hat, finde ich.
Lucas: Definitiv. Gerade wenn auch ein Reiz für einen selbst war, das vielleicht in einer bestimmten Programmiersprache umzusetzen, ne? Da kann ich mir das gut vorstellen, dass man dann einfach überlegt, wie löse ich das denn jetzt in meiner Programmiersprache? Vielleicht gibt es da ja auch noch einen Trick oder so, den ich da verwenden kann. Kann ich mir sehr gut vorstellen.
Jan: Und was ich noch sehr hilfreich finde, ist auch immer Wikipedia, weil einfach in meinem Gehirn geistert sehr viel rum und komme ich auf einmal den Gedanken, ach das und das, vielleicht ist das der und der Algorithmus und dann schaut man mal bei Wikipedia nach, ist es der? Bzw. wie sieht der Code dafür aus? Und dann kann man das auf jeden Fall schon mal ausprobieren. Oder man merkt: Aha, so kann man das Problem lösen. Dynamische Programmierung zum Beispiel, da warte ich dieses Jahr wahrscheinlich, das habe ich vorher vergessen zu erwähnen. Das ist ein ganz tolles Thema. Das wird wahrscheinlich noch auftauchen heute. Ich brauche da immer wieder ein Refresher. Ich merke: Ah! Wahrscheinlich ist das Problem, wo ich dynamisch programmieren muss. Und dann schaue ich bei Wikipedia nach, wie war das denn noch mal? Und dann kann man damit anfangen, das selber zu implementieren oder nach zu implementieren und so zu bauen, die Lösung. Das hilft mir auch immer sehr.
Isabel: Wikipedia ist auch eine super Quelle, weil du implementierst ja den Dijkstra oder irgendwelche Graphenalgorithmen nicht einfach so aus dem Kopf. Du schaust nach und oft schaue ich mir den Pseudo-Code auf Wikipedia an und orientiere mich dann daran und setze das jetzt in meiner Programmiersprache um.
Lucas: Cool. Ich glaube, bei vielen ist jetzt vielleicht auch das Interesse geweckt worden. Wenn man jetzt das restliche Jahr auch noch so was machen will, gibt es da auch noch ähnliche Angebote im Internet zum Advent of Code, die ihr auch cool findet?
Max: Durchaus.
Jan: Die, die ich kenne, unterscheiden sich aber alle ein bisschen in der didaktischen Ausrichtung. Was ich gemacht habe, auch tatsächlich aus praktischen Gründen, um Programmiersprachen zu lernen, heißt Exercism. Die haben auch eine sehr ähnliche Struktur eigentlich. Aber mit dem Unterschied, dass man quasi, wenn man möchte, Mentoring beantragen kann. Das heißt, dann schaut sich jemand deinen Code an und gibt dir unter Umständen Feedback, wenn er möchte oder wenn du möchtest, gibt dir jemand Feedback zu deinem Code. Was natürlich jetzt bei Advent of Code nicht so gegeben ist.
Isabel: Ich mach noch Projekt Euler. Da sind auch immer Probleme. Ich glaube, alle paar Wochen kommt ein neues raus und die gehen eher in die mathematische Richtung. Da hast du oft Probleme, die du auf mathematische Art und Weise lösen musst, eine mathematische Lösung haben. Und was die Gemeinsamkeit zu Advent of Code ist, ist, dass du die auch nicht per Brute Force lösen kannst, also dass du es im Kleinen verstehen kannst und machen kannst, aber die eigentliche Aufgabe so groß ist, dass du da irgendeinen intelligenten Algorithmus für schreiben musst. Und das ist vielleicht auch ganz nett, wenn man mal einfach zum Programmieren eine Ausgabe braucht, dann kann man da starten, vor allem mit den Anfangsproblemen, die sind noch nicht so heavy. Hinterher wird es dann doch sehr krass mathematisch.
Jan: Der Unterschied da ist, die Problembeschreibung von Projekt Euler sind, glaube ich, normalerweise so zwei, drei Zeilen oder so was um den Dreh. Ich finde, das ist noch weiter weg von, wie man in halt in echt programmiert in Anführungszeichen. Weil oft bekommt man zum Beispiel keine Eingabe oder man kann das alles hart codieren und so, das ist schon sehr, im Vergleich zu Advent of Code und auch Exercism und vielen anderen Dingen, die es da noch gibt, finde ich Projekt Euler schon sehr theoretisch in Anführungszeichen. Aber das ist natürlich nicht unbedingt schlecht, wenn man wirklich mal denken will: Ah! Ich kann noch Mathe. Dann kann man sich da mal richtig verspaßen.
Isabel: Aber auch Advent of Code ist ja auch den Rest des Jahres gut zu benutzen. Das gibt es seit 2015. Das haben wir, glaube ich, schon erwähnt und jedes Jahr hat 25 Rätsel und da kann man schon einige Zeit von zehren. Ich habe im Vorfeld recherchiert und es gibt insgesamt, außer jetzt dieses Jahr, gibt es 813 Leute, die jedes einzelne Advent of Code-Rätsel gelöst haben. Ich glaube, so mein Ziel auf lange Sicht ist, dass ich da auch zugehören möchte. Ich will jedes Rätsel lösen. Ich werde da vielleicht noch ein bisschen für brauchen, aber irgendwann, hab ich’s dann.
Lucas: Ich sehe schon, Isabel meldet ihr Sabbatical an.
Isabel: Ich arbeite jetzt nicht mehr.
Jan: Sie löst alle Probleme, solange sie in Form einer Story mit Elfen und Sternenfrüchten ausgedrückt werden.
Isabel: Genau.
Max: Cool. Ansonsten, was ich mal gemacht habe, das ist aber auf Clojure jetzt beschränkt, um bisschen Clojure zu lernen, 4Clojure nennt sich das. Da sind so von elementaren bis harten Rätseln so Clojure-Aufgaben, die du in Clojure löst. Und das ist so ein bisschen was in der Art, was man auch dazuzählen könnte. Macht auch Spaß und ist ganz schön, um halt die Sprache so ein bisschen zu lernen.
Lucas: Sehr cool.
Lucas: Gut, dann hoffe ich mal, dass wir diesen Advent of Code euch bisschen schmackhaft gemacht haben. Vielleicht habt ihr Lust, die Rätsel im Nachhinein noch mal zu lösen, wenn ihr das noch gar nicht kennt oder vielleicht nächstes Jahr mitzumachen. Und dann danke ich euch dreien für eure Zeit und für eure vielen coolen Eindrücke von diesem Ding und allen anderen wünsche ich schon mal eine schöne Weihnachts- und Neujahrszeit. Dann einen schönen Tag noch. Und tschüss!
Max: Tschüss!
Isabel: Ciao!