faecher:informatik:oberstufe:java:aoc:aco2023:day15:start

Tag 15 - Lens Library

Tag 15 ist meines Erachtens der bisher einfachste Tag. Insbesondere Teil 1 war sehr einfach! Teil 2 war umfangreicher, aber auch da gab es keine besonders großen Hürden.
  • Die Eingabedatei enthält dankenswerterweise nur eine einzelne Zeile. Diese muss bei den Kommas mit split(",") in ein String-Array aufgesplittet werden.
  • Anschließend iteriert man über jeden String und berechnet stumpfsinnig der Aufgabenstellung folgend die Hashes die man auf die Gesamtsumme aufsummiert. Denke dabei an den Modulo-Operator %.

Lösungsvorschlag Teil 1

Für Teil 2 muss man sich Gedanken über die Datenstruktur machen. Man hat insgesamt 256 Boxen, das spricht für eine ArrayList, die flexiblere Datentypen enthalten kann als ein Array. Pro Box hat man wiederum mehrere Linsen. Also wiederum eine ArrayList pro Box. Eine Linse wiederum muss sowohl einen String (label) als auch einen int (focalLength) speichern, das spricht für eine eigene Klasse für Linsen. Das ergibt insgesamt die Datenstruktur: ArrayList<ArrayList<Lens».

  • Fange damit an, die Lens-Klasse zu erstellen. Sie muss einfach nur einen String und einen int als Instanzvariablen enthalten sowie die nötigen getter- und setter-Methoden.

Lösungsvorschlag Lens-Klasse

  • Erstelle die oben gesprochene große Datenstruktur für die 256 Boxen. Stelle mit einer Schleife sicher, dass 256 innere ArrayList<Lens> existieren.
  • Gehe nun in einer Schleife über jede Sequenz:
    • Teile die Sequenz, um das Label zu bekommen. Tipp: nutze den regulären Ausdruck "[=\\-]" in der split()-Methode, um entweder an - oder an = zu splitten.
    • Berechne für das Label den Hash.
    • "Hole dir" die korrekte Box in Abhängigkeit des Hash-Ergebnisses
    • Nun musst du pro Box unterscheiden, ob in der Sequenz ein = oder ein - enthalten war.
      • Bei einem Gleichheitszeichen musst du zunächst prüfen, ob das Label bereits in der Box enthalten ist. (Prüfe für jede Lens innerhalb der aktuellen Box, ob das Label passt). Gibt es einen Treffer, dann aktualisierst du die focalLength (diese musst du durch einen weiteren Split der aktuellen Sequenz entnehmen). Gibt es keinen Treffer, dann fügst du ein neues Lens-Objekt der Box hinzu.
      • Andernfalls beim Minuszeichen musst du die Box durchsuchen bis du das Label gefunden hast und musst dann die Box an diesem Index löschen.
  • Am Ende gehst du über alle Boxen und Linsen drüber und summierst die Werte auf.

Lösungsvorschlag Teil 2

  • faecher/informatik/oberstufe/java/aoc/aco2023/day15/start.txt
  • Zuletzt geändert: 15.12.2023 08:43
  • von Marco Kuemmel