diff --git a/app/src/main/kotlin/day03/Day03.kt b/app/src/main/kotlin/day03/Day03.kt new file mode 100644 index 0000000..c073bdd --- /dev/null +++ b/app/src/main/kotlin/day03/Day03.kt @@ -0,0 +1,52 @@ + +package day03 + +import kotlin.io.println + +class Day03 { + fun parse(input: String): String { + throw NotImplementedError() + } + + fun part1(input: String): Int { + val regex = Regex("mul\\((\\d{1,3}),(\\d{1,3})\\)") + val muls = regex.findAll(input) + + val product = muls.map { match -> + match.groupValues.subList(1, match.groupValues.count()) + .map { it.toInt() } + .toList() + .reduce { acc, next -> acc * next } + } + .toList() + .sum() + + return product + } + + fun part2(input: String): Int { + val regex = Regex("(?:mul\\((\\d{1,3}),(\\d{1,3})\\))|(do(?:n't)?\\(\\))") + val muls = regex.findAll(input) + var enable = true + + val product = muls.map { match -> + var tmp = 0 + if (match.value == "do()") { + enable = true + } else if (match.value == "don't()") { + enable = false + } else if (enable) { + tmp = match.groupValues.subList(1, 3) + .map { it.toInt() } + .toList() + .reduce { acc, next -> acc * next } + } + tmp + } + .toList() + .sum() + + return product + + } +} diff --git a/app/src/test/kotlin/day03/Day03Test.kt b/app/src/test/kotlin/day03/Day03Test.kt new file mode 100644 index 0000000..5b37406 --- /dev/null +++ b/app/src/test/kotlin/day03/Day03Test.kt @@ -0,0 +1,42 @@ + +package day03 + +import kotlin.test.Test +import util.InputDownloader + +class Day03Test { + val dayNum = 3 + val day = Day03() + + val input = InputDownloader().getInput(dayNum) + val example = "xmul(2,4)%&mul[3,7]!@^do_not_mul(5,5)+mul(32,64]then(mul(11,8)mul(8,5))" + val example2 = "xmul(2,4)&mul[3,7]!^don't()_mul(5,5)+mul(32,64](mul(11,8)undo()?mul(8,5))" + + @Test fun part1Example() { + part1(example, 161) + } + + @Test fun part1Solution() { + part1(input, 153469856) + } + + @Test fun part2Example() { + part2(example2, 48) + } + + @Test fun part2Solution() { + part2(input, 77055967) + } + + fun part1(input: String, expected: Int) { + val output = day.part1(input) + println("output: $output") + assert(output == expected) + } + + fun part2(input: String, expected: Int) { + val output = day.part2(input) + println("output: $output") + assert(output == expected) + } +}