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

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

faecher:informatik:oberstufe:java:aoc:aoc2024:day04:start [04.12.2024 07:57] – angelegt Marco Kuemmelfaecher: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 ''char'' allerdings nicht wirklich geeignet, da wir ja bestimmte **Abfolgen** in dem Text erkennen müssen. ''int'' bietet sich daher viel besser an!  Klar ist, dass man den Input in einem **zweidimensionalen Array** speichern muss. Als Datentyp ist ''char'' allerdings nicht wirklich geeignet, da wir ja bestimmte **Abfolgen** in dem Text erkennen müssen. ''int'' bietet sich daher viel besser an! 
Zeile 94: Zeile 96:
      */      */
     return searchXmas(x+dx, y+dy, dx, dy, ++c);     return searchXmas(x+dx, y+dy, dx, dy, ++c);
 +}
 +</code>
 +++++
 +
 +===== 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 ''A''=3).
 +
 +Für jede gefundene ''3'' müssen wir nun prüfen, ob die **päärchenweise diagonal gegenüberliegenden** Buchstaben ein ''M'' und ein ''S'' sind. Als Zahlen ausgedrückt sind das die Zahlen ''2'' und ''4''. Wir können also prüfen, ob die jeweils diagonal gegenüberliegenden Zahlen in der Summe die Zahl 6 ergeben! Mit diesem Kniff müssen wir nicht extra prüfen, ob z. B. das ''M'' nun links oben oder rechts unten war. Wir müssen bloß sicherstellen, dass nicht **eine** der Zahlen eine ''3'' war (denn auch 3+3, also diagonal gegenüberliegende A's) ergeben die Zahl 6.
 +
 +++++ Lösungsvorschlag |
 +<code java>
 +public void partTwo() {
 +    // Instanz-Variablen, damit die rekursive Methode darauf zugreifen kann!
 +    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 == 'X') {
 +                puzzle[x][y] = 1;
 +            } else if (c == 'M') {
 +                puzzle[x][y] = 2;
 +            } else if (c == 'A') {
 +                puzzle[x][y] = 3;
 +            } else if (c == 'S') {
 +                puzzle[x][y] = 4;
 +            } else {
 +                puzzle[x][y] = 0;
 +            }
 +        }
 +    }
 +
 +    int xmas = 0;
 +    
 +    // Suche jedes Vorkommnis der MITTE des Kreuzes. 
 +    // Dieses 'A'=3 muss kann logischerweise NICHT am Rand des Arrays vorkommen 
 +    // -> SCHLEIFEN-GRENZEN!
 +    for (int y = 1; y < height - 1; y++) {
 +        for (int x = 1; x < width - 1; x++) {
 +            // Wenn ein 'A' gefunden wird...
 +            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);
 } }
 </code> </code>
 ++++ ++++
  • faecher/informatik/oberstufe/java/aoc/aoc2024/day04/start.1733299044.txt.gz
  • Zuletzt geändert: 04.12.2024 07:57
  • von Marco Kuemmel