Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
faecher:informatik:oberstufe:java:aoc:aoc2024:day04:start [04.12.2024 07:57] – angelegt Marco Kuemmel | faecher:informatik:oberstufe:java:aoc:aoc2024:day04:start [04.12.2024 08:08] (aktuell) – Marco Kuemmel | ||
---|---|---|---|
Zeile 2: | Zeile 2: | ||
Der heutige Tag ist gar nicht mal so schwer, sobald man 1-2 mögliche Kniffe erkannt hat, wie man die Lösung angehen kann. | Der heutige Tag ist gar nicht mal so schwer, sobald man 1-2 mögliche Kniffe erkannt hat, wie man die Lösung angehen kann. | ||
+ | |||
+ | ===== Teil 1 ===== | ||
Klar ist, dass man den Input in einem **zweidimensionalen Array** speichern muss. Als Datentyp ist '' | Klar ist, dass man den Input in einem **zweidimensionalen Array** speichern muss. Als Datentyp ist '' | ||
Zeile 94: | Zeile 96: | ||
*/ | */ | ||
return searchXmas(x+dx, | return searchXmas(x+dx, | ||
+ | } | ||
+ | </ | ||
+ | ++++ | ||
+ | |||
+ | ===== Teil 2 ===== | ||
+ | |||
+ | Auch Teil 2 lässt sich tatsächlich besonders einfach lösen, wenn wir zuvor die Buchstaben in die Zahlen 1-4 umwandeln. | ||
+ | Die 1 für das X interessiert uns hier gar nicht mehr. | ||
+ | |||
+ | Eine wichtige Erkenntnis ist, dass die Mitte des Kreuzes immer einen Abstand von 1 zu allen Rändern des Arrays haben muss! Wir starten unsere Suche nach allen möglichen Kreuz-Mitten (also nach allen Vorkommnissen von '' | ||
+ | |||
+ | Für jede gefundene '' | ||
+ | |||
+ | ++++ Lösungsvorschlag | | ||
+ | <code java> | ||
+ | public void partTwo() { | ||
+ | // Instanz-Variablen, | ||
+ | width = inputLines.get(0).length(); | ||
+ | height = inputLines.size(); | ||
+ | puzzle = new int[width][height]; | ||
+ | |||
+ | // übertrage den Input in ein int-Array | ||
+ | for (int y = 0; y < height; y++) { | ||
+ | String line = inputLines.get(y); | ||
+ | for (int x = 0; x < width; x++) { | ||
+ | char c = line.charAt(x); | ||
+ | if (c == ' | ||
+ | puzzle[x][y] = 1; | ||
+ | } else if (c == ' | ||
+ | puzzle[x][y] = 2; | ||
+ | } else if (c == ' | ||
+ | puzzle[x][y] = 3; | ||
+ | } else if (c == ' | ||
+ | puzzle[x][y] = 4; | ||
+ | } else { | ||
+ | puzzle[x][y] = 0; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | int xmas = 0; | ||
+ | | ||
+ | // Suche jedes Vorkommnis der MITTE des Kreuzes. | ||
+ | // Dieses ' | ||
+ | // -> SCHLEIFEN-GRENZEN! | ||
+ | for (int y = 1; y < height - 1; y++) { | ||
+ | for (int x = 1; x < width - 1; x++) { | ||
+ | // Wenn ein ' | ||
+ | if (puzzle[x][y] == 3) { | ||
+ | // Siehe Beschreibung im Wiki! | ||
+ | if ((puzzle[x-1][y-1]+puzzle[x+1][y+1] == 6 && puzzle[x-1][y-1] != 3) | ||
+ | && (puzzle[x-1][y+1]+puzzle[x+1][y-1] == 6 && puzzle[x-1][y+1] != 3)) { | ||
+ | xmas++; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | System.out.println(xmas); | ||
} | } | ||
</ | </ | ||
++++ | ++++ |