From 7891c409bb59494d946ff693d0cf3c8b96d1cc5c Mon Sep 17 00:00:00 2001 From: WanCW Date: Mon, 9 Dec 2024 11:38:41 +0800 Subject: [PATCH] complete day 7 --- 07-a.kts | 30 ++++++++++++++++++++++++++++++ 07-b.kts | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 07-a.kts create mode 100644 07-b.kts diff --git a/07-a.kts b/07-a.kts new file mode 100644 index 0000000..56b78da --- /dev/null +++ b/07-a.kts @@ -0,0 +1,30 @@ +import java.math.BigInteger +import java.util.* + +val scanner = Scanner(System.`in`) + +var sum: BigInteger = BigInteger.ZERO +while (scanner.hasNextLine()) { + val line = scanner.nextLine() + val numbersInLine = line.split("[: ]+".toRegex()).map(String::toBigInteger) + val target = numbersInLine.first() + val numbers = numbersInLine.drop(1) + val possibleResults = findAllPossibleResult(setOf(numbers.first()), numbers.drop(1)) + if (possibleResults.contains(target)) { + sum += target + } +} +println(sum) + +fun findAllPossibleResult(partialResults: Set, numbers: List): Set { + if (numbers.isEmpty()) return partialResults + + val head = numbers.first() + val tail = numbers.drop(1) + val newResults = partialResults.fold(HashSet()) { r, p -> + r.add(p.plus(head)) + r.add(p.times(head)) + r + } + return findAllPossibleResult(newResults, tail) +} \ No newline at end of file diff --git a/07-b.kts b/07-b.kts new file mode 100644 index 0000000..df9ea34 --- /dev/null +++ b/07-b.kts @@ -0,0 +1,32 @@ +import java.math.BigInteger +import java.util.* + +val scanner = Scanner(System.`in`) + +var sum: BigInteger = BigInteger.ZERO +while (scanner.hasNextLine()) { + val line = scanner.nextLine() + val numbersInLine = line.split("[: ]+".toRegex()).map(String::toBigInteger) + val target = numbersInLine.first() + val numbers = numbersInLine.drop(1) + val possibleResults = findAllPossibleResult(setOf(numbers.first()), numbers.drop(1)) + if (possibleResults.contains(target)) { + sum += target +// println(line) + } +} +println(sum) + +fun findAllPossibleResult(partialResults: Set, numbers: List): Set { + if (numbers.isEmpty()) return partialResults + + val head = numbers.first() + val tail = numbers.drop(1) + val newResults = partialResults.fold(HashSet()) { r, p -> + r.add("$p$head".toBigInteger()) + r.add(p.plus(head)) + r.add(p.times(head)) + r + } + return findAllPossibleResult(newResults, tail) +} \ No newline at end of file