====== Tag 3: Binäre Diagnostik ====== ===== Aufgabe, Beispiele, Input ===== * Aufgabe: https://adventofcode.com/2021/day/3 * Input-Dateien: {{ d3.zip |}} * Ergebnis für die Datei ''d3i'': ++ Teil 1 | 2972336 ++ ++Teil2 | 3368358 ++ ===== Teil 1 ===== Für Teil 1 reicht es aus, wenn man die Gamma-Rate bestimmt, da die Epsilon-Rate das bitweise Inverse der Gamma-Rate ist. Um die Gamma-Rate zu bestimmen, muss man durch alle Zeilen der Eingabe und alle Stellen der Zahlen gehen und die Einsen zählen. Ein Methode, die hier wertvoll ist, ist ''toCharArray()'' der String-Klasse: char[] chars = line[0].toCharArray(); So erhält man ein Array aus ''char''-Werten, so kann man stellenweise über die Werte der Zeilen iterieren und die Einsen zählen. Beachten sollte man, dass die Werte in der Beispieldatei kürzer sind, als die im Input, hier muss flexibel programmiert werden, z.B. indem man mal schaut, wie lange die erste Zahl ist: int numBits = list.get(0)[0].toCharArray().length; ===== Teil 2 ===== In Teil zwei kann man die ArrayList verkleinern, indem man sich bei jedem Durchlauf merkt, welche Zeilen gelöscht werden sollen: // Erstelle eine Kopie der InputListe mit dem Namen myList ArrayList myList = new ArrayList(list); // Erstelle eine Liste, die die zu löschenden Elemente aufnimmt ArrayList toDelete = new ArrayList(); // Für jedes Bit... // Finde raus, welche zeilen gelöscht werden müssen // füge diese in die toDelete Liste ein: [...] toDelete.add(line); [...] // to Delete aus myList löschen myList.removeAll(toDelete); // toDelete leeren für den nächsten Bit-Durchlauf toDelete.clear(); // Bit-Durchläufe abbrechen, wenn es nur noch // einen Wert gibt if (myList.size() == 1) { break; } [...]