From 2a7678ecf8905bacb816b0bf38e1597b157e59c9 Mon Sep 17 00:00:00 2001 From: Simon Marquis Date: Wed, 6 Dec 2023 20:34:04 +0100 Subject: [PATCH] =?UTF-8?q?Day=206=20=E2=AD=90=E2=AD=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- src/main/kotlin/Day06.kt | 21 +++++++++++++ src/main/kotlin/Utils.kt | 5 +++ src/test/kotlin/Day06Test.kt | 49 +++++++++++++++++++++++++++++ src/test/resources/Day06-sample.txt | 2 ++ 5 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 src/main/kotlin/Day06.kt create mode 100644 src/test/kotlin/Day06Test.kt create mode 100644 src/test/resources/Day06-sample.txt diff --git a/README.md b/README.md index 4dc9c77..49b1ef2 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ | | | | | | | | | | | |-------------:|:-------------:|--------------:|:---------:|--------------:|:---------:|--------------:|:---------:|--------------:|:---------:| -| **[1][d01]** | **[⭐⭐][s01]** | **[6][d06]** | [☆☆][s06] | **[11][d11]** | [☆☆][s11] | **[16][d16]** | [☆☆][s16] | **[22][d22]** | [☆☆][s22] | +| **[1][d01]** | **[⭐⭐][s01]** | **[6][d06]** | [⭐⭐][s06] | **[11][d11]** | [☆☆][s11] | **[16][d16]** | [☆☆][s16] | **[22][d22]** | [☆☆][s22] | | **[2][d02]** | **[⭐⭐][s02]** | **[7][d07]** | [☆☆][s07] | **[12][d12]** | [☆☆][s12] | **[17][d17]** | [☆☆][s17] | **[23][d23]** | [☆☆][s23] | | **[3][d03]** | **[⭐⭐][s03]** | **[8][d08]** | [☆☆][s08] | **[13][d13]** | [☆☆][s13] | **[18][d18]** | [☆☆][s18] | **[24][d24]** | [☆☆][s24] | | **[4][d04]** | **[⭐⭐][s04]** | **[9][d09]** | [☆☆][s09] | **[14][d14]** | [☆☆][s14] | **[19][d19]** | [☆☆][s19] | **[25][d25]** | [☆☆][s25] | diff --git a/src/main/kotlin/Day06.kt b/src/main/kotlin/Day06.kt new file mode 100644 index 0000000..cbf4058 --- /dev/null +++ b/src/main/kotlin/Day06.kt @@ -0,0 +1,21 @@ +class Day06(private val input: List) { + + fun part1(): Long = input + .map { """\d+""".toRegex().findAll(it).map(MatchResult::value).map(String::toLong) } + .let { (times, distances) -> (times zip distances) } + .map { (time, distance) -> wins(time, distance) } + .product() + + fun part2(): Long = input + .map { it.filter(Char::isDigit).toLong() } + .let { (time, distance) -> wins(time, distance) } + + private fun wins(time: Long, distance: Long): Long { + var min = 0 + while (min * (time - min) <= distance) min++ + var max = time + while (max * (time - max) <= distance) max-- + return (max - min + 1) + } + +} diff --git a/src/main/kotlin/Utils.kt b/src/main/kotlin/Utils.kt index cc10446..ccc3feb 100644 --- a/src/main/kotlin/Utils.kt +++ b/src/main/kotlin/Utils.kt @@ -8,3 +8,8 @@ inline fun Sequence.foldIndexedInPlace( operation: R.(index: Int, T) -> Unit, ): R = foldIndexed(initial) { index: Int, acc: R, t: T -> acc.apply { operation(index, t) } } +@JvmName("intProduct") +fun Sequence.product(): Long = fold(1L, Long::times) + +@JvmName("longProduct") +fun Sequence.product(): Long = fold(1L, Long::times) diff --git a/src/test/kotlin/Day06Test.kt b/src/test/kotlin/Day06Test.kt new file mode 100644 index 0000000..16fb473 --- /dev/null +++ b/src/test/kotlin/Day06Test.kt @@ -0,0 +1,49 @@ +import Resources.readLines +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.Nested +import org.junit.jupiter.api.Test +import kotlin.test.assertEquals + +@DisplayName("Day 06") +class Day06Test { + + private val sampleInput = readLines("Day06-sample.txt") + private val actualInput = readLines("Day06.txt") + + @Nested + @DisplayName("Part 1") + inner class Part1 { + + @Test + fun `Matches example`() = assertEquals( + expected = 288, + actual = Day06(sampleInput).part1(), + ) + + @Test + fun `Actual answer`() = assertEquals( + expected = 449820, + actual = Day06(actualInput).part1(), + ) + + } + + @Nested + @DisplayName("Part 2") + inner class Part2 { + + @Test + fun `Matches example`() = assertEquals( + expected = 71503, + actual = Day06(sampleInput).part2(), + ) + + @Test + fun `Actual answer`() = assertEquals( + expected = 42250895, + actual = Day06(actualInput).part2(), + ) + + } + +} diff --git a/src/test/resources/Day06-sample.txt b/src/test/resources/Day06-sample.txt new file mode 100644 index 0000000..28f5ae9 --- /dev/null +++ b/src/test/resources/Day06-sample.txt @@ -0,0 +1,2 @@ +Time: 7 15 30 +Distance: 9 40 200