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

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Nächste Überarbeitung
Vorherige Überarbeitung
faecher:informatik:oberstufe:java:aoc:aco2023:day11:start [11.12.2023 10:05] – angelegt Marco Kuemmelfaecher:informatik:oberstufe:java:aoc:aco2023:day11:start [11.12.2023 16:34] (aktuell) – [Lösungshinweise Teil 2] Marco Kuemmel
Zeile 82: Zeile 82:
 </code> </code>
 ++++ ++++
 +
 +===== Lösungshinweise Teil 2 =====
 +  * Nur minimale Änderungen sind nötig gegenüber der Lösung aus Teil 1.
 +  * Zuvor wurde jede leere Zeile/Spalte verdoppelt (''+1''). Jetzt soll jede leere Zeile/Spalte durch eine Million leere Zeilen/Spalten **ersetzt** werden. Vorsicht an dieser Stelle: die Rechnung ist daher nun nicht ''+1000000''', sondern ''+999999''. Diese Änderung muss an allen drei Stellen durchgeführt werden, wo es direkt um die Abstände der leeren Zeilen/Spalten geht.
 +
 +++++ Lösungsvorschlag |
 +<code java>
 +public long partTwo() {
 +    // Sammle alle Spalten, die nur Punkte enthalten
 +    ArrayList<Integer> emptyColumns = new ArrayList<Integer>();
 +    for (int x = 0; x < inputLines.get(0).length(); x++) {
 +        boolean columnEmpty = true;
 +        for (int y = 0; y < inputLines.size(); y++) {
 +            if (inputLines.get(y).charAt(x) != '.') {
 +                columnEmpty = false;
 +                break;
 +            }
 +        }
 +        if (columnEmpty) {
 +            emptyColumns.add(x + emptyColumns.size() * 999999);
 +        }
 +    }
 +            
 +    ArrayList<long[]> galaxies = new ArrayList<long[]>();
 +    
 +    long y = 0;
 +    for (String line: inputLines) {
 +        char[] lineAsChars = line.toCharArray();
 +        
 +        // prüfe, ob zeile nur '.' enthält
 +        boolean zeileLeer = true;
 +        for (char c: lineAsChars) {
 +            if (c != '.') {
 +                zeileLeer = false;
 +                break;
 +            }
 +        }
 +        if (zeileLeer) {
 +            y += 999999;
 +        }
 +        
 +        int x = 0;
 +        for (char c: lineAsChars) {
 +            if (emptyColumns.contains(x)) {
 +                x += 999999;
 +            }
 +            else if (c == '#') {
 +                galaxies.add(new long[]{x, y});
 +            }
 +            x++;
 +        }
 +        
 +        y++;
 +    }
 +    
 +    long distances = 0;
 +    
 +    int skip = 1;
 +    for (long[] g1: galaxies) {
 +        for (int i = skip; i < galaxies.size(); i++) {
 +            long[] g2 = galaxies.get(i);
 +            distances += Math.abs(g1[0] - g2[0]) + Math.abs(g1[1] - g2[1]);
 +        }
 +        skip++;
 +    }
 +        
 +    return distances;
 +}
 +</code>
 +++++
 +
 +
 </pane> </pane>
 </tabs> </tabs>
  • faecher/informatik/oberstufe/java/aoc/aco2023/day11/start.1702289117.txt.gz
  • Zuletzt geändert: 11.12.2023 10:05
  • von Marco Kuemmel