This commit is contained in:
Paul-Henri Froidmont 2025-12-05 17:58:54 +01:00
parent 86d6e44a71
commit 7a9322e593
Signed by: phfroidmont
GPG key ID: BE948AFD7E7873BE
2 changed files with 1221 additions and 0 deletions

1178
input/day05 Normal file

File diff suppressed because it is too large Load diff

43
src/day05.scala Normal file
View file

@ -0,0 +1,43 @@
package aoc
package day05
val dayNumber = "05"
@main def part1: Unit =
println(part1(loadInput(dayNumber)))
@main def part2: Unit =
println(part2(loadInput(dayNumber)))
def part1(input: String): String =
val Array(rangesInput, ingredientsInput) = input.split("\n\n")
val ranges =
rangesInput.split('\n').map { case s"$from-$to" => (from = from.toLong, to = to.toLong) }
ingredientsInput
.split('\n').map(_.toLong)
.count(i => ranges.exists(r => i >= r.from && i <= r.to)).toString
def part2(input: String): String =
case class Range(from: Long, to: Long):
def contains(i: Long): Boolean = i >= from && i <= to
def contains(other: Range): Boolean = contains(other.from) && contains(other.to)
def size = Math.max(0, (to - from) + 1)
def diff(other: Range): List[Range] =
if contains(other) then List(Range(from, other.from - 1), Range(other.to + 1, to))
else if other.contains(this) then List()
else if contains(other.from) then List(Range(from, other.from - 1))
else if contains(other.to) then List(Range(other.to + 1, to))
else List(this)
case class MultiRange(ranges: List[Range] = List.empty):
def size = ranges.map(_.size).sum
def add(range: Range): MultiRange =
val remainingRanges = ranges.foldLeft(List(range))((acc, r) => acc.flatMap(_.diff(r)))
MultiRange(remainingRanges ++ ranges)
input
.split("\n\n").head
.split('\n')
.map { case s"$from-$to" => Range(from.toLong, to.toLong) }
.foldLeft(MultiRange())(_.add(_)).size.toString