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:day1:start [01.12.2023 17:22] – [Bearbeiten - Pane] Frank Schiebel | faecher:informatik:oberstufe:java:aoc:aco2023:day1:start [12.11.2024 06:25] (aktuell) – Frank Schiebel | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
====== Tag 1 ====== | ====== Tag 1 ====== | ||
- | Mehrere Zeilen werden eingelesen, diese bestehen aus Buchstaben und Zahlen. Man muss die erste Zahl und die letzte Zahl jeder Zeile finden. Es kann auch manchmal nur eine Zahl in der ganzen Zeile geben, dann fungiert diese sowohl als erste, als auch als letzte Zahl. Diese beiden Zahlen werden zusammengesetzt als zweistellige Zahl. Alle zweistelligen Zahlen aus jeder Zeile werden zusammenaddiert und bilden das gesuchte Ergebnis. | + | ===== Aufgabe ===== |
- | + | ||
+ | * {{ : | ||
+ | * {{ : | ||
+ | * Beispiele d1e1.txt, d1e2.txt | ||
+ | * Input d2i.txt. | ||
+ | ++++ Kontrollergebnisse | | ||
+ | * Eingabedatei d1i.txt: | ||
+ | * Teil 1 - '' | ||
+ | * Teil 2 - '' | ||
+ | ++++ | ||
< | < | ||
Zeile 15: | Zeile 22: | ||
==== Hilfestellungen Variante 1 ==== | ==== Hilfestellungen Variante 1 ==== | ||
- | ===== Teil 1 ===== | + | === Teil 1 === |
+ | |||
+ | |||
+ | Mehrere Zeilen werden eingelesen, diese bestehen aus Buchstaben und Zahlen. Man muss die erste Zahl und die letzte Zahl jeder Zeile finden. Es kann auch manchmal nur eine Zahl in der ganzen Zeile geben, dann fungiert diese sowohl als erste, als auch als letzte Zahl. Diese beiden Zahlen werden zusammengesetzt als zweistellige Zahl. Alle zweistelligen Zahlen aus jeder Zeile werden zusammenaddiert und bilden das gesuchte Ergebnis. | ||
++++ Tipp 1 | | ++++ Tipp 1 | | ||
Zeile 68: | Zeile 78: | ||
++++ | ++++ | ||
- | ===== Teil 2 ===== | + | === Teil 2 === |
Der zweite Teil knüpft direkt an Teil 1 an. Von nun an müssen auch die ausgeschriebenen Zahlen (" | Der zweite Teil knüpft direkt an Teil 1 an. Von nun an müssen auch die ausgeschriebenen Zahlen (" | ||
Zeile 152: | Zeile 162: | ||
<pane id=" | <pane id=" | ||
==== Hilfestellungen Variante 2 ==== | ==== Hilfestellungen Variante 2 ==== | ||
+ | |||
+ | === Hinweise zu Teil 1 === | ||
+ | |||
+ | Prinzipielles Vorgehen, um eine Zeile zu untersuchen: | ||
+ | |||
+ | * Wandle die Zeile in ein Array aus Zeichen um: '' | ||
+ | * Betrachte jedes Zeichen in einer '' | ||
+ | * Entscheide, ob das Zeichen eine Ziffer ist: '' | ||
+ | * Die erste gefundene Ziffer sind die Zehner, die letzte gefundene Ziffer sind die Einer. Mit einer Aggregationsvariablen kann man markieren, ob die 10er schon gefunden wurden. Wenn ja überschreibt man von diesem Zeitpunkt an die Einer mit der jeweils letzten gefundenen Ziffer. Sind Zehner und Einer dieselbe Ziffer, führt das hier nicht zu Problemen, weil zunächst der Marker auf " | ||
+ | * Wenn die Zeile bearbeite hat, erhält man den Kalibrierungswert für die Zeile als '' | ||
+ | |||
+ | Das macht man jetzt in einer Schleife für alle Zeilen und addiert dabei die Kalibrierungswerte. | ||
+ | |||
+ | ++++ Codegerüst | | ||
+ | |||
+ | <code java> | ||
+ | public int partOne() { | ||
+ | int answer=0; | ||
+ | | ||
+ | // Wiederhole für jede Zeile... | ||
+ | for(String line: inputLines) { | ||
+ | | ||
+ | // Untersuchung einer Zeile | ||
+ | | ||
+ | |||
+ | // Erzeuge ein Array aus Zeichen | ||
+ | char[] zeichen = FIXME | ||
+ | | ||
+ | // Marker: Wurde die erste Ziffer gefunden? | ||
+ | boolean ersteGefunden = false; | ||
+ | | ||
+ | // Die Zahl setzt sich aus " | ||
+ | int zehner=0; | ||
+ | int einer=0; | ||
+ | |||
+ | // Jedes Zeichen untersuchen | ||
+ | for(char z: zeichen) { | ||
+ | if (FIXME) { | ||
+ | zehner = Character.getNumericValue(z); | ||
+ | ersteGefunden = true; | ||
+ | } | ||
+ | |||
+ | if (FIXME) { | ||
+ | einer = Character.getNumericValue(z); | ||
+ | } | ||
+ | } | ||
+ | // Für jede Zeile das " | ||
+ | answer = answer + 10 * zehner + einer; | ||
+ | } | ||
+ | // Zu kopieren ins Lösungsfeld ausgeben | ||
+ | System.out.println(answer); | ||
+ | return answer; | ||
+ | } | ||
+ | </ | ||
+ | ++++ | ||
+ | |||
+ | === Hinweise zu Teil 2 === | ||
+ | |||
+ | In Teil 2 muss man auch noch " | ||
+ | |||
+ | Die Methode für Teil 1 hilft hier nicht direkt weiter, man kann stattdessen folgendes Vorgehen wählen: | ||
+ | |||
+ | * Den Wert für den Zehner ist stets das am weitesten links stehende Zahlwort oder die am weitesten links stehende Ziffer. Erkennen kann man die Position am Index im Array - das Element, mit dem kleinsten Indes gewinnt das Rennen als " | ||
+ | * Für die Einer geht man genauso vor, man such das Vorkommen eines Zahlworts oder einer Ziffer möglichst weit rechts. | ||
+ | * Aufpassen muss man - wie schon in Teil 1 - dass man die passenden Typen für die gewünschten Operationen verwendet und diese wenn nötig passend umwandelt. | ||
+ | |||
+ | Man kann zur Vereinfachung mit folgendem Array für die Zahlenworte arbeiten: | ||
+ | |||
+ | <code java> | ||
+ | String [] werte = { | ||
+ | " | ||
+ | " | ||
+ | }; | ||
+ | </ | ||
+ | |||
+ | Der " | ||
+ | |||
+ | Um die Zehnerstelle zu finden, sucht man jedes Zahlwort und jede dazugehörige Ziffer in der zu untersuchenden Zeile. Hier hilft die Methode '' | ||
+ | |||
+ | **Beispiel: | ||
+ | |||
+ | <code java> | ||
+ | String zeile = " | ||
+ | zeile.indexOf(" | ||
+ | zeile.indexOf(" | ||
+ | </ | ||
+ | |||
+ | Die Methode '' | ||
+ | |||
+ | Das folgende Codegerüst beinhaltet die nach dieser Logik implementierte Suche nach der Zehnerstelle - du kannst das nachvollziehen und versuchen, die Einerstelle und die Berechnung der GEsamtsumme nachzutragen. | ||
+ | |||
+ | ++++ Codegerüst für die Zehnerstelle | | ||
+ | <code java> | ||
+ | public int partTwo() { | ||
+ | int answer=0; | ||
+ | |||
+ | String [] werte = { | ||
+ | " | ||
+ | " | ||
+ | }; | ||
+ | |||
+ | for(String line: inputLines) { | ||
+ | |||
+ | // Suche Zehner, Positionen sind nicht vorhanden: -1 | ||
+ | int zehnerPosition=-1; | ||
+ | int zehnerWert=-1; | ||
+ | | ||
+ | // Jede Zahl von 1 bis 10 in der Zeile suchen, | ||
+ | // als Ziffer und als Zahlwort | ||
+ | for(int i=1; i< | ||
+ | // Gibts die Ziffer in der Zeile? | ||
+ | // Achtung: Integer.toString(i), | ||
+ | // Argument einen String! | ||
+ | int zifferPosition = line.indexOf(Integer.toString(i)); | ||
+ | // Gibst das Zahlwort in der Zeile? | ||
+ | int wortPosition = line.indexOf(werte[i]); | ||
+ | | ||
+ | // Position merken, wenn gefunden. | ||
+ | // Nur die am weitesten links stehende Postion liefert | ||
+ | // den Zehnerwert | ||
+ | | ||
+ | // Zuerst für die Ziffer | ||
+ | if(zifferPosition != -1) { | ||
+ | if( zehnerPosition == -1 || zifferPosition < zehnerPosition) { | ||
+ | zehnerPosition = zifferPosition; | ||
+ | zehnerWert = i; | ||
+ | } | ||
+ | } | ||
+ | // Jetzt für das Wort | ||
+ | // Beide Untersuchungen setzen wenn nötig | ||
+ | // zehnerPosition und zehnerWert neu | ||
+ | if(wortPosition != -1) { | ||
+ | if( zehnerPosition == -1 || wortPosition < zehnerPosition) { | ||
+ | zehnerPosition = wortPosition; | ||
+ | zehnerWert = i; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | | ||
+ | // Suche Einer | ||
+ | | ||
+ | // TODO | ||
+ | | ||
+ | answer = // Rechnen! | ||
+ | } | ||
+ | return answer | ||
+ | } | ||
+ | </ | ||
+ | ++++ | ||
+ | |||
+ | === Lösungsvorschlag === | ||
+ | |||
+ | Einen Lösungsvorschlag nach der Beschreibung Variante 2 findest du hier: https:// | ||
+ | |||
</ | </ | ||
</ | </ | ||