From f9ddc19940c5d29569cd6dd165e1f6cc67e7d159 Mon Sep 17 00:00:00 2001 From: Niklas Date: Sat, 7 Dec 2024 20:03:06 +0100 Subject: [PATCH] Add Day7 --- src/main/kotlin/Day07.kt | 44 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/main/kotlin/Day07.kt diff --git a/src/main/kotlin/Day07.kt b/src/main/kotlin/Day07.kt new file mode 100644 index 0000000..b2453ef --- /dev/null +++ b/src/main/kotlin/Day07.kt @@ -0,0 +1,44 @@ +import utils.AoCDay +import utils.splitAndMapToLong + +class Day07 : AoCDay() { + + val equations = input.map { + val parts = it.split(":") + parts[0].toLong() to parts[1].splitAndMapToLong() + } + + override fun part1(): Any { + return equations.filter { solve(it.second, it.first) }.sumOf { it.first } + } + + override fun part2(): Any { + return equations.filter { solve(it.second, it.first, true) }.sumOf { it.first } + } + + fun solve(numbers: List, target: Long, partB: Boolean = false): Boolean { + if (numbers.size == 1) { + return numbers.first() == target + } + if (numbers.first() > target) { + return false + } + val unused = numbers.drop(2) + val addition = mutableListOf(numbers[0] + numbers[1]) + val multiplication = mutableListOf(numbers[0] * numbers[1]) + addition.addAll(unused) + multiplication.addAll(unused) + val result = solve(addition, target, partB) || solve(multiplication, target, partB) + + if (!partB) { + return result + } + + val concat = mutableListOf("${numbers[0]}${numbers[1]}".toLong()) + return result || solve(concat + unused, target, true) + } +} + +fun main() { + Day07().execute() +}