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

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung
Nächste Überarbeitung
Vorherige Überarbeitung
faecher:informatik:oberstufe:java:aoc:aco2023:day18:start [21.12.2023 16:27] Marco Kuemmelfaecher: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<int[]> trenchList;
 +Deque<int[]> fillQueue = new ArrayDeque();
 +private char[][] map;
 +
 public int partOne() { public int partOne() {
     trenchList = new ArrayList();     trenchList = new ArrayList();
Zeile 169: Zeile 176:
 71 71
 </code> </code>
-Die Fläche in der einen Spalte ist also: ''((3-1) + 1) + ((7-5) + 1)''+Die Fläche in der einen Spalte ist also: ''( (3-1) + 1) + ( (7-5) + 1) ''
  
 +++++ Lösungsvorschlag Teil 2 |
 +<code java>
 +private ArrayList<ArrayList<Integer>> spalten;
 +
 +public long partTwo() {
 +    ArrayList<String> anweisungen = new ArrayList();
 +    spalten = new ArrayList();
 +    int breite = 0;
 +
 +    for (String line: inputLines) {
 +        String hex = line.split("#")[1].split("[)]")[0];
 +        int steps = Integer.parseInt(hex.substring(0, 5), 16);  
 +        // zähle alle schritte nach rechts
 +        if (hex.substring(5).equals("0")) {
 +            breite += steps;
 +        }
 +        anweisungen.add(steps + hex.substring(5));
 +    }
 +
 +    ArrayList<ArrayList<String>> spalten = new ArrayList();
 +    for (int i = 0; i < breite; i++) {
 +        spalten.add(new ArrayList<String>());
 +    }
 +
 +    int x = 0;
 +    int y = 0;
 +    for (String anweisung: anweisungen) {
 +        // rechts
 +        if (anweisung.charAt(anweisung.length()-1) == '0') {
 +            // 0 am Ende bedeutet: ein oberes Ende vom Pool innerhalb der Spalte
 +            spalten.get(x).add(y + "" + 0);
 +            int steps = Integer.parseInt(anweisung.substring(0, anweisung.length()-1));
 +            for (int i = 0; i < steps; i++) {
 +                x = (x+1) % breite;
 +                spalten.get(x).add(y + "" + 0);
 +            }
 +        }
 +        // unten
 +        else if (anweisung.charAt(anweisung.length()-1) == '1') {
 +            spalten.get(x).add(y + "" + 0);
 +            int steps = Integer.parseInt(anweisung.substring(0, anweisung.length()-1));
 +            y += steps;
 +            spalten.get(x).add(y + "" + 1);
 +        }
 +        // links
 +        else if (anweisung.charAt(anweisung.length()-1) == '2') {
 +            // 1 am Ende bedeutet: ein unteres Ende vom Pool innerhalb der Spalte
 +
 +            spalten.get(x).add(y + "" + 1);
 +            int steps = Integer.parseInt(anweisung.substring(0, anweisung.length()-1));
 +            for (int i = 0; i < steps; i++) {
 +                x--;
 +                if (x < 0) {
 +                    x = breite - 1;
 +                }
 +                spalten.get(x).add(y + "" + 1);
 +            }
 +        }
 +        // oben
 +        else if (anweisung.charAt(anweisung.length()-1) == '3') {
 +            spalten.get(x).add(y + "" + 1);
 +            int steps = Integer.parseInt(anweisung.substring(0, anweisung.length()-1));
 +            y -= steps;
 +            spalten.get(x).add(y + "" + 0);
 +        }
 +    }
 +
 +    long summe = 0;
 +    // Gehe über jede Spalte
 +    for (ArrayList<String> spalte: spalten) {            
 +
 +        // entferne alle vollständigen dopplungen (wandelt es in ein "sortiertes" Set um (alles kann dort nur einmalig vorkommen))
 +        Set<String> set = new LinkedHashSet<>(spalte);
 +        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.get(i).length()-1).equals(spalte.get(i+1).substring(0,spalte.get(i+1).length()-1))) {
 +                spalte.remove(i);
 +                spalte.remove(i); //zweimal i, da durch das erste Löschen die hinteren Elemente 1 nach vorne rücken
 +                i--;
 +            }
 +        }
 +
 +        for (int i = 0; i < spalte.size(); i = i+2) {
 +            summe += Integer.parseInt(spalte.get(i+1).substring(0, spalte.get(i+1).length()-1)) - Integer.parseInt(spalte.get(i).substring(0, spalte.get(i).length()-1)) + 1;
 +        }
 +    }
 +
 +    return summe;
 +}
 +
 +/**
 + * Selection-Sort, um die Werte pro Spalte nach Zahlenwert zu sortieren.
 + */
 +private ArrayList<String> sortArrayList(ArrayList<String> input) {
 +    for (int i = 0; i < input.size(); i++) {
 +        int min = i;
 +        for (int j = i; j < input.size(); j++) {
 +            if (Integer.parseInt(input.get(j).substring(0, input.get(j).length()-1)) < Integer.parseInt(input.get(min).substring(0, input.get(min).length()-1))) {
 +                min = j;
 +            }
 +        }
 +        String temp = input.get(min);
 +        input.set(min, input.get(i));
 +        input.set(i, temp);
 +    }
 +
 +    return input;
 +}
 +</code>
 +++++
 </pane> </pane>
 </tabs> </tabs>
  • faecher/informatik/oberstufe/java/aoc/aco2023/day18/start.1703176078.txt.gz
  • Zuletzt geändert: 21.12.2023 16:27
  • von Marco Kuemmel