Day 11
This commit is contained in:
parent
e6604dbb24
commit
065e0178ae
2 changed files with 48 additions and 0 deletions
1
input/day11
Normal file
1
input/day11
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
8069 87014 98 809367 525 0 9494914 5
|
||||||
47
src/day11.scala
Normal file
47
src/day11.scala
Normal file
|
|
@ -0,0 +1,47 @@
|
||||||
|
package aoc
|
||||||
|
package day11
|
||||||
|
|
||||||
|
import scala.collection.{mutable as m}
|
||||||
|
|
||||||
|
val dayNumber = "11"
|
||||||
|
|
||||||
|
@main def part1: Unit =
|
||||||
|
println(part1(loadInput(dayNumber)))
|
||||||
|
|
||||||
|
@main def part2: Unit =
|
||||||
|
println(part2(loadInput(dayNumber)))
|
||||||
|
|
||||||
|
def part1(input: String): String =
|
||||||
|
val stones = parseInput(input)
|
||||||
|
blink(stones, 25)
|
||||||
|
stones.values.sum.toString
|
||||||
|
|
||||||
|
def part2(input: String): String =
|
||||||
|
val stones = parseInput(input)
|
||||||
|
blink(stones, 75)
|
||||||
|
stones.values.sum.toString
|
||||||
|
|
||||||
|
def parseInput(input: String) =
|
||||||
|
input
|
||||||
|
.split(" ")
|
||||||
|
.map(_.toLong)
|
||||||
|
.groupBy(identity)
|
||||||
|
.view
|
||||||
|
.mapValues(_.length.toLong)
|
||||||
|
.to(m.Map)
|
||||||
|
|
||||||
|
def changeStone(n: Long): List[Long] =
|
||||||
|
n.toString match
|
||||||
|
case "0" => List(1)
|
||||||
|
case s if s.length % 2 == 0 =>
|
||||||
|
s.splitAt(s.length / 2).toList.map(_.toLong)
|
||||||
|
case s => List(n * 2024)
|
||||||
|
|
||||||
|
def blink(stones: m.Map[Long, Long], times: Int): Unit =
|
||||||
|
for (_ <- 1 to times) do
|
||||||
|
val changes = stones.toList.flatMap((number, count) =>
|
||||||
|
List((number, -count)) ++ changeStone(number).map((_, count))
|
||||||
|
)
|
||||||
|
changes.foreach((number, change) =>
|
||||||
|
stones.updateWith(number)(_.map(_ + change).orElse(Some(change)))
|
||||||
|
)
|
||||||
Loading…
Add table
Add a link
Reference in a new issue