From c3919a1e573c6fa23c7b589c6aa47f67679db0c3 Mon Sep 17 00:00:00 2001 From: Paul-Henri Froidmont Date: Sat, 10 Dec 2022 07:15:26 +0100 Subject: [PATCH] Day 10 --- aoc/resources/day10Input.txt | 143 +++++++++++++++++++++++++++++++++++ aoc/src/Day10.scala | 49 ++++++++++++ 2 files changed, 192 insertions(+) create mode 100644 aoc/resources/day10Input.txt create mode 100644 aoc/src/Day10.scala diff --git a/aoc/resources/day10Input.txt b/aoc/resources/day10Input.txt new file mode 100644 index 0000000..c2c1cc1 --- /dev/null +++ b/aoc/resources/day10Input.txt @@ -0,0 +1,143 @@ +addx 2 +addx 3 +noop +noop +addx 1 +addx 5 +addx -1 +addx 5 +addx 1 +noop +noop +addx 4 +noop +noop +addx 5 +addx -5 +addx 6 +addx 3 +addx 1 +addx 5 +addx 1 +noop +addx -38 +addx 41 +addx -22 +addx -14 +addx 7 +noop +noop +addx 3 +addx -2 +addx 2 +noop +addx 17 +addx -12 +addx 5 +addx 2 +addx -16 +addx 17 +addx 2 +addx 5 +addx 2 +addx -30 +noop +addx -6 +addx 1 +noop +addx 5 +noop +noop +noop +addx 5 +addx -12 +addx 17 +noop +noop +noop +noop +addx 5 +addx 10 +addx -9 +addx 2 +addx 5 +addx 2 +addx -5 +addx 6 +addx 4 +noop +noop +addx -37 +noop +noop +addx 17 +addx -12 +addx 30 +addx -23 +addx 2 +noop +addx 3 +addx -17 +addx 22 +noop +noop +noop +addx 5 +noop +addx -10 +addx 11 +addx 4 +noop +addx 5 +addx -2 +noop +addx -6 +addx -29 +addx 37 +addx -30 +addx 27 +addx -2 +addx -22 +noop +addx 3 +addx 2 +noop +addx 7 +addx -2 +addx 2 +addx 5 +addx -5 +addx 6 +addx 2 +addx 2 +addx 5 +addx -25 +noop +addx -10 +noop +addx 1 +noop +addx 2 +noop +noop +noop +noop +addx 7 +addx 1 +addx 4 +addx 1 +noop +addx 2 +noop +addx 3 +addx 5 +addx -1 +noop +addx 3 +addx 5 +addx 2 +addx 1 +noop +noop +noop +noop \ No newline at end of file diff --git a/aoc/src/Day10.scala b/aoc/src/Day10.scala new file mode 100644 index 0000000..315fb72 --- /dev/null +++ b/aoc/src/Day10.scala @@ -0,0 +1,49 @@ +import scala.io.Source + +object Day10 extends App: + + val input = Source + .fromURL(getClass.getResource("day10Input.txt")) + .mkString + .split('\n') + .toList + .map(_.split(" ")).map { + case Array(inst, value) => (inst, value.toInt) + case Array(inst) => (inst, 0) + } + .flatMap { + case inst @ ("noop", _) => List(inst) + case inst @ ("addx", _) => List(("noop", 0), inst) + } + + val execution = input.scanLeft((1, 1)) { + case ((register, cycle), ("noop", _)) => (register, cycle + 1) + case ((register, cycle), ("addx", value)) => (register + value, cycle + 1) + case ((register, cycle), _) => (register, cycle + 1) + } + + val interestingSignals = + (20 to execution.last._2).filter(cycle => cycle == 20 || (cycle + 20) % 40 == 0) + + val part1 = execution + .filter(state => interestingSignals.contains(state._2)) + .map(_._1) + .zip(interestingSignals) + .map(_ * _) + .sum + println(s"Part 1: $part1") + + def renderRow(rowExecution: List[(Int, Int)]): String = + rowExecution.foldLeft("") { case (line, (register, cycle)) => + val spritePosition = register - 1 to register + 1 + if spritePosition.contains((cycle - 1) % 40) then line + "#" + else line + "." + } + + val part2 = execution + .grouped(40) + .map(renderRow) + .mkString("\n") + println(s"Part 2:") + println(part2) +end Day10