faecher:informatik:oberstufe:java:aoc:aoc2024:day14:start

Day 14: Restroom Redoubt

Obwohl die Beschreibung des Problems ein zweidimensionales Array nahelegt, kann man den ersten Teil in einem einzigen Schleifendurchlauf, direkt während des Einlesens jeder einzelnen Zeile, lösen.

Grundidee:

  • Pro Iteration bewegt sich ein Roboter um eine bestimmte Strecke in x- und y-Richtung. Wenn dabei in einer (oder beiden) Richtungen die Grenze über/-unterschritten wird, dann muss der Roboter wieder von der anderen Seite hineinlaufen. Das ist eine klassische modulo-Aufgabe. Die erlaubte Koordinate ist also die berechnete Koordinate modulo breite/höhe. Damit dies auch mit negativen Werten funktioniert nutzen wir hier nicht den %-Befehl, sondern die Methode Math.floorMod(berechneteKoordinate, breite bzw. höhe).
  • Wir können aber ungemein Zeit sparen. Für den Modulo ist es egal, ob der Roboter nur ein bisschen, oder ganz stark aus der Grenze hinausgelaufen ist. Wir können also direkt alle 100 Iterationen in einem Schritt berechnen und anschließend den oberen Modulo-Befehl einmal ausführen!
  • Anschließend können wir noch pro Roboter direkt prüfen, in welchem Quadrant er nun steht und eine entsprechende Variable erhöhen.
  • Damit sind alle Berechnungen zu diesem Roboter direkt abgeschlossen, wir können die nächste Zeile vom Input einlesen und müssen nichts mehr zum aktuellen Roboter speichern.

Lösungsvorschlag

Wider Erwarten muss man für Teil 2 nun doch schrittweise vorgehen und alle Roboter in einer ArrayList speichern. Übrigens: Das erwartete Ergebnis sollte ungefähr so aussehen wie das rechte Bild 🎄.

Man muss nun in vielen Iterationen alle Roboter jeweils eine einzige Bewegung durchführen lassen. Nach jedem Durchlauf muss man überprüfen, ob die neuen Koordinaten der Roboter ein Bild der gezeigten Form ergeben - ja, dies erfordert viel manuelle Handarbeit! Nein, man kann dies (ohne eine KI-Bilderkennung) nicht automatisieren. Da damit zu rechnen ist, dass sehr viele Bilder/Iterationen durchsucht werden müssen (4-stelliger Bereich), bietet es sich an, richtige Bilder in Form von PNGs zu erstellen. Deren Thumbnails können im Dateimanager schneller durchsucht werden als entsprechend viele monospace-"Bilder" im Terminal.

Vorgehensweise:

  • Zur Erstellung der PNGs müssen folgende Bibliotheken importiert werden:
    • import javax.imageio.ImageIO;
    • import java.awt.image.BufferedImage;
    • import java.io.File;
  • Speichere alle Roboter-Werte in einer ArrayList.
  • Wiederhole bis zu 10.000 Mal:
    • Berechne für jeden Roboter ein einzelne Bewegung.
    • Speichere die Koordinaten in einem zweidimensionalen char-Array. Setze z. B. '#' für einen Roboter.
    • Übertrage das char-Array in ein Bild-Objekt und speichere dieses als PNG-Datei.
  • Durchsuche anschließend als Thumbnails alle Bilder bis du das richtige gefunden hast. Die Antwort ist die Bildnummer (wobei du darauf achten musst, ob du noch +1 dazuaddieren musst, falls deine Schleife mit i=0 angefangen hat).

Lösungsvorschlag

  • faecher/informatik/oberstufe/java/aoc/aoc2024/day14/start.txt
  • Zuletzt geändert: 14.12.2024 09:32
  • von Marco Kuemmel