Blog

Advent of Code, Tag 11: Sein oder nicht sein...

Mike Woudenberg

Mike Woudenberg

Aktualisiert Oktober 21, 2025
6 Minuten

Obwohl ich kein fanatischer Teilnehmer von Advent of Code bin, mache ich trotzdem gerne mit und stelle mich der Herausforderung, die täglich veröffentlichten Rätsel zu lösen. Ich gehöre zu den Spielern, die spielen, wann immer sie Zeit haben, und nicht zu den Spitzenspielern, die sich den Wecker stellen, um bereit zu sein, wenn die Aufgabe veröffentlicht wird.

Als ich die Aufgabe für heute Morgen öffnete, war ich angenehm überrascht, eine weitere Aufgabe zu sehen, in der unser geliebter IntCode-Computer eine Rolle spielt ;) (Wie Jochem in seinem Blog bereits vorausgesagt hat)
Bei der heutigen Aufgabe geht es darum, einen Lackierroboter mithilfe eines IntCode-Programms zu bewegen. Es gab nur eine andere Wendung. Jetzt musste das IntCode-Programm ein Raster ausgeben, aus dem es über die Eingabeoperation gelesen wurde. Glücklicherweise musste ich für Tag 7, Teil 2, bereits eine Hilfsfunktion erstellen, die einen Generator als Eingabe anstelle eines festen Satzes von Werten verwendete, so dass ich diese einfach wiederverwenden konnte.

Die Aufgabe schien einfach genug zu sein, also habe ich meine Lösung schnell implementiert, das Programm gestartet und auf die Ausgabe gewartet. Das Programm beendete sich recht schnell und gab mir eine Antwort, die mir vernünftig erschien. Ich übermittelte die Antwort und... Answer too high:(. Wie um alles in der Welt ist das möglich!?!? Zurück zum Reißbrett... Ich habe mir die gesamte Aufgabe noch einmal durchgelesen, um sicherzugehen, dass ich keinen Teil davon falsch interpretiert habe (das ist eine häufige Fehlerquelle für mich, um ehrlich zu sein).

Aha, dachte ich, ich muss nur registrieren, wenn ein Feld tatsächlich die Farbe ändert. Also habe ich das Programm so umgeschrieben, dass es festhält, wann ein Feld die Farbe ändert. Nachdem ich das Programm erneut ausgeführt hatte, gab ich die Antwort ein und... Answer too low.
Wie ist das überhaupt möglich!? Wenn ich mir die Aufgabe noch einmal durchlese, sehe ich, dass sie eindeutig nach der Anzahl der Stellen fragt, die mindestens einmal Farbe (egal welcher Farbe) erhalten haben. Zeit, die großen Geschütze aufzufahren. In einfachen Fällen können Sie einfach ein paar print() Anweisungen in Ihr Programm einfügen, um zu debuggen, was vor sich geht. Aber wenn die Dinge wirklich komplex werden, ziehe ich es vor, einen Debugger zu verwenden. Ein Debugger gibt Ihnen im Vergleich zu einfachen Druckanweisungen viel mehr Einblick in das, was in Ihrem Programm vor sich geht. Sie können den Aufrufstapel sehen, der zu Ihrem Haltepunkt führt, die Variablen sehen, die im Gültigkeitsbereich sind und die Ausführung Ihres Programms Schritt für Schritt kontrollieren. So viel mehr Einblick und der zusätzliche Vorteil, dass Sie nicht all die print() Anweisungen aufräumen müssen, die Sie bei der Fehlersuche hinzugefügt haben ;)

Fehlersuche in VSCode

Für die tägliche Entwicklung verwende ich Visual Studio Code. Es bietet großartige Unterstützung für eine Vielzahl von Sprachen wie Typescript, c#, Java und (wichtig für diesen Wettbewerb) Python. Außerdem verfügt es über eine schöne Debugging-Schnittstelle, mit der Sie den Code durchgehen können, falls die Dinge unübersichtlich werden (wie heute).

Um Python-Code zu debuggen, benötigen Sie zunächst eine Startkonfiguration. Wenn Sie noch nie eine Python-Datei in einem Arbeitsbereich debuggt haben, hilft Ihnen vs code beim Einrichten. Öffnen Sie die Debugger-Ansicht und klicken Sie auf das Zahnrad rechts neben No configurations. Wählen Sie "Python-Datei" und es wird die folgende Konfigurationsdatei zum Debuggen generiert (namens launch.json):

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Python: Current File",
      "type": "python",
      "request": "launch",
      "program": "${file}",
      "console": "integratedTerminal"
    }
  ]
}

Sie können nun die Python-Datei öffnen, die Sie debuggen möchten, einige Haltepunkte an den Zeilen hinzufügen, die Sie untersuchen möchten, und F5 drücken (oder auf die Schaltfläche Play neben der Debug-Konfiguration klicken), um die Datei im Debug-Modus zu starten. Apropos Haltepunkte: Sie können sogar bedingte Haltepunkte verwenden, um die Ausführung nur anzuhalten, wenn eine bestimmte Bedingung erfüllt ist. Ich habe das heute benutzt, um die Ausführung meines Roboterprogramms nach 2007 Iterationen (in meinem Fall die Iteration vor der Fertigstellung) anzuhalten, damit ich den Zustand meines Programms kurz vor seiner Fertigstellung überprüfen konnte.

Den Käfer zerquetschen

Als ich im Debug-Modus arbeitete, fiel mein erster Verdacht auf meine Implementierung des Drehmechanismus des Bots. Aus irgendeinem Grund tue ich mich immer schwer, wenn ein Rätsel mit Winkeln zu tun hat, und dieses war keine Ausnahme. Aber nachdem ich mir ein Blatt Papier genommen und alle Möglichkeiten aufgeschrieben hatte (es gibt nur 8), stellte ich fest, dass ich entgegen aller Wahrscheinlichkeit die Richtungslogik auf Anhieb richtig verstanden hatte.

Ich wandte meine Aufmerksamkeit dem Block zu, in dem es um das Malen der Quadrate ging. Und dann fiel es mir auf. Obwohl ich mein boolesches turnMode aufgerufen hatte, interpretierte ich es als paintMode, was bedeutete, dass es sich dreht, wenn es malen sollte und umgekehrt :/ ARGGGH! Nachdem ich die Logik umgedreht hatte, ließ ich das Programm erneut laufen und wurde nun endlich mit einem goldenen Stern belohnt.

Der zweite Teil war eine weitere Pixel-Rendering-Übung, die schnell zu einem zufriedenstellenden Ergebnis führte:

Jetzt muss ich auf das nächste Zeitfenster warten, um weitere Rätsel zu lösen...

Advent des Codes 2019 Serie

Verfasst von

Mike Woudenberg

Contact

Let’s discuss how we can support your journey.