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:day2:start [02.12.2023 10:31] – [Bearbeiten - Pane] Marco Kuemmel | faecher:informatik:oberstufe:java:aoc:aco2023:day2:start [12.11.2024 06:32] (aktuell) – Frank Schiebel | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ~~NOTOC~~ | ||
+ | |||
====== Tag 2 ====== | ====== Tag 2 ====== | ||
+ | ===== Aufgabe ===== | ||
+ | |||
+ | * {{ : | ||
+ | * {{ : | ||
+ | * Beispiel d2e.txt | ||
+ | * Input d2i.txt. | ||
+ | |||
+ | |||
+ | ++++ Kontrollergebnisse | | ||
+ | * Eingabedatei d2e.txt: | ||
+ | * Teil 1 - '' | ||
+ | * Teil 2 - '''' | ||
+ | * Eingabedatei d6i.txt: | ||
+ | * Teil 1 - '' | ||
+ | * Teil 2 - '' | ||
+ | ++++ | ||
+ | |||
< | < | ||
* [[# | * [[# | ||
+ | * [[# | ||
<pane id=" | <pane id=" | ||
- | ==== Hilfestellungen | + | ==== Hilfestellungen |
* Du kannst/ | * Du kannst/ | ||
* Die split(" | * Die split(" | ||
Zeile 13: | Zeile 33: | ||
* Nutze eine boolean-Variable, | * Nutze eine boolean-Variable, | ||
- | ++++ Lösungsvorschlag 1 | | + | ++++ Lösungsvorschlag |
<code Java> | <code Java> | ||
private boolean colorAmountAllowed(String s) { | private boolean colorAmountAllowed(String s) { | ||
Zeile 64: | Zeile 84: | ||
return summe; | return summe; | ||
} | } | ||
+ | </ | ||
+ | ++++ | ||
+ | |||
+ | ==== Hilfestellungen Teil 2 ==== | ||
+ | * Das meiste der verschachtelten Schleifen kannst du stehen lassen. Du benötigst nun nicht mehr die boolean-Variable, | ||
+ | * Erstelle pro Zeile drei int-Variablen, | ||
+ | * Am Ende jeder Zeile fügst du das Produkt der drei Variablen zur Gesamtsumme hinzu. | ||
+ | |||
+ | ++++ Lösungsvorschlag Teil 2 | | ||
+ | <code Java> | ||
+ | int summe = 0; | ||
+ | |||
+ | for (String line : inputLines) { | ||
+ | // Speichere die Game ID | ||
+ | int gameID = Integer.parseInt(line.split(":" | ||
+ | | ||
+ | int greenMaxAmount = 1; | ||
+ | int redMaxAmount = 1; | ||
+ | int blueMaxAmount = 1; | ||
+ | | ||
+ | // Zerteile die line in die einzelnen " | ||
+ | String[] reveals = line.split(":" | ||
+ | for (String reveal : reveals) { | ||
+ | | ||
+ | // Zerteile jeden Reveal in die einzelnen Farben | ||
+ | String[] colors = reveal.split("," | ||
+ | for (String color : colors) { | ||
+ | String text = color.strip().split(" | ||
+ | int amount = Integer.parseInt(color.strip().split(" | ||
+ | | ||
+ | if (text.equals(" | ||
+ | greenMaxAmount = amount; | ||
+ | } else if (text.equals(" | ||
+ | redMaxAmount = amount; | ||
+ | } else if (text.equals(" | ||
+ | blueMaxAmount = amount; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | | ||
+ | summe += greenMaxAmount * redMaxAmount * blueMaxAmount; | ||
+ | | ||
+ | } | ||
+ | |||
+ | return summe; | ||
</ | </ | ||
++++ | ++++ | ||
</ | </ | ||
+ | <pane id=" | ||
+ | Das Prinzip von Variante 2 ist dasselbe wie bei Variante 1, die zentrale Methode zur Aufteilung der Zeilen ist und bleibt '' | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Anmerkung: Das ist natürlich Overkill - vor allem für die Züge eine eigene Klasse zu implementieren, | ||
+ | |||
+ | * Jede Klasse definiert einen neuen Datentyp, hier erhalten wir '' | ||
+ | * Die Klasse '' | ||
+ | * Die Klasse '' | ||
+ | |||
+ | Nun verlagert sich die Arbeit vor allem auf das Einlesen der Rätseldaten in der Methode '' | ||
+ | |||
+ | '' | ||
+ | |||
+ | * Splitte die Eingabezeile am Doppelpunkt, | ||
+ | * Der zweite Teil ist ein String mit allen Zügen zu diesem Spiel. | ||
+ | |||
+ | ++++ Tipp: Erster Split & Erzeugung des Spiel-Objekts | | ||
+ | |||
+ | <code java> | ||
+ | // Spielnummer | ||
+ | String gameString = line.split(":" | ||
+ | int spielNummer = Integer.parseInt(gameString.split(" | ||
+ | // Neues Spiel instanziieren | ||
+ | Spiel s = new Spiel(spielNummer); | ||
+ | |||
+ | // String mit allen Zügen | ||
+ | String drawString = line.split(":" | ||
+ | </ | ||
+ | |||
+ | ++++ | ||
+ | |||
+ | * Die einzelnen Züge erhält man durch den Split des Strings mit allen Zügen am Semikolon, die einzelnen Farben dann, indem man die Substrings an den Kommata splittet: | ||
+ | |||
+ | ++++ Tipp: Gerüst mit Schleifen zu den Zugdetails | | ||
+ | |||
+ | <code java> | ||
+ | // Einzelne Züge holen. | ||
+ | String[] draws = drawString.split(";" | ||
+ | for(String d: draws) { | ||
+ | // Die einzelnen Farben abarbeiten | ||
+ | int nRed = 0; | ||
+ | int nBlue = 0; | ||
+ | int nGreen = 0; | ||
+ | String[] colors = d.split("," | ||
+ | for(String c: colors) { | ||
+ | if(c.indexOf(" | ||
+ | if(c.indexOf(" | ||
+ | if(c.indexOf(" | ||
+ | } | ||
+ | s.fuegeZugHinzu(nRed, | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | ++++ | ||
+ | |||
+ | * Wenn das Spiel dann komplett, muss es noch in die ArrayList eingefügt werden: '' | ||
+ | |||
+ | |||
+ | === Die Lösungen für Teil 1 und 2 sehen in dieser Variante so aus: === | ||
+ | |||
+ | Jetzt kann man direkt über die Spiele iterieren und alle Infos nach belieben auswerten. | ||
+ | |||
+ | |||
+ | |||
+ | <code java> | ||
+ | |||
+ | public int partOne() { | ||
+ | int answer=0; | ||
+ | for(Spiel s: spiele) { | ||
+ | if( s.getMax(" | ||
+ | s.getMax(" | ||
+ | s.getMax(" | ||
+ | answer += s.getSpielNummer(); | ||
+ | } | ||
+ | } | ||
+ | return answer; | ||
+ | } | ||
+ | | ||
+ | public int partTwo() { | ||
+ | int answer=0; | ||
+ | for(Spiel s: spiele) { | ||
+ | int[] fewest = s.getFewestColorNums(); | ||
+ | answer += fewest[0] * fewest[1] * fewest[2]; | ||
+ | } | ||
+ | return answer; | ||
+ | } | ||
+ | </ | ||
+ | Code zu dieser Variante: https:// | ||
+ | |||
+ | </ | ||
+ | |||
</ | </ |