advent-of-code-2024/07-b.kts

32 lines
1,004 B
Text
Raw Normal View History

2024-12-09 11:38:41 +08:00
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<BigInteger>, numbers: List<BigInteger>): Set<BigInteger> {
if (numbers.isEmpty()) return partialResults
val head = numbers.first()
val tail = numbers.drop(1)
val newResults = partialResults.fold(HashSet<BigInteger>()) { r, p ->
r.add("$p$head".toBigInteger())
r.add(p.plus(head))
r.add(p.times(head))
r
}
return findAllPossibleResult(newResults, tail)
}