Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Nächste Überarbeitung | Vorherige Überarbeitung | ||
faecher:informatik:oberstufe:java:aoc:aco2023:day18:start [21.12.2023 09:30] – angelegt Marco Kuemmel | faecher:informatik:oberstufe:java:aoc:aco2023:day18:start [21.12.2023 16:56] (aktuell) – Marco Kuemmel | ||
---|---|---|---|
Zeile 17: | Zeile 17: | ||
++++ Lösungsvorschlag | | ++++ Lösungsvorschlag | | ||
<code java> | <code java> | ||
+ | private int breite; | ||
+ | private int hoehe; | ||
+ | |||
+ | private ArrayList< | ||
+ | Deque< | ||
+ | private char[][] map; | ||
+ | |||
public int partOne() { | public int partOne() { | ||
trenchList = new ArrayList(); | trenchList = new ArrayList(); | ||
Zeile 130: | Zeile 137: | ||
===== Lösungshinweise Teil 2 ===== | ===== Lösungshinweise Teil 2 ===== | ||
* Für Teil 2 werden die Zahlen zu groß, sodass die Lösung aus Teil 1 nicht mehr ausreicht. Die Hauptvorgehensweise ist folgende: | * Für Teil 2 werden die Zahlen zu groß, sodass die Lösung aus Teil 1 nicht mehr ausreicht. Die Hauptvorgehensweise ist folgende: | ||
- | {{ : | + | {{ : |
- | * Gehe der Reihe nach die Befehle entlang. Trage aber keine Kreuze in eine 2-dimensionale Matrix, sondern betrachte nur die einzelnen Spalten. Wenn | + | * Gehe der Reihe nach die Befehle entlang. Trage aber keine Kreuze in eine 2-dimensionale Matrix, sondern betrachte nur die einzelnen Spalten |
+ | * Wenn du gerade nach **rechts** läufst, dann markierst du, dass du mit dem aktuellen y-Wert das **obere Ende** des Lava-Pools. | ||
+ | * Beim nach **links** laufen markierst du mit dem y-Wert das **untere Ende** des Lava-Pools. | ||
+ | * Wenn du nach **unten** läufst, dann ist dein oberer Startpunkt, das obere Ende des Lava-Pools. Als weiteren y-Wert trägst du ein, wie viele y-Werte du weiter nach unten zu gehen hast (das ist dann ein mögliches unteres Ende des Pools). | ||
+ | * Beim nach **oben** laufen ist der untere Startpunkt ein unteres Ende des Pools, und beim " | ||
+ | * Beispiel für das rechte Bild (Annahme, dass die Erstellung des Pfades im Uhrzeigersinn geschah): in der Spalte für x=5 stehen folgende y-Werte drin: | ||
+ | < | ||
+ | 0 (wegen " | ||
+ | 0 (wegen oberes Ende von " | ||
+ | 1 (wegen " | ||
+ | 1 (wegen unteres Ende von " | ||
+ | 3 (wegen " | ||
+ | 5 (wegen " | ||
+ | 5 (wegen oberes Ende von " | ||
+ | 7 (wegen unteres Ende von " | ||
+ | 7 (wegen " | ||
+ | </ | ||
+ | Nun muss man zusätzlich noch unterscheiden, | ||
+ | < | ||
+ | 00 | ||
+ | 00 | ||
+ | 10 | ||
+ | 11 | ||
+ | 31 | ||
+ | 50 | ||
+ | 50 | ||
+ | 71 | ||
+ | 71 | ||
+ | </ | ||
+ | Hat man diese Werte, kann man schnell die Differenzen ausrechnen und damit die Fläche über alle Spalten aufsummieren. Wichtig ist nun, die Werte noch zu bereinigen: | ||
+ | y=1 hat die Endung 0 und 1 (kommt doppelt vor). Wir können daher y=1 gänzlich aus der Liste streichen. Ebenso können wir alle anderen Dopplungen streichen und müssen die Einträge sortieren (der Pfad kann " | ||
+ | < | ||
+ | 00 | ||
+ | 31 | ||
+ | 50 | ||
+ | 71 | ||
+ | </ | ||
+ | Die Fläche in der einen Spalte ist also: '' | ||
+ | |||
+ | ++++ Lösungsvorschlag Teil 2 | | ||
+ | <code java> | ||
+ | private ArrayList< | ||
+ | |||
+ | public long partTwo() { | ||
+ | ArrayList< | ||
+ | spalten = new ArrayList(); | ||
+ | int breite = 0; | ||
+ | |||
+ | for (String line: inputLines) { | ||
+ | String hex = line.split("#" | ||
+ | int steps = Integer.parseInt(hex.substring(0, | ||
+ | // zähle alle schritte nach rechts | ||
+ | if (hex.substring(5).equals(" | ||
+ | breite += steps; | ||
+ | } | ||
+ | anweisungen.add(steps + hex.substring(5)); | ||
+ | } | ||
+ | |||
+ | ArrayList< | ||
+ | for (int i = 0; i < breite; i++) { | ||
+ | spalten.add(new ArrayList< | ||
+ | } | ||
+ | |||
+ | int x = 0; | ||
+ | int y = 0; | ||
+ | for (String anweisung: anweisungen) { | ||
+ | // rechts | ||
+ | if (anweisung.charAt(anweisung.length()-1) == ' | ||
+ | // 0 am Ende bedeutet: ein oberes Ende vom Pool innerhalb der Spalte | ||
+ | spalten.get(x).add(y + "" | ||
+ | int steps = Integer.parseInt(anweisung.substring(0, | ||
+ | for (int i = 0; i < steps; i++) { | ||
+ | x = (x+1) % breite; | ||
+ | spalten.get(x).add(y + "" | ||
+ | } | ||
+ | } | ||
+ | // unten | ||
+ | else if (anweisung.charAt(anweisung.length()-1) == ' | ||
+ | spalten.get(x).add(y + "" | ||
+ | int steps = Integer.parseInt(anweisung.substring(0, | ||
+ | y += steps; | ||
+ | spalten.get(x).add(y + "" | ||
+ | } | ||
+ | // links | ||
+ | else if (anweisung.charAt(anweisung.length()-1) == ' | ||
+ | // 1 am Ende bedeutet: ein unteres Ende vom Pool innerhalb der Spalte | ||
+ | |||
+ | spalten.get(x).add(y + "" | ||
+ | int steps = Integer.parseInt(anweisung.substring(0, | ||
+ | for (int i = 0; i < steps; i++) { | ||
+ | x--; | ||
+ | if (x < 0) { | ||
+ | x = breite - 1; | ||
+ | } | ||
+ | spalten.get(x).add(y + "" | ||
+ | } | ||
+ | } | ||
+ | // oben | ||
+ | else if (anweisung.charAt(anweisung.length()-1) == ' | ||
+ | spalten.get(x).add(y + "" | ||
+ | int steps = Integer.parseInt(anweisung.substring(0, | ||
+ | y -= steps; | ||
+ | spalten.get(x).add(y + "" | ||
+ | } | ||
+ | } | ||
+ | |||
+ | long summe = 0; | ||
+ | // Gehe über jede Spalte | ||
+ | for (ArrayList< | ||
+ | |||
+ | // entferne alle vollständigen dopplungen (wandelt es in ein " | ||
+ | Set< | ||
+ | spalte.clear(); | ||
+ | spalte.addAll(set); | ||
+ | |||
+ | // sortiere | ||
+ | spalte = sortArrayList(spalte); | ||
+ | |||
+ | // prüfe nun, ob direkte Nachfolger in allen Zeichen exklusive dem letzten übereinstimmen -> y-koordinate gleichzeitig oberes und unteres Ende -> kann entfernt werden. | ||
+ | for (int i = 0; i < spalte.size() - 1; i++) { | ||
+ | if (spalte.get(i).substring(0, | ||
+ | spalte.remove(i); | ||
+ | spalte.remove(i); | ||
+ | i--; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | for (int i = 0; i < spalte.size(); | ||
+ | summe += Integer.parseInt(spalte.get(i+1).substring(0, | ||
+ | } | ||
+ | } | ||
+ | |||
+ | return summe; | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * Selection-Sort, | ||
+ | */ | ||
+ | private ArrayList< | ||
+ | for (int i = 0; i < input.size(); | ||
+ | int min = i; | ||
+ | for (int j = i; j < input.size(); | ||
+ | if (Integer.parseInt(input.get(j).substring(0, | ||
+ | min = j; | ||
+ | } | ||
+ | } | ||
+ | String temp = input.get(min); | ||
+ | input.set(min, | ||
+ | input.set(i, | ||
+ | } | ||
+ | |||
+ | return input; | ||
+ | } | ||
+ | </ | ||
+ | ++++ | ||
</ | </ | ||
</ | </ |