====== Day 13: Claw Contraption ====== Den heutigen Tag könnte man auch zur **mittleren** Schwierigkeit zählen, das hängt vom mathematischen Verständnis ab. Teil 1 lässt sich noch "klassisch" mit Schleifen lösen. Für Teil 2 hingegen muss man das Problem als ein Gleichungssystem auffassen, das es zu lösen gilt! Mangels Zeit können nur die Lösungsvorschläge präsentiert werden. ===== Teil 1 ===== ++++ Lösungsvorschlag | // Alle drei Variablen als Instanzvariablen vom Typ long, damit sie in Methoden UND Teil 2 genutzt werden können private long[] btnA; private long[] btnB; private long[] prize; public void partOne() { int sumTokens = 0; for (String line: inputLines) { if (line.startsWith("Button A")) { btnA = new long[2]; btnA[0] = Integer.parseInt(line.split("\\+")[1].split(",")[0]); btnA[1] = Integer.parseInt(line.split("\\+")[2].trim()); } else if (line.startsWith("Button B")) { btnB = new long[2]; btnB[0] = Integer.parseInt(line.split("\\+")[1].split(",")[0]); btnB[1] = Integer.parseInt(line.split("\\+")[2].trim()); } else if (line.startsWith("Prize")) { prize = new long[2]; prize[0] = Integer.parseInt(line.split("=")[1].split(",")[0]); prize[1] = Integer.parseInt(line.split("=")[2].trim()); sumTokens += findeHaeufigkeiten(); } } System.out.println(sumTokens); } private int findeHaeufigkeiten() { int a = 0; while (a*btnA[0] < prize[0] && a*btnA[1] < prize[1] && a <= 100) { int b = 0; while (a*btnA[0]+b*btnB[0] <= prize[0] && a*btnA[1]+b*btnB[1] <= prize[1] && b <= 100) { if (a*btnA[0]+b*btnB[0] == prize[0] && a*btnA[1]+b*btnB[1] == prize[1]) { return 3*a+b; } b++; } a++; } return 0; } ++++ ===== Teil 2 ===== ++++ Lösungsvorschlag | public void partTwo() { long sumTokens = 0; for (String line: inputLines) { if (line.startsWith("Button A")) { btnA = new long[2]; btnA[0] = Long.parseLong(line.split("\\+")[1].split(",")[0]); btnA[1] = Long.parseLong(line.split("\\+")[2].trim()); } else if (line.startsWith("Button B")) { btnB = new long[2]; btnB[0] = Long.parseLong(line.split("\\+")[1].split(",")[0]); btnB[1] = Long.parseLong(line.split("\\+")[2].trim()); } else if (line.startsWith("Prize")) { prize = new long[2]; prize[0] = Long.parseLong(line.split("=")[1].split(",")[0]) + 10000000000000L; prize[1] = Long.parseLong(line.split("=")[2].trim()) + 10000000000000L; // löst die Gleichungen: // i * ax + j * bx = prizeX // i * ay + j * by = prizeY double i = (btnB[0]*prize[1] - btnB[1]*prize[0]) / (btnA[1] * btnB[0] - btnA[0]*btnB[1]); double j = (prize[0]-i*btnA[0]) / btnB[0]; if ((prize[0]-i*btnA[0])%btnB[0] == 0 && (btnB[0]*prize[1]-btnB[1]*prize[0])%(btnA[1]*btnB[0]-btnA[0]*btnB[1])==0) { sumTokens += 3*(long)i+(long)j; } } } System.out.println(sumTokens); } ++++