This commit is contained in:
Andrew Glaze
2024-12-07 14:06:08 -05:00
parent 72acbeb8a0
commit 2f399ce790
2 changed files with 106 additions and 0 deletions

View File

@@ -0,0 +1,65 @@
package day05
import kotlin.io.println
import kotlin.collections.listOf
class Day05 {
fun parse(input: String): Pair<HashMap<Int, List<Int>>, List<List<Int>>> {
val (ruleStr, updateStr) = input.split("\n\n").map { it.lines() }
var rules = HashMap<Int, List<Int>>()
ruleStr.map {
val split = it.split("|").map { it.toInt() }
val cur = rules[split[0]] ?: listOf()
rules.set(split[0], cur + split[1])
}
val updates = updateStr.map { it.split(",").map { it.toInt() } }
return Pair(rules, updates)
}
fun part1(input: String): Int {
val (rules, updates) = parse(input)
return updates.filter {update -> checkOrder(rules, update) }
.map {update -> update[update.count() / 2] }
.sum()
}
fun checkOrder(rules: HashMap<Int, List<Int>>, update: List<Int>): Boolean {
for (i in 0..<update.count()) {
if (rules[update[i]]?.map { update.subList(0, i).contains(it) }?.contains(true) ?: false) {
return false
}
}
return true
}
fun fixOrder(rules: HashMap<Int, List<Int>>, update: List<Int>): List<Int> {
var modUpdate = update.toMutableList()
for (i in 0..<update.count()) {
val curPage = modUpdate[i]
val curRule = rules[curPage]
if (curRule == null) { continue }
for (pre in 0..<i) {
if (curRule.contains(modUpdate[pre])) {
modUpdate[i] = modUpdate[pre]
modUpdate[pre] = curPage
break
}
}
}
// hate this but im lazy
if (!checkOrder(rules, modUpdate)) {
modUpdate = fixOrder(rules, modUpdate).toMutableList()
}
return modUpdate
}
fun part2(input: String): Int {
val (rules, updates) = parse(input)
return updates.filter {update -> !checkOrder(rules, update) }
.map { update -> fixOrder(rules, update) }
.map { update -> update[update.count() / 2] }
.sum()
}
}

View File

@@ -0,0 +1,41 @@
package day05
import kotlin.test.Test
import util.InputDownloader
class Day05Test {
val dayNum = 5
val day = Day05()
val input = InputDownloader().getInput(dayNum)
val example = InputDownloader().getExample(dayNum)
@Test fun part1Example() {
part1(example, 143)
}
@Test fun part1Solution() {
part1(input, 6041)
}
@Test fun part2Example() {
part2(example, 123)
}
@Test fun part2Solution() {
part2(input, 4884)
}
fun part1(input: String, expected: Int) {
val output = day.part1(input)
println("output: $output")
assert(output == expected)
}
fun part2(input: String, expected: Int) {
val output = day.part2(input)
println("output: $output")
assert(output == expected)
}
}