From 5033bf5ce48e7278ba9877edb4b35e3243bb8fda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20R=C3=B8dland?= Date: Thu, 5 Dec 2024 12:39:30 +0100 Subject: [PATCH] 2024 Day 05 Part2 --- .../kotlin/no/rodland/advent_2024/Day05.kt | 46 +++++++++++++++---- .../no/rodland/advent_2024/Day05Test.kt | 6 +-- 2 files changed, 40 insertions(+), 12 deletions(-) diff --git a/src/main/kotlin/no/rodland/advent_2024/Day05.kt b/src/main/kotlin/no/rodland/advent_2024/Day05.kt index 9d2201d5..e7a4d23e 100644 --- a/src/main/kotlin/no/rodland/advent_2024/Day05.kt +++ b/src/main/kotlin/no/rodland/advent_2024/Day05.kt @@ -5,23 +5,49 @@ import no.rodland.advent.Day // template generated: 05/12/2024 // Fredrik Rødland 2024 -class Day05(val input: List) : Day>, List>>> { +class Day05(val input: List) : Day>, List>>> { private val parsed = input.parse() private val rules = parsed.first private val pages = parsed.second override fun partOne(): Int { - return pages - .filter { list -> - val pairs = list.pairs() - pairs.all { it in rules } - } - .sumOf { it.middle() } + return pages + .filter { it.valid() } + .sumOf { it.middle() } } - override fun partTwo(): Long { - return 2 + override fun partTwo(): Int { + return pages + .filterNot { it.valid() } + .map { it.reorder() } + .sumOf { it.middle() } + } + + private fun List.valid() = pairs().all { it in rules } + + private fun List.reorder(): List { + val breaking = pairs() + .filterNot { it in rules } + .groupBy({ it.first }, { it.second }) + + val fold = breaking.keys.fold(this) { acc, b -> + acc.move(b, breaking[b]!!) + } + return if (fold.valid()){ + // println("yeah. $this $fold $breaking") + fold + }else{ + // still not right - just run it again + // println("reordering. $this $fold $breaking") + fold.reorder() + } + } + + private fun List.move(element: Int, after: List): List { + val indexElement = indexOf(element) + val moveAfter = indexOfLast { it in after } + return subList(0, indexElement) + subList(indexElement + 1, moveAfter + 1) + element + subList(moveAfter + 1, size) } private fun List.middle(): Int = get(size / 2) @@ -49,3 +75,5 @@ class Day05(val input: List) : Day>, } + + diff --git a/src/test/kotlin/no/rodland/advent_2024/Day05Test.kt b/src/test/kotlin/no/rodland/advent_2024/Day05Test.kt index 56ce3e36..c5589d6b 100644 --- a/src/test/kotlin/no/rodland/advent_2024/Day05Test.kt +++ b/src/test/kotlin/no/rodland/advent_2024/Day05Test.kt @@ -16,9 +16,9 @@ internal class Day05Test { private val test05 = "2024/input_05_test.txt".readFile() private val resultTestOne = 143 - private val resultTestTwo = 2L + private val resultTestTwo = 123 private val resultOne = 5762 - private val resultTwo = 2L + private val resultTwo = 4130 val test = defaultTestSuiteParseOnInit( Day05(data05), @@ -30,7 +30,7 @@ internal class Day05Test { { Day05(data05) }, { Day05(test05) }, numTestPart1 = 10, - numTestPart2 = 10, + numTestPart2 = 1, ) @Nested