Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
faecher:informatik:oberstufe:java:aoc:aco2023:day7:start [07.12.2023 14:26] – [Hilfestellung Teil 1] Marco Kuemmel | faecher:informatik:oberstufe:java:aoc:aco2023:day7:start [07.12.2023 19:43] (aktuell) – [Variante 2: Objekte] Frank Schiebel | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | |||
+ | ~~NOTOC~~ | ||
< | < | ||
* [[# | * [[# | ||
+ | * [[# | ||
<pane id=" | <pane id=" | ||
Zeile 129: | Zeile 132: | ||
</ | </ | ||
++++ | ++++ | ||
+ | |||
+ | ====== Hilfestellung Teil 2 ====== | ||
+ | Für Teil 2 benötigt man an zwei Stellen kleinere Anpassungen. | ||
+ | - Bei der Erfassung der Types muss anders vorgegangen werden. Man kann die Methode '' | ||
+ | - Der Comparator muss minimal umgeschrieben werden, indem man die Reihenfolge der Zeichen ändert. | ||
+ | |||
+ | |||
+ | ++++ Lösungsvorschlag | | ||
+ | <code java> | ||
+ | private int getType2(String hand) { | ||
+ | boolean fiveOfAKind = false; | ||
+ | boolean fourOfAKind = false; | ||
+ | boolean threeOfAKind = false; | ||
+ | int pairs = 0; | ||
+ | |||
+ | char[] chars = hand.toCharArray(); | ||
+ | Arrays.sort(chars); | ||
+ | |||
+ | char lastChar = chars[0]; | ||
+ | int counter = 1; | ||
+ | for (int i = 1; i < chars.length; | ||
+ | if (chars[i] == ' | ||
+ | continue; | ||
+ | } | ||
+ | | ||
+ | if (chars[i] != lastChar) { | ||
+ | |||
+ | if (counter == 4) { | ||
+ | fourOfAKind = true; | ||
+ | } else if (counter == 3) { | ||
+ | threeOfAKind = true; | ||
+ | } else if (counter == 2) { | ||
+ | pairs++; | ||
+ | } | ||
+ | lastChar = chars[i]; | ||
+ | counter = 1; | ||
+ | continue; | ||
+ | } | ||
+ | |||
+ | counter++; | ||
+ | } | ||
+ | if (counter == 5) { | ||
+ | fiveOfAKind = true; | ||
+ | } else if (counter == 4) { | ||
+ | fourOfAKind = true; | ||
+ | } else if (counter == 3) { | ||
+ | threeOfAKind = true; | ||
+ | } else if (counter == 2) { | ||
+ | pairs++; | ||
+ | } | ||
+ | |||
+ | if (fiveOfAKind) { | ||
+ | return 0; | ||
+ | } else if (fourOfAKind) { | ||
+ | return 1; | ||
+ | } else if (threeOfAKind && pairs == 1) { | ||
+ | return 2; | ||
+ | } else if (threeOfAKind && pairs == 0) { | ||
+ | return 3; | ||
+ | } else if (pairs == 2) { | ||
+ | return 4; | ||
+ | } else if (pairs == 1) { | ||
+ | return 5; | ||
+ | } else { | ||
+ | return 6; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | private int pimpType(int type, String card) { | ||
+ | int amountOfJ = 0; | ||
+ | for (int i = 0; i < card.length(); | ||
+ | if (card.charAt(i) == ' | ||
+ | amountOfJ++; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | int result = type; | ||
+ | for (int i = 0; i < amountOfJ; i++) { | ||
+ | if (type == 0 || type == 1) { | ||
+ | type = 0; | ||
+ | } else if (type == 2 || type == 3) { | ||
+ | type = 1; | ||
+ | } else if (type == 4) { | ||
+ | type = 2; | ||
+ | } else if (type == 5) { | ||
+ | type = 3; | ||
+ | } else { | ||
+ | type = 5; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | return type; | ||
+ | } | ||
+ | |||
+ | public long partTwo() { | ||
+ | ArrayList< | ||
+ | |||
+ | for (String line: inputLines) { | ||
+ | lines.add(line.split(" | ||
+ | } | ||
+ | |||
+ | // Die folgende Datenstruktur enthält 7 ArrayLists für String[] (die einzelnen Zeilen). | ||
+ | // In der ersten ArrayList werden die stärksten Kartentypen gespeichert und in den darauffolgenden die schwächeren. | ||
+ | ArrayList< | ||
+ | for (int i = 0; i < 7; i++) { | ||
+ | ranks.add(new ArrayList< | ||
+ | } | ||
+ | |||
+ | // sortiere die einzelnen Zeilen nach Karten-Typ-Rang. Es ist noch NICHT nach Kartenwert innerhalb eines Kartentyps sortiert. | ||
+ | for (String[] line: lines) { | ||
+ | int type = getType2(line[0]); | ||
+ | type = pimpType(type, | ||
+ | ranks.get(type).add(line); | ||
+ | } | ||
+ | |||
+ | long result = 0; | ||
+ | int rankCounter = 1; | ||
+ | for (int r = ranks.size() - 1 ; r >= 0; r--) { | ||
+ | ArrayList< | ||
+ | |||
+ | rank.sort(cardComparator2); | ||
+ | for (int l = rank.size() - 1; l >= 0; l--) { | ||
+ | String line = rank.get(l)[1]; | ||
+ | result += rankCounter * Integer.parseInt(line); | ||
+ | rankCounter++; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | return result; | ||
+ | } | ||
+ | </ | ||
+ | ++++ | ||
+ | </ | ||
+ | <pane id=" | ||
+ | ====== Variante 2: Objekte ====== | ||
+ | |||
+ | Variante zwei wieder mit Objekten: | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Wie bei den Sortieralgorithmen | ||
+ | |||
+ | * Wir erzeugen für jede Zeile in der Eingabe ein '' | ||
+ | * Dann wollen wir die Objekte sortieren - allerdings reicht der Vergleich der Typen nicht aus, weil man bei zwei " | ||
+ | * Also implementieren wir in der Klasse Hand die Methode '' | ||
+ | |||
+ | Die Lösung für Teil 1 und Teil 2 findet sich im selben Code, ich habe versucht das verständlich zu kommentieren. Wenn du nicht viel Programmiererfahrung hast, musst du wahrscheinlich auch an anderer Stelle noch nachlesen: | ||
+ | |||
+ | * Teil 1: [[https:// | ||
+ | * Teil 1&2: [[https:// | ||
+ | |||
</ | </ | ||
</ | </ |