From 87b67449b2393db0fc7599d6650ea8e85f10f987 Mon Sep 17 00:00:00 2001 From: Christian Date: Wed, 11 Dec 2024 07:56:37 +0100 Subject: [PATCH] Day 11 --- aoc/src/dev/ctsk/aoc/Main.scala | 3 +- aoc/src/dev/ctsk/aoc/days/Day11.scala | 51 +++++++++++++++++++++++++++ data/11.ans | 2 ++ data/11.in | 1 + 4 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 aoc/src/dev/ctsk/aoc/days/Day11.scala create mode 100644 data/11.ans create mode 100644 data/11.in diff --git a/aoc/src/dev/ctsk/aoc/Main.scala b/aoc/src/dev/ctsk/aoc/Main.scala index 5243a6b..54b4641 100644 --- a/aoc/src/dev/ctsk/aoc/Main.scala +++ b/aoc/src/dev/ctsk/aoc/Main.scala @@ -12,7 +12,8 @@ val solvers = Map[Int, Solver]( 7 -> Day07, 8 -> Day08, 9 -> Day09, - 10 -> Day10 + 10 -> Day10, + 11 -> Day11 ) def runSolver(solver: Solver, input: os.Path): Unit = diff --git a/aoc/src/dev/ctsk/aoc/days/Day11.scala b/aoc/src/dev/ctsk/aoc/days/Day11.scala new file mode 100644 index 0000000..04e52f1 --- /dev/null +++ b/aoc/src/dev/ctsk/aoc/days/Day11.scala @@ -0,0 +1,51 @@ +package dev.ctsk.aoc.days + +import dev.ctsk.aoc._ +import scala.collection.mutable + +object Day11 extends Solver(11): + // upper and lower halves of number + def halves(n: Long): Option[(Long, Long)] = + val numDigits = (Math.log10(n) + 1).toLong + numDigits % 2 match + case 1 => None + case 0 => { + Some( + ( + n % Math.pow(10, numDigits / 2).toLong, + n / Math.pow(10, numDigits / 2).toLong + ) + ) + } + + def counter_compute(stones: Array[Long], depth: Long): Long = + var acc: mutable.Map[Long, Long] = + mutable.Map.from(stones.map((_, 1L))) + + for (_ <- 0L until depth) { + val next = mutable.Map.empty[Long, Long].withDefaultValue(0L) + for ((stone, count) <- acc) { + if stone == 0 then next(1) += count + else + halves(stone.toLong) match + case Some((a, b)) => + next(a) += count + next(b) += count + case None => + next(stone * 2024) += count + } + acc = next + } + + acc.values.sum + + def run(input: os.ReadablePath): (Timings, Solution) = + val in = longs(os.read.lines(input).head).toArray + + val p1 = timed { counter_compute(in, 25) } + val p2 = timed { counter_compute(in, 75) } + + ( + Timings(0, p1._1, p2._1), + Solution(Long.box(p1._2), Long.box(p2._2)) + ) diff --git a/data/11.ans b/data/11.ans new file mode 100644 index 0000000..657f3c0 --- /dev/null +++ b/data/11.ans @@ -0,0 +1,2 @@ +189167 +225253278506288 diff --git a/data/11.in b/data/11.in new file mode 100644 index 0000000..0da4680 --- /dev/null +++ b/data/11.in @@ -0,0 +1 @@ +28 4 3179 96938 0 6617406 490 816207 \ No newline at end of file