- Advent of Code, das Programmierpuzzle-Event im Dezember, ist so gestaltet, dass die Hürden bei Können und Sprachwahl niedrig bleiben und man zu unterschiedlichen Zwecken teilnehmen kann – zum Üben, Lehren oder im Wettbewerb
- Ein Hintergrund in Informatik oder leistungsstarke Hardware sind nicht nötig; für jede Aufgabe gibt es eine Lösung, die auf 10 Jahre alter Hardware in höchstens 15 Sekunden fertig wird
- Wenn man bei der Lösung feststeckt, sollte man das Problem schrittweise eingrenzen: Beispiele prüfen, eigene Testfälle erstellen, Eingaben validieren und dann Freunde oder Hinweise im Subreddit nutzen
- Die FAQ 2024 fassen Betriebsrichtlinien zusammen, darunter Änderungen an der Event-Länge, die Entfernung des global leaderboard, Regeln für private leaderboard, KI-Nutzung sowie Einschränkungen für Kopie und Weiterverbreitung
- Geschwindigkeitswettbewerb ist optional; Teilnehmende können sich darauf konzentrieren, die Puzzles auf die für sie nützliche Weise zu lösen und dabei zu lernen
Charakter von Advent of Code und Teilnahmebedingungen
- Advent of Code ist ein Event im Stil eines Adventskalenders, bestehend aus kleinen Programmierpuzzles
- Die Puzzles richten sich an unterschiedliche Erfahrungsstufen und können in der gewünschten Programmiersprache gelöst werden
- Sie werden für Interviewvorbereitung, Firmenschulungen, Hochschulaufgaben, Übungsaufgaben, Speed-Wettbewerbe und Herausforderungen zwischen Teilnehmenden genutzt
- Ein Informatik-Hintergrund ist nicht erforderlich; etwas Programmierwissen und Problemlösefähigkeit reichen für die Teilnahme aus
- Auch ein leistungsstarker Computer ist nicht nötig; für jede Aufgabe gibt es eine Lösung, die auf 10 Jahre alter Hardware in höchstens 15 Sekunden fertig wird
Vorgehen, wenn man feststeckt
- Wenn man bei der Lösung feststeckt, sollte man zuerst das Programm mit den im Puzzle enthaltenen Beispielen überprüfen
- Wenn die Beispielergebnisse nicht stimmen, sollte man die Aufgabenbeschreibung erneut lesen und prüfen, welche Teile man missverstanden hat oder wo sich das Programm anders verhält als erwartet
- Wenn die Beispiele stimmen, die Antwort aber falsch ist, sollte man eigene Testfälle erstellen, deren Ergebnis sich von Hand prüfen lässt, und sie auf das Programm anwenden
- Außerdem sollte geprüft werden, ob die gesamte Puzzle-Eingabe vollständig verwendet wurde
- Wer weiterhin feststeckt, kann Freunde um Hilfe bitten oder die Aufgabe später noch einmal lösen; Hinweise gibt es auch im Subreddit
Website-Nutzung und Authentifizierung
- Codeblöcke können bei aktiviertem JavaScript per Dreifachklick komplett ausgewählt werden
- Die Authentifizierung nutzt OAuth, um die Identität über externe Dienste zu verifizieren
- Beim Login werden die Zugangsdaten nicht an Advent of Code, sondern nur an den jeweiligen externen Dienst übermittelt
- Der externe Dienst teilt dem Advent-of-Code-Server mit, dass der Nutzer tatsächlich diese Person ist
- In der Regel werden keine zusätzlichen Informationen offengelegt, abgesehen von bereits öffentlichen Informationen
- Advent of Code speichert die eindeutige ID, den Namen, die URL und das Bild des Authentifizierungsdienstes
- Wenn die Schrift der Website schwer lesbar ist, kann ein alternatives High-Contrast-Stylesheet verwendet werden
- Firefox unterstützt View → Page Style → High Contrast standardmäßig
Schwierigkeitsgrad, Veröffentlichungszeit und Event-Länge
- Schwierigkeitsgrad und Themen der Puzzles unterscheiden sich von Event zu Event
- Im Allgemeinen werden die Puzzles mit der Zeit schwieriger, aber je nach persönlichem Skill-Mix kann die wahrgenommene Schwierigkeit stark variieren
- Die Puzzles werden um Mitternacht EST/UTC-5 veröffentlicht
- Denn zu dieser Zeit kann der Betreiber zuverlässig prüfen, ob alles ohne Probleme funktioniert
- Es ist kein Problem, wenn man nicht um Mitternacht teilnehmen kann; für lokale Wettbewerbe lassen sich private leaderboards nutzen
- Die Zahl der Event-Tage ändert sich
- Der Betrieb von Advent of Code erfordert jedes Jahr viel freie Zeit, und die Puzzle-Erstellung nimmt den größten Teil davon ein
- Nachdem der Zeitplan 10 Jahre lang beibehalten wurde, wurde eine Änderung nötig
- Die Puzzles beginnen am 1. Dezember, damit die Datumsnummern passen, werden täglich veröffentlicht und enden Mitte Dezember
Leaderboards und Speed-Wettbewerb
- Das global leaderboard wurde entfernt
- Es war einer der größten Stressfaktoren für Betreiber, Infrastruktur und viele Nutzer
- Einige Teilnehmende nahmen den Wettbewerb übermäßig ernst; es kam auch zu Aktionen wie DDoS-Angriffen
- Viele Nutzer schlossen fälschlicherweise, sie seien schlechtere Programmierer, nur weil ihre Zeiten langsamer waren als die Vergleichswerte
- 2015 begann es als unterhaltsames Feature, wurde über 10 Jahre hinweg aber zu einem immer größeren Problem
- Eine Read-only-Ansicht eines private leaderboard kann geteilt werden
- Dieses Feature oder diese Daten dürfen nicht genutzt werden, um ein neues global leaderboard zu erstellen
- Schnelle Lösungszeiten sind optional
- Wer schnell lösen will, braucht neben dem Lösen der Puzzles zusätzliche Fähigkeiten und viel Übung
- Speed-solve-Code sieht oft völlig anders aus als Code, der ein Code Review bestehen würde
- Man kann eine Vorgehensweise wählen, die zu den eigenen nützlichen Zielen passt, und Speed-Wettbewerbe vollständig ignorieren
KI-Nutzung und Regeln für private leaderboards
- Wer Teil eines private leaderboard ist, sollte bei den Betreibern die erwarteten Regeln erfragen
- Wenn die Regeln nicht passen, kann man ein anderes private leaderboard suchen oder selbst eines erstellen
- Regeln für private leaderboards können maximale Laufzeit, erlaubte Sprachen, den frühesten Zeitpunkt zum Öffnen eines Puzzles, nutzbare Tools und sogar die Frage umfassen, ob man während der Arbeit einen albernen Hut tragen muss
- Beim Lösen von Advent-of-Code-Puzzles wird die Nutzung von KI nicht empfohlen
- Stattdessen wird die Analogie verwendet, ob man selbst stärker wird, wenn man einen Freund ins Fitnessstudio schickt
- Die Puzzles sind so gestaltet, dass sie für Menschen interessant zu lösen sind; ob KI sie lösen kann, wird nicht berücksichtigt
- Wenn das Ziel das Üben von KI-Prompts ist, sind andere Übungen, die genau dafür konzipiert wurden, möglicherweise besser geeignet
Puzzle-Ideen, Bugs und Kopierregeln
- Puzzle-Ideen sollten nicht eingesendet werden
- Wegen rechtlicher Fragen wie Urheberrecht und Attribution werden keine Ideen angenommen
- Um die Möglichkeit zu vermeiden, versehentlich Teile davon zu verwenden, werden auch E-Mails, die wie Puzzle-Ideen aussehen, nicht gelesen
- Wer glaubt, einen Bug in einem Puzzle gefunden zu haben, sollte zuerst im Subreddit nachsehen
- Wenn seit der Veröffentlichung eines Puzzles eine Stunde vergangen ist, haben es bereits viele Menschen gelöst; danach ist ein Bug sehr unwahrscheinlich
- Advent of Code kann kostenlos genutzt werden, Kopieren ist jedoch nicht frei erlaubt
- In Code-Repositories sollten keine Teile von Advent of Code enthalten sein, etwa Puzzle-Texte oder die eigene Eingabe
- Beim Erstellen einer Website sollte sie nicht so aussehen wie Advent of Code und keinen ähnlichen Namen tragen
Rechtliche Hinweise und erlaubter Rahmen
- Advent of Code ist eine in den USA eingetragene Marke
- Designelemente, Formulierungen, Stil und Konzepte von Advent of Code sind alleiniges Eigentum von Advent of Code und dürfen ohne ausdrückliche schriftliche Zustimmung nicht kopiert oder verwendet werden
- Der Copyright-Hinweis lautet 2015–2025 Advent of Code; alle Rechte vorbehalten
- In Diskussionen, Unterricht, Quellcode, Drucksachen und ähnlichen Kontexten darf auf Advent-of-Code-Puzzles verlinkt oder verwiesen werden, auch in kommerziellen Zusammenhängen
- Advent of Code erhebt keinen Anspruch auf Eigentum oder Urheberrecht an den Lösungsimplementierungen der Nutzer
1 Kommentare
Hacker-News-Kommentare
Ich mag AoC und habe die letzten 2–3 Jahre alles in Rust gelöst und dabei auf Discord gemeinsam mit anderen versucht, die schnellstmögliche Lösung zu bauen
Dabei habe ich allerlei Tricks zur Performance-Optimierung, fortgeschrittene Algorithmen und SIMD gelernt
Dieses Mal löse ich die Aufgaben in Rust und Go, um herauszufinden, ob ich Go, das wir bei der Arbeit benutzen, mögen oder zumindest ertragen kann, oder ob sich meine Vermutung bestätigt, dass ich es nicht besonders mag und nur dann nutzen sollte, wenn es wirklich nötig ist
Es ist praktisch, erfordert wenig Umgebungseinrichtung oder Nebenarbeit, hat die meisten nötigen Funktionen wie Dateieinlesen/Parsing bereits eingebaut, ist schnell und relativ hardwarenah, sodass es weniger versteckte Performance-Fallen gibt
Ich habe Rust nie benutzt, daher fällt mir ein Vergleich schwer, aber rein oberflächlich wirkt es auf mich weniger praktisch
Bei AoC braucht man Produktionsanforderungen wie Speichersicherheit nicht wirklich, daher scheinen bei den späteren Aufgaben Praktikabilität und Performance wichtiger als Sicherheit zu sein
Ich versuche jedes Jahr, mit Zig auf Geschwindigkeit zu optimieren: https://github.com/ManDeJan/advent-of-code
Eher habe ich umgekehrt das Dilemma, Rust mögen zu wollen
Ich wollte es in Rust versuchen, bin mir aber nicht sicher, ob man die Module nach Datum aufteilen sollte oder jeden Tag als Bibliotheksdatei anlegt und an einen zentralen Einstiegspunkt anschließt
Wenn es ein öffentliches Repository gibt, wäre es schön, wenn du es teilen könntest
Die Herausforderung dieses Jahres ist, es in C ohne Standardbibliothek oder Allocator zu schreiben
Es muss auf einem STM32 mit 32 KB SRAM lauffähig sein
Vor zwei Jahren habe ich es mit Assembler versucht, aber nachdem ich stundenlang eine Standardbibliothek für Assembler gebaut hatte, habe ich aufgegeben und bin zu Rust gewechselt
Ich bin nicht besonders weit gekommen, aber ohne Speicherschutz wird es wirklich schwer
Dieses Jahr habe ich für den Amiga ein 060-Upgrade mit MMU, also finde ich vielleicht heraus, wie ich das nutzen kann, und versuche es noch einmal
C war auch dabei, und ohne Hash-Tabellen war es wirklich schmerzhaft
https://git.sr.ht/~q3cpma/aoc2024/tree/master/item/01
Ich wäre dankbar, wenn du einen Repository-Link postest, damit man den Fortschritt verfolgen kann
Letztes Jahr habe ich alle Aufgaben in C ohne externe Bibliotheken gelöst [1], und es hat großen Spaß gemacht
Es hat mich gezwungen, vergessene Low-Level-Bausteine wie etwa den Heap selbst zu implementieren, und ich musste auch numerische Routinen selbst schreiben, was überraschend einfach war
[1] https://github.com/sebastianotronto/aoc/tree/master/2023
Also so etwas wie: grep ist erlaubt, awk nicht; ähnlich eingeschränkt, aber ohne fatale Speicherbeschädigungs-Bugs
Normalerweise mache ich AoC in Common Lisp, aber dieses Jahr probiere ich Swift aus
Für eine statisch typisierte Mainstream-Sprache ist es für diese kleinen Manipulationen ziemlich ordentlich
https://github.com/codr7/aoc24/tree/main/swift/Sources/aoc
Dieses Jahr ist etwas seltsam, denn ich war gerade dabei, bei einem neuen Job ein Event vorzubereiten
Ich fand es nützlich, weil Entwickler dadurch eher echtes Problemlösen lernen als nur Frameworks zusammenzukleben
Dann stellte sich jedoch heraus, dass mein neuer Chef jemand war, mit dem man unmöglich zusammenarbeiten konnte, und ich musste gehen
Am Ende bleiben wohl wie immer nur ich und Emacs übrig
Es ist ziemlich interessant, unterschiedliche Lösungen zu vergleichen
Ich wollte früher einmal AoC in Swift machen, aber genau daran ist meine Motivation stark gesunken
Die kleinen funktionalen Einzeiler waren nett, aber nach etwa einer Woche scheint die Parsing-Last zu groß zu werden
Ich wollte dieses Jahr Swift ausprobieren, aber dafür extra Xcode zu starten, wirkt etwas übertrieben
Wieder ist sie da, die Saison der immer komplexer werdenden Input-Parser für 25 Tage
Die eigentliche Schwierigkeit besteht darin, die Eingabe in eine Form zu parsen, mit der man gut arbeiten kann; sobald das Parsing erledigt ist, wird es leicht
Komplexer werden die Probleme selbst, und selbst bei schweren Aufgaben um Tag 22 oder 23 herum besteht die Eingabe meist nur aus Zeilen mit durch Leerzeichen getrennten Zahlen oder aus Punktgittern, also ähnlich wie bei den einfachen Aufgaben von Tag 1 bis 3
Dieses Jahr ist das Ziel, alle Sterne zu sammeln und insgesamt 500 Sterne zu erreichen
Das heißt, alle Jahre und alle Aufgaben abzuschließen
Stand letzte Woche gab es etwa 1024 Leute mit insgesamt 450 Sternen
Angefangen habe ich erst etwa bei Day 6 von 2022, aber dann hat es mich gepackt, und Anfang 2023 hatte ich Zeit, die früheren Jahre der Reihe nach zu lösen
Wenn man ein paar Algorithmen vorbereitet hat, ist es nicht allzu schwer, und manche Themen wiederholen sich jedes Jahr
Es macht Spaß, dabei wieder echte Algorithmen aufzufrischen, mit denen man sonst nicht so oft arbeitet
Danke an die Freiwilligen und an Eric, und ich habe vor, jetzt jedes Jahr zu spenden. Wirklich ein großartiges Event
Ich mag es, weil es eines der Highlights dieser Jahreszeit ist
Dieses Mal musste ich die Aufgaben im Flugzeug lösen, als ich den Pazifik ostwärts überquert habe
Für mich persönlich und auch für Freunde, Kolleg:innen und die HN-Leute ist es zu einer unterhaltsamen Tradition geworden
Wieder einmal beeindruckend, was wastl und die Helfer-Elfen auf die Beine gestellt haben
Wer hier einen Mehrwert daraus zieht, sollte, wenn möglich, Unterstützung geben
Es ist zwar ein Herzensprojekt, aber es verursacht tatsächlich Kosten
Trotzdem ist adventofcode wirklich großartig, und wenn möglich sollte man es unterstützen
Nach dem Umfang der aktuellen Unterstützung zu urteilen, dürfte es dem Ersteller ziemlich gut gehen
Dieses Jahr will ich es mit F# und Gleam versuchen, aber wie jedes Jahr werde ich vermutlich weder Zeit noch Energie für mehr als 10 bis 12 Tage haben
Wer Python benutzt, sollte F# ruhig auch einmal ausprobieren
Es kann sich ziemlich nach Scripting anfühlen und hat auch ein hervorragendes REPL
Im ersten Jahr war das die Motivation, eine Standardbibliothek zu bauen, damit es nicht zu unerquicklich wird
Inzwischen denke ich eher, ich hätte lieber bessere Tools fertigstellen sollen
Ich debugge mit wsjq[1], einem gdb-artigen CLI-Debugger, der in jq geschrieben ist, aber er ist langsam
[0]: https://github.com/thaliaarchi/ws-challenges
[1]: https://github.com/thaliaarchi/wsjq
Selbst für jemanden ohne Erfahrung mit funktionaler Programmierung war es unterhaltsam
Dieses Jahr habe ich keine Zeit mitzumachen, aber wenn doch, würde ich wahrscheinlich wieder F# wählen
Ich stehe auf meiner funktionalen Reise noch ganz am Anfang, aber bisher finde ich, dass AoC dabei hilfreich war
Letztes Jahr bin ich bei Day 12 eine ganze Woche lang hängengeblieben, und jeder wache Moment ging dafür drauf, über eine Lösung nachzudenken
Dieses Jahr bin ich etwas nachsichtiger mit mir selbst, mache nicht mit und will stattdessen den Winterurlaub richtig genießen
Inzwischen schaue ich es mir gar nicht mehr an. Der Spaß schlägt ziemlich schnell in Stress um
Es ist wichtig, Grenzen zu setzen und die freie Zeit zu genießen
Für mich ist Advent of Code wie eine schiefe Ebene
Mit steigender Schwierigkeit ist es anfangs leicht, dann angenehm fordernd, aber ehe man sich versieht, steckt man zu viel Zeit hinein
Und genau dann wird es gefährlich, weil man emotional schon zu sehr investiert ist
https://eli.li/december-adventure
Ich musste sogar eine physikbasierte Graph-Engine schreiben, um die drei längsten Kanten zu finden, die man schneiden musste
Nachdem ich es gelöst hatte, habe ich mir die Lösungen anderer angesehen, und jemand hatte dafür den Theorem Solver von Meta verwendet und war in ungefähr 10 Zeilen fertig
Das kam mir wie ein gewaltiger Cheat vor
Ich mag AoC
Man muss sich nicht darum kümmern, ob AI-Bots es lösen oder ob jemand anderes früher aufsteht, sondern kann es einfach zum eigenen Vergnügen machen
Ob man die Herausforderung selbst mag oder eine neue Sprache ausprobieren will, spielt keine Rolle
Ich löse es gern in einem möglichst funktionalen Kotlin-Stil, um es anders zu machen als im Job
Ich habe auch die heutige Lösung hochgeladen. Sie ist wegen der Utilities nicht reines Kotlin, aber Teil des Spaßes ist auch, schöne Funktionen zu sammeln und sich damit eine Art Bibliothek aufzubauen
https://github.com/Matsemann/algorithm-problems/blob/main/ad...
In den letzten Jahren habe ich Python NumPy benutzt, dieses Jahr nehme ich Kotlin, und bei der Aufgabe am ersten Tag habe ich die transpose-Funktion am meisten vermisst
Mein Code ist hier: https://github.com/charelF/AdventOfCode/blob/main/kt/src/y20...