@@ -2,29 +2,61 @@ package org.suggs.aoc2024
2
2
3
3
import org.slf4j.LoggerFactory
4
4
import org.suggs.aoc2024.Day05PrintQueue.extractMiddleNumberFrom
5
+ import org.suggs.aoc2024.Day05PrintQueue.isValidPrintJob
5
6
import kotlin.math.abs
6
7
7
8
object Day05PrintQueue {
8
9
9
- fun sumMiddleNumbersFromValidPrintQueues (data : List <String >) =
10
+ fun sumMiddleNumbersFromValidPrintQueues (data : List <String >): Int =
10
11
sumMiddleNumbersFromValidPrintQueuesFrom(readPrintJobsFrom(data.last().split(" \n " )))
11
12
.using(createRulesListFrom(data.first().split((" \n " ))))
12
13
13
- private fun sumMiddleNumbersFromValidPrintQueuesFrom (jobs : List <Set <Int >>) = QueueCounter (jobs)
14
+ private fun sumMiddleNumbersFromValidPrintQueuesFrom (jobs : List <List <Int >>): QueueCounter = QueueCounter (jobs)
14
15
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) }
16
24
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 ))
18
26
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() }
20
29
21
30
}
22
31
23
- class QueueCounter (private val jobs : List <Set <Int >>) {
32
+ class QueueCorrector (private val jobs : List <List <Int >>) {
24
33
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) }
26
35
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) }
29
61
30
62
}
0 commit comments