====== 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);
}
++++