From cdf14fdadabe4f0ef8252a965e5b758d2eb9de71 Mon Sep 17 00:00:00 2001 From: Christian Date: Fri, 20 Dec 2024 16:38:26 +0100 Subject: [PATCH] Day 20 faster? --- aoc/src/dev/ctsk/aoc/days/Day20.scala | 30 +++++++++++---------------- 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/aoc/src/dev/ctsk/aoc/days/Day20.scala b/aoc/src/dev/ctsk/aoc/days/Day20.scala index 14890e9..7434764 100644 --- a/aoc/src/dev/ctsk/aoc/days/Day20.scala +++ b/aoc/src/dev/ctsk/aoc/days/Day20.scala @@ -5,12 +5,6 @@ import dev.ctsk.aoc.* import collection.parallel.CollectionConverters.* object Day20 extends Solver(20): - private def manhattanBall(dist: Int, center: Point): Array[(Point, Int)] = - (for - x <- -dist to dist - y <- -(dist - x.abs) to (dist - x.abs) - yield (Point(center.x + x, center.y + y), x.abs + y.abs)).toArray - override def run(input: os.ReadablePath): (Timings, Solution) = val grid = Grid(os.read.lines(input).map(_.toArray).toArray) val start = grid.findFirst(_ == 'S').get @@ -24,20 +18,20 @@ object Day20 extends Solver(20): .concat(Seq(start)) .toArray - val distance = trace.zipWithIndex.toMap - def cheats(radius: Int): Int = - trace.zipWithIndex.par - .map((from, fromDist) => { - (for - (to, dist) <- manhattanBall(radius, from) - toDist <- distance.get(to) - cheat = fromDist - toDist - if cheat >= 100 + dist - yield ()).length - }) - .sum + trace.indices.par + .map(a => + (a + 1 until trace.length) + .count(b => + val (from, fromDist) = (trace(a), trace.length - a) + val (to, toDist) = (trace(b), trace.length - b) + val dist = (from - to).manhattan + dist <= radius && (fromDist - toDist >= 100 + dist) + ) + ) + .sum + val p1 = timed { cheats(2) } val p2 = timed { cheats(20) }