class Y24D07(input: String) : Day { enum class Operation { Add { override fun operate(a: Long, b: Long) = a + b }, Multiply { override fun operate(a: Long, b: Long) = a * b }, Concatenate { override fun operate(a: Long, b: Long): Long = (a.toString() + b.toString()).toLong() }; abstract fun operate(a: Long, b: Long): Long } data class Equation(val test: Long, val values: List) { fun isValid(operations: List): Boolean { fun dfs(current: Long, index: Int): Boolean = when { current > test -> false index > values.lastIndex -> current == test else -> { operations.any { operation -> dfs(operation.operate(current, values[index]), index + 1) } } } return dfs(values[0], 1) } companion object { fun new(s: String): Equation { val (test, values) = s.split(':').map { it.getLongList() } return Equation(test[0], values) } } } private val equations = input.lines().map(Equation::new) override fun part1(): Long = equations .filter { it.isValid(listOf(Operation.Multiply, Operation.Add)) } .sumOf { it.test } override fun part2(): Long = equations .filter { it.isValid(listOf(Operation.Multiply, Operation.Concatenate, Operation.Add)) } .sumOf { it.test } }