Day 05
This commit is contained in:
parent
0e0dc984dd
commit
16873b07c8
2 changed files with 1436 additions and 0 deletions
59
src/day05.scala
Normal file
59
src/day05.scala
Normal 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
|
||||
Loading…
Add table
Add a link
Reference in a new issue