Der heutige Tag lässt sich mit Rekursion relativ einfach lösen.
Tipps zur Vorgehensweise
Genaue Vorgehensweise in der Rekursion:
Lösungsvorschlag
public void partOne() {
long sum = 0;
for (String line: inputLines) {
long result = Long.parseLong(line.split(":")[0]);
ArrayList<Integer> numbers = new ArrayList();
// Iteriere über jede Zahl (noch als String-Array)
for (String number: line.split(":")[1].trim().split(" ")) {
numbers.add(Integer.parseInt(number));
}
if (equationPossible(result, numbers, 0, 0)) {
sum += result;
}
}
System.out.println(sum);
}
private boolean equationPossible(long result, ArrayList<Integer> numbers, int index, long calculation) {
// Abbruchbedingung: Alle Zahlen verrechnet
if (index == numbers.size()) {
return result == calculation;
}
if (index == 0) {
if (equationPossible(result, numbers, 2, numbers.get(0) + numbers.get(1))) {
return true;
} else if (equationPossible(result, numbers, 2, numbers.get(0) * numbers.get(1))) {
return true;
}
} else {
if (equationPossible(result, numbers, index+1, calculation + numbers.get(index))) {
return true;
} else if (equationPossible(result, numbers, index+1, calculation * numbers.get(index))) {
return true;
}
}
return false;
}
Der Beginn von Teil 2 ist identisch! Einzig die rekursive Methode muss um einen dritten Fall (Zusammenfügen der Zahlen anstatt +/*) erweitert werden!
Das Zusammenfügen geht vermutlich am einfachsten, indem man die "vordere Zahl" mit der Zehnerpotenz $10^x$ multipliziert, wobei $x$ die Anzahl der Ziffern der "hinteren Zahl" ist. Schließlich müssen alle Ziffern der "vorderen Zahl" entsprechend nach links geschoben werden. Anschließend muss man noch die hintere Zahl addieren. Die Potenz geht mit folgendem Code: Math.pow(10, String.valueOf(numbers.get(index)).length())
. Die hintere Zahl wird also in einen String umgewandelt, von dem man dann die String-Länge ermitteln kann. Dies ist der Exponent. Achtung: Diese Zahl wird meist ungeheuerlich groß → In Long umwandeln!
Lösungsvorschlag
public void partTwo() {
long sum = 0;
for (String line: inputLines) {
long result = Long.parseLong(line.split(":")[0]);
ArrayList<Integer> numbers = new ArrayList();
for (String number: line.split(":")[1].trim().split(" ")) {
numbers.add(Integer.parseInt(number));
}
if (equationPossible2(result, numbers, 0, 0)) {
sum += result;
}
}
System.out.println(sum);
}
private boolean equationPossible2(long result, ArrayList<Integer> numbers, int index, long calculation) {
if (index == numbers.size()) {
return result == calculation;
}
if (index == 0) {
if (equationPossible2(result, numbers, 2, numbers.get(0) + numbers.get(1))) {
return true;
} else if (equationPossible2(result, numbers, 2, numbers.get(0) * numbers.get(1))) {
return true;
} else if (equationPossible2(result, numbers, 2, (long)(numbers.get(0) * Math.pow(10, String.valueOf(numbers.get(1)).length())) + numbers.get(1))) {
return true;
}
} else {
if (equationPossible2(result, numbers, index+1, calculation + numbers.get(index))) {
return true;
} else if (equationPossible2(result, numbers, index+1, calculation * numbers.get(index))) {
return true;
} else if (equationPossible2(result, numbers, index+1, (long)(calculation * Math.pow(10, String.valueOf(numbers.get(index)).length())) + numbers.get(index))) {
return true;
}
}
return false;
}