This commit is contained in:
Paul-Henri Froidmont 2024-12-05 16:02:41 +01:00
parent 0e0dc984dd
commit 16873b07c8
Signed by: phfroidmont
GPG key ID: BE948AFD7E7873BE
2 changed files with 1436 additions and 0 deletions

59
src/day05.scala Normal file
View file

@ -0,0 +1,59 @@
package aoc
package day05
import scala.collection.mutable
val dayNumber = "05"
@main def part1: Unit =
println(part1(loadInput(dayNumber)))
@main def part2: Unit =
println(part2(loadInput(dayNumber)))
type Ordering = Map[Int, List[Int]]
def part1(input: String): String =
val (ordering, pages) = parseInput(input)
pages
.filter(ps => (ps == sort(ps, ordering)))
.map(ps => ps(ps.length / 2))
.sum
.toString
def part2(input: String): String =
val (ordering, pages) = parseInput(input)
pages
.map(ps => (ps, sort(ps, ordering)))
.collect { case (ps, sorted) if ps != sorted => sorted }
.map(ps => ps(ps.length / 2))
.sum
.toString
def parseInput(input: String): (Ordering, List[List[Int]]) =
val Array(orderingInput, pagesInput) = input.split("\n\n")
val ordering = orderingInput
.split("\n")
.map { case s"$a|$b" => (a.toInt, b.toInt) }
.toList
.groupMap(_._1)(_._2)
val pages = pagesInput
.split("\n")
.toList
.map(_.split(",").map(_.toInt).toList)
(ordering, pages)
def sort(pages: List[Int], ordering: Ordering): List[Int] =
val sorted = new mutable.ListBuffer[Int]
for p <- pages do
val placeAtIndex = ordering
.getOrElse(p, Nil)
.map(n => sorted.indexOf(n))
.filterNot(_ == -1)
.sorted
.headOption
placeAtIndex match
case Some(-1) => sorted.append(p)
case Some(insertIdx) => sorted.insert(insertIdx, p)
case None => sorted.append(p)
sorted.toList