This commit is contained in:
Christian
2024-12-05 07:42:03 +01:00
parent 7f58e71cf0
commit c3b107c7cd
4 changed files with 1410 additions and 1 deletions

View File

@@ -6,7 +6,8 @@ val solvers = Map[Int, Solver](
1 -> Day01,
2 -> Day02,
3 -> Day03,
4 -> Day04
4 -> Day04,
5 -> Day05
)
@main def main(day: String, input: String): Unit =

View File

@@ -0,0 +1,39 @@
package dev.ctsk.aoc.days
import dev.ctsk.aoc._
object Day05 extends Solver(5):
def pre(input: String): (Set[(Int, Int)], Vector[Vector[Int]]) =
val Array(rulesStr, updatesStr) =
io.Source.fromFile(input).mkString.split("\n\n")
val rules = rulesStr.linesIterator
.map(rule => {
val Array(a, b) = rule.split("""\|""")
(a.toInt, b.toInt)
})
.toSet
val updates =
updatesStr.linesIterator.map(_.split(",").map(_.toInt).toVector).toVector
(rules, updates)
def run(input: String): (Timings, Solution) =
val (pre_time, (rules, updates)) = timed { pre(input) }
def isOrdered(u: Vector[Int]): Boolean =
!u.combinations(2).exists { case Seq(a, b) =>
rules.contains((b, a))
}
def findMiddle(u: Vector[Int]): Int =
u.find(e =>
u.count(rules.contains(_, e)) <= u.length / 2
&& u.count(rules.contains(e, _)) <= u.length / 2
).get
val p1 = timed { updates.filter(isOrdered).map(u => u(u.length / 2)).sum }
val p2 = timed { updates.filterNot(isOrdered).map(findMiddle).sum }
(Timings(pre_time, p1._1, p2._1), Solution(Int.box(p1._2), Int.box(p2._2)))

2
data/05.ans Normal file
View File

@@ -0,0 +1,2 @@
4637
6370

1367
data/05.in Normal file

File diff suppressed because it is too large Load Diff