1 Punkte von GN⁺ 2024-12-02 | 1 Kommentare | Auf WhatsApp teilen
  • 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

 
GN⁺ 2024-12-02
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

    • Ich habe es in den letzten Jahren mit Go gemacht; ab Tag 6 fehlte mir zwar immer die Zeit oder Konzentration, um weiterzumachen, aber für diesen Zweck war es ziemlich gut
      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
    • Mich würde interessieren, wie man in Rust auf Geschwindigkeit optimiert; wenn du teilbare Links hast, würde ich sie mir gern ansehen
    • Es wäre schön, wenn du den Discord teilen könntest
      Ich versuche jedes Jahr, mit Zig auf Geschwindigkeit zu optimieren: https://github.com/ManDeJan/advent-of-code
    • Go ist nicht „Golang“, hat bessere Kompilierzeiten als Rust und versucht nicht, zwanghaft inkompatible Ansätze zur Nebenläufigkeit zu kombinieren
      Eher habe ich umgekehrt das Dilemma, Rust mögen zu wollen
    • Ich frage mich, wie ihr eure AoC-Projekte strukturiert
      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

    • Letztes Jahr habe ich es auf einem echten Amiga 1200 in C gemacht und DICE verwendet, den Compiler/die Runtime von Matt Dillon
      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
    • Dieses Jahr bleibe ich wieder bei Common Lisp, aber die Aufgabe des ersten Tages wollte ich in allen Sprachen lösen, die ich „kann“
      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
    • Die Einschränkung klingt ziemlich hart, aber viel Glück
      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
    • Solange RPC-Aufrufe möglich sind, kann man auch mit 32 KB RAM alles machen :-)
    • Symmetrisch betrachtet könnte man auch nur sh und standardmäßige CLI-Werkzeuge verwenden, die nicht turing-vollständig sind
      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

    • Falls du es noch nicht getan hast, könntest du beim Swift-Leaderboard mitmachen: https://forums.swift.org/t/advent-of-code-2024
      Es ist ziemlich interessant, unterschiedliche Lösungen zu vergleichen
    • Ich frage mich, ob String-Parsing und -Manipulation in Swift nicht ziemlich schmerzhaft sind
      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
    • Mich würde interessieren, ob du Schreiben, Kompilieren und Ausführen komplett in Emacs machst
      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

    • Solche Probleme hasse ich am meisten
      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
    • Nach ein paar Tagen landet man am Ende doch bei regulären Ausdrücken, und jedes Jahr hat man sie wieder vergessen und muss sie neu lernen
    • Es ist nicht so, dass die Input-Parser mit jedem Tag komplexer werden
      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
    • Dem Input-Parsing wurde einfach eine unterhaltsame Geschichte angehängt
    • Ich halte scanf und Zustandsautomaten für deutlich effektiver als Parser im split/explode-Stil
  • 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

    • Bei so vielen Sponsoren und AoC++-Nutzern ist es wohl schwer, das noch als kleines Herzensprojekt zu sehen, das gerade so die monatliche VPS-Rechnung bezahlen kann
      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

    • Ich führe meine Tradition fort, AoC in Whitespace zu lösen [0]
      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
    • Ich mache es in bash und will sehen, wie weit ich komme
    • Die letzten beiden AoCs habe ich in F# gemacht, allerdings wirklich nur die ersten paar Tage
      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 habe auch angefangen, F# zu lernen, und benutze es dieses Jahr für AoC
      Ich stehe auf meiner funktionalen Reise noch ganz am Anfang, aber bisher finde ich, dass AoC dabei hilfreich war
    • Ich frage mich, wie die Linux-Unterstützung aussieht :)
  • 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

    • Es hat mir mehrere Jahre in Folge das Leben aufgefressen, und zweimal habe ich es erst an Heiligabend gerade so fertigbekommen
      Inzwischen schaue ich es mir gar nicht mehr an. Der Spaß schlägt ziemlich schnell in Stress um
    • Klingt vernünftig
      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
    • Ein Freund hat das kürzlich mit mir geteilt, ich glaube, das könnte dir gefallen
      https://eli.li/december-adventure
    • Ich bin beim Graph-Cut-Rätsel vier Monate lang hängengeblieben
      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...