Skip to content

Commit 93b211a

Browse files
committed
part 2 aludes me ... perhaos pick up another day
1 parent 6e7c4ec commit 93b211a

File tree

2 files changed

+56
-12
lines changed

2 files changed

+56
-12
lines changed

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

Lines changed: 41 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,61 @@ package org.suggs.aoc2024
22

33
import org.slf4j.LoggerFactory
44
import org.suggs.aoc2024.Day05PrintQueue.extractMiddleNumberFrom
5+
import org.suggs.aoc2024.Day05PrintQueue.isValidPrintJob
56
import kotlin.math.abs
67

78
object Day05PrintQueue {
89

9-
fun sumMiddleNumbersFromValidPrintQueues(data: List<String>) =
10+
fun sumMiddleNumbersFromValidPrintQueues(data: List<String>): Int =
1011
sumMiddleNumbersFromValidPrintQueuesFrom(readPrintJobsFrom(data.last().split("\n")))
1112
.using(createRulesListFrom(data.first().split(("\n"))))
1213

13-
private fun sumMiddleNumbersFromValidPrintQueuesFrom(jobs: List<Set<Int>>) = QueueCounter(jobs)
14+
private fun sumMiddleNumbersFromValidPrintQueuesFrom(jobs: List<List<Int>>): QueueCounter = QueueCounter(jobs)
1415

15-
private fun createRulesListFrom(rules: List<String>) = rules.map { it.split("|").let { Pair(it[0].toInt(), it[1].toInt()) } }
16+
fun correctIncorrectlyOrderedPrintJobsThenSumMedium(data: List<String>): Int =
17+
correctIncorrectlyOrderedPrintJobsThenSumMediumFrom(readPrintJobsFrom(data.last().split("\n")))
18+
.using(createRulesListFrom(data.first().split(("\n"))))
19+
20+
private fun correctIncorrectlyOrderedPrintJobsThenSumMediumFrom(jobs: List<List<Int>>): QueueCorrector = QueueCorrector(jobs)
21+
22+
internal fun isValidPrintJob(job: List<Int>, rules: List<Pair<Int, Int>>): Boolean =
23+
rules.filter { job.containsAll(listOf(it.first, it.second)) }.all { job.indexOf(it.first) < job.indexOf(it.second) }
1624

17-
private fun readPrintJobsFrom(jobs: List<String>) = jobs.map { it.split(",").map { it.toInt() }.toSet() }
25+
internal fun extractMiddleNumberFrom(setOfPages: List<Int>): Int = setOfPages.elementAt(abs(setOfPages.size / 2))
1826

19-
internal fun extractMiddleNumberFrom(setOfPages: Set<Int>) = setOfPages.elementAt(abs(setOfPages.size / 2))
27+
internal fun createRulesListFrom(rules: List<String>) = rules.map { it.split("|").let { Pair(it[0].toInt(), it[1].toInt()) } }
28+
internal fun readPrintJobsFrom(jobs: List<String>) = jobs.map { it.split(",").map { it.toInt() }.toList() }
2029

2130
}
2231

23-
class QueueCounter(private val jobs: List<Set<Int>>) {
32+
class QueueCorrector(private val jobs: List<List<Int>>) {
2433

25-
fun using(rules: List<Pair<Int, Int>>) = jobs.filter { isValidPrintJob(it, rules) }.sumOf { extractMiddleNumberFrom(it) }
34+
fun using(rules: List<Pair<Int, Int>>) = jobs.filterNot { isValidPrintJob(it, rules) }.map { fixBrokenPrintJob(it.toMutableList(), rules) }.sumOf { extractMiddleNumberFrom(it) }
2635

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) }
36+
fun fixBrokenPrintJob(job: MutableList<Int>, rules: List<Pair<Int, Int>>): List<Int> {
37+
val brokenRules = rules.filter { job.containsAll(listOf(it.first, it.second)) }.filterNot{job.indexOf(it.first) < job.indexOf(it.second)}
38+
brokenRules.reversed().forEach { rule ->
39+
job.removeElemValue(rule.first)
40+
job.insertElemAfter(rule.second, rule.first)
41+
if(isValidPrintJob(job, rules))
42+
return job
43+
}
44+
return job
45+
}
46+
47+
private fun MutableList<Int>.removeElemValue(value: Int){
48+
this.remove(elementAt(indexOf(value)))
49+
}
50+
51+
private fun MutableList<Int>.insertElemAfter(search: Int, value: Int){
52+
val location = indexOf(search)
53+
add(location, value)
54+
}
55+
56+
}
57+
58+
class QueueCounter(private val jobs: List<List<Int>>) {
59+
60+
fun using(rules: List<Pair<Int, Int>>) = jobs.filter { isValidPrintJob(it, rules) }.sumOf { extractMiddleNumberFrom(it) }
2961

3062
}

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

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import org.junit.jupiter.api.Disabled
55
import org.junit.jupiter.api.DisplayName
66
import org.junit.jupiter.api.Test
77
import org.suggs.adventofcode.Util.getTextBlocksFrom
8+
import org.suggs.aoc2024.Day05PrintQueue.correctIncorrectlyOrderedPrintJobsThenSumMedium
89
import org.suggs.aoc2024.Day05PrintQueue.extractMiddleNumberFrom
910
import org.suggs.aoc2024.Day05PrintQueue.sumMiddleNumbersFromValidPrintQueues
1011

@@ -23,9 +24,20 @@ class Day05PrintQueueTest {
2324
}
2425

2526
@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
27+
fun `can get middle element in a set`() {
28+
extractMiddleNumberFrom(listOf(0, 1, 2, 3, 4)) shouldBe 2
29+
extractMiddleNumberFrom(listOf(0, 1, 2)) shouldBe 1
30+
}
31+
32+
@Test
33+
fun `corrects incorrectly ordered print jobs from small data`() {
34+
correctIncorrectlyOrderedPrintJobsThenSumMedium(smallData) shouldBe 123
35+
}
36+
37+
@Test
38+
@Disabled
39+
fun `corrects incorrectly ordered print jobs from large data`() {
40+
correctIncorrectlyOrderedPrintJobsThenSumMedium(largeData) shouldBe 123
2941
}
3042

3143
private val largeData = getTextBlocksFrom("day05-input.txt")

0 commit comments

Comments
 (0)