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:day4:start [04.12.2023 09:16] – Marco Kuemmel | faecher:informatik:oberstufe:java:aoc:aco2023:day4:start [06.12.2023 12:19] (aktuell) – Frank Schiebel | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ====== Tag 4 ====== | + | ~~NOTOC~~ |
+ | ====== Tag 4: Scratchcards ====== | ||
+ | |||
+ | ===== Aufgabe ===== | ||
+ | |||
+ | * {{ : | ||
+ | * {{ : | ||
+ | |||
+ | ++++ Kontrollergebnisse | | ||
+ | * Eingabedatei d4e.txt: [Teil 1 - 13] [Teil 2 - 30] | ||
+ | * Eingabedatei d4i.txt: [Teil 1 - 26443] [Teil 2 - 6284877] | ||
+ | ++++ | ||
+ | |||
+ | ===== Hinweise ===== | ||
+ | |||
< | < | ||
* [[# | * [[# | ||
+ | * [[# | ||
<pane id=" | <pane id=" | ||
Zeile 10: | Zeile 25: | ||
* Zähle, wie häufig die hinteren Zahlen in den vorderen Zahlen vorkamen. Die Punkte pro Zeile berechnest du dann mit 2^(anzahl-1) | * Zähle, wie häufig die hinteren Zahlen in den vorderen Zahlen vorkamen. Die Punkte pro Zeile berechnest du dann mit 2^(anzahl-1) | ||
- | ++++ Lösungsvorschlag 1 | | + | ++++ Lösungsvorschlag 1 | |
<code java> | <code java> | ||
private int[] stringToIntArray(String str) { | private int[] stringToIntArray(String str) { | ||
Zeile 46: | Zeile 61: | ||
return summe; | return summe; | ||
} | } | ||
- | </code > | + | </ |
++++ | ++++ | ||
+ | |||
+ | ==== Teil 2 ==== | ||
+ | Aus Zeitgründen hier nur ein Lösungsvorschlag (Methoden aus Teil 1 werden benötigt): | ||
+ | ++++ Lösungsvorschlag | | ||
+ | <code Java> | ||
+ | public int partTwo() { | ||
+ | int summe = 0; | ||
+ | |||
+ | int[] amountOfCards = new int[inputLines.size()]; | ||
+ | for (int i = 0; i < amountOfCards.length; | ||
+ | amountOfCards[i] = 1; | ||
+ | } | ||
+ | | ||
+ | for (int l = 0; l < inputLines.size(); | ||
+ | String line = inputLines.get(l); | ||
+ | |||
+ | String winningNumbersStr = line.split(" | ||
+ | String numbersYouHaveStr = line.split(" | ||
+ | | ||
+ | int[] winningNumbers, | ||
+ | winningNumbers = stringToIntArray(winningNumbersStr); | ||
+ | numbersYouHave = stringToIntArray(numbersYouHaveStr); | ||
+ | | ||
+ | int numberOfMatches = 0; | ||
+ | for (int number : numbersYouHave) { | ||
+ | for (int winningNumber : winningNumbers) { | ||
+ | if (number == winningNumber) { | ||
+ | numberOfMatches++; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | | ||
+ | for (int i = l+1; numberOfMatches > 0; i++) { | ||
+ | amountOfCards[i] += amountOfCards[l]; | ||
+ | numberOfMatches--; | ||
+ | } | ||
+ | } | ||
+ | | ||
+ | for (int i : amountOfCards) { | ||
+ | summe += i; | ||
+ | } | ||
+ | return summe; | ||
+ | } | ||
+ | </ | ||
+ | ++++ | ||
+ | |||
+ | |||
</ | </ | ||
+ | <pane id=" | ||
+ | Die grundsätzlichen Tipps aus Variante 1 haben Bestand - allerdings wird zunächst eine ArrayList des Typs '' | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Das Spielkartenobjekt hat die Attribute: | ||
+ | |||
+ | * cardNo - Kartennummer | ||
+ | * worth - Der Wert der Karte gemäß des Rätsels Teil 1. | ||
+ | * anzahl - Die Anzahl, die man von dieser Karte besitzt. In Teil 1 nicht nötig. | ||
+ | * winningNumbers - ArrayList mit den Gewinnzahlen. | ||
+ | * havingNumbers - ArrayList mit den Zahlen,die man " | ||
+ | |||
+ | Die Klasse '' | ||
+ | |||
+ | <code java> | ||
+ | | ||
+ | | ||
+ | [...] | ||
+ | | ||
+ | // Lese die Eingabedatei | ||
+ | this.readInput(inputFile); | ||
+ | | ||
+ | cards = new ArrayList<> | ||
+ | for(String line: inputLines) { | ||
+ | int cardNum = Integer.parseInt(line.split(":" | ||
+ | String numberString = line.split(":" | ||
+ | cards.add(new gameCard(cardNum, | ||
+ | } | ||
+ | } | ||
+ | [...] | ||
+ | </ | ||
+ | |||
+ | Der Konstruktor der Klasse '' | ||
+ | |||
+ | < | ||
+ | [...] | ||
+ | private ArrayList< | ||
+ | private ArrayList< | ||
+ | private int cardNo; | ||
+ | private int worth; | ||
+ | private int anzahl; | ||
+ | |||
+ | [...] | ||
+ | |||
+ | public gameCard(int cardNo, int anzahl, String allNumbers) | ||
+ | { | ||
+ | winningNumbers = new ArrayList<> | ||
+ | havingNumbers = new ArrayList<> | ||
+ | |||
+ | this.cardNo = cardNo; | ||
+ | this.anzahl = anzahl; | ||
+ | |||
+ | // FIXME: Befülle die Arraylists winningNumbers und havingNumbers | ||
+ | // indem du den String allNumbers am | splittest, die beiden Teile | ||
+ | // dann an den Leerzeichen aufteilst, in Integers umwandelst und in die | ||
+ | // ArrayLists einfügst. | ||
+ | | ||
+ | | ||
+ | // FIXME Implementiere die Methode calculateWorth, | ||
+ | // eine ganze Zahl zurückliefert und den Wert für die | ||
+ | // Karte hier korrekt setzt. | ||
+ | this.worth = calculateWorth(); | ||
+ | |||
+ | } | ||
+ | | ||
+ | // Das geht ohne die Potenzfunktion, | ||
+ | private int calculateWorth() { | ||
+ | int worth = 0; | ||
+ | //FIXME | ||
+ | | ||
+ | return worth; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | === Hinweise Teil 1 === | ||
+ | |||
+ | Nach dieser Vorbereitung ist Teil 1 trivial: Man iteriert in einer Schleife durch alle Karten und addiert die Kartewerte, die man sich mit einem Getter '' | ||
+ | |||
+ | === Hinweise Teil 2 === | ||
+ | |||
+ | * Für Teil 2 benötigt die Klasse | ||
+ | * Jede Karte wird nur einmal angeschaut, und die Anzahl der Karte wird zum Rätselergebnis addiert. | ||
+ | * Anschließend müssen die Zahlen der Nachfolgenden Zahlen gemäß der Regeln erhöht werden. Dazu bekommt die Klasse '' | ||
+ | * Jetzt muss man nur noch für die nächsten " | ||
+ | |||
+ | <code java> | ||
+ | [...] | ||
+ | |||
+ | // Das erzeugt einen Iterator, der am Index " | ||
+ | Iterator< | ||
+ | // FIXME da fehlt noch was. | ||
+ | |||
+ | [...] | ||
+ | |||
+ | int steps=0; | ||
+ | while(it.hasNext() && steps < gewonneneKarten) { | ||
+ | | ||
+ | // FIXME hier fehlt was | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | [[https:// | ||
+ | </ | ||
+ | |||
+ | === Lösungsvorschlag nach Variante 2 === | ||
+ | |||
+ | |||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | |||
</ | </ |