diff --git a/input/day11 b/input/day11 new file mode 100644 index 0000000..952af29 --- /dev/null +++ b/input/day11 @@ -0,0 +1 @@ +8069 87014 98 809367 525 0 9494914 5 diff --git a/src/day11.scala b/src/day11.scala new file mode 100644 index 0000000..671247b --- /dev/null +++ b/src/day11.scala @@ -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))) + )