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!
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;
}