Skip to content

Commit 6e7c4ec

Browse files
committed
completed day 5 part 1
1 parent d1e2fdf commit 6e7c4ec

File tree

5 files changed

+1459
-22
lines changed

5 files changed

+1459
-22
lines changed

2024/src/main/kotlin/org/suggs/aoc2024/Day05.kt

Lines changed: 0 additions & 11 deletions
This file was deleted.
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package org.suggs.aoc2024
2+
3+
import org.slf4j.LoggerFactory
4+
import org.suggs.aoc2024.Day05PrintQueue.extractMiddleNumberFrom
5+
import kotlin.math.abs
6+
7+
object Day05PrintQueue {
8+
9+
fun sumMiddleNumbersFromValidPrintQueues(data: List<String>) =
10+
sumMiddleNumbersFromValidPrintQueuesFrom(readPrintJobsFrom(data.last().split("\n")))
11+
.using(createRulesListFrom(data.first().split(("\n"))))
12+
13+
private fun sumMiddleNumbersFromValidPrintQueuesFrom(jobs: List<Set<Int>>) = QueueCounter(jobs)
14+
15+
private fun createRulesListFrom(rules: List<String>) = rules.map { it.split("|").let { Pair(it[0].toInt(), it[1].toInt()) } }
16+
17+
private fun readPrintJobsFrom(jobs: List<String>) = jobs.map { it.split(",").map { it.toInt() }.toSet() }
18+
19+
internal fun extractMiddleNumberFrom(setOfPages: Set<Int>) = setOfPages.elementAt(abs(setOfPages.size / 2))
20+
21+
}
22+
23+
class QueueCounter(private val jobs: List<Set<Int>>) {
24+
25+
fun using(rules: List<Pair<Int, Int>>) = jobs.filter { isValidPrintJob(it, rules) }.sumOf { extractMiddleNumberFrom(it) }
26+
27+
private fun isValidPrintJob(job: Set<Int>, rules: List<Pair<Int, Int>>) =
28+
rules.filter { job.containsAll(listOf(it.first, it.second)) }.all { job.indexOf(it.first) < job.indexOf(it.second) }
29+
30+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package org.suggs.aoc2024
2+
3+
import io.kotest.matchers.shouldBe
4+
import org.junit.jupiter.api.Disabled
5+
import org.junit.jupiter.api.DisplayName
6+
import org.junit.jupiter.api.Test
7+
import org.suggs.adventofcode.Util.getTextBlocksFrom
8+
import org.suggs.aoc2024.Day05PrintQueue.extractMiddleNumberFrom
9+
import org.suggs.aoc2024.Day05PrintQueue.sumMiddleNumbersFromValidPrintQueues
10+
11+
@DisplayName("Day 05 Pringt Queue")
12+
class Day05PrintQueueTest {
13+
14+
@Test
15+
fun `sums middle numbers from valid print queues in small data`() {
16+
sumMiddleNumbersFromValidPrintQueues(smallData) shouldBe 143
17+
}
18+
19+
@Test
20+
@Disabled
21+
fun `sums middle numbers from valid print queues in large data`() {
22+
sumMiddleNumbersFromValidPrintQueues(largeData) shouldBe 123
23+
}
24+
25+
@Test
26+
fun `can get middle element in a set`(){
27+
extractMiddleNumberFrom(setOf(0,1,2,3,4)) shouldBe 2
28+
extractMiddleNumberFrom(setOf(0,1,2)) shouldBe 1
29+
}
30+
31+
private val largeData = getTextBlocksFrom("day05-input.txt")
32+
private val smallData = """47|53
33+
97|13
34+
97|61
35+
97|47
36+
75|29
37+
61|13
38+
75|53
39+
29|13
40+
97|29
41+
53|29
42+
61|53
43+
97|53
44+
61|29
45+
47|13
46+
75|47
47+
97|75
48+
47|61
49+
75|61
50+
47|29
51+
75|13
52+
53|13
53+
54+
75,47,61,53,29
55+
97,61,53,29,13
56+
75,29,13
57+
75,97,47,61,53
58+
61,13,29
59+
97,13,75,29,47""".split("\n\n")
60+
}

2024/src/test/kotlin/org/suggs/aoc2024/Day05Test.kt

Lines changed: 0 additions & 11 deletions
This file was deleted.

0 commit comments

Comments
 (0)