From 4420dfa522838f7fc09f8a0b9307880a77731e1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Ytterstr=C3=B6m?= Date: Mon, 12 Dec 2022 14:27:16 +0100 Subject: [PATCH] Add solutions for 2022:10 "Cathode-Ray Tube" --- 2022-elixir/lib/solutions/day_10.ex | 84 ++++++++++ 2022-elixir/test/solutions/day_10_test.exs | 171 +++++++++++++++++++++ 2 files changed, 255 insertions(+) create mode 100644 2022-elixir/lib/solutions/day_10.ex create mode 100644 2022-elixir/test/solutions/day_10_test.exs diff --git a/2022-elixir/lib/solutions/day_10.ex b/2022-elixir/lib/solutions/day_10.ex new file mode 100644 index 0000000..3b9247d --- /dev/null +++ b/2022-elixir/lib/solutions/day_10.ex @@ -0,0 +1,84 @@ +defmodule Aoc.Solution.Day10 do + import Aoc.Utils + + @name "Day 10: Cathode-Ray Tube" + @behaviour Solution + + @impl Solution + def get_name, do: @name + + @impl Solution + def present(solution), do: "Sum of signal strengths is #{solution}" + + @impl Solution + def present_again(solution), do: "The 8 capital letters appearing on CRT:\n\n#{solution}" + + @impl Solution + def parse!(raw) do + raw |> split_lines() + end + + @impl Solution + def solve(program) do + {snapshots, _} = cycle(program) + Enum.sum(snapshots) + end + + @impl Solution + def solve_again(program) do + {_, pixels} = cycle(program) + + pixels + |> Enum.reverse() + |> Enum.chunk_every(40) + |> Enum.map(fn l -> + Enum.join(l, "") + end) + |> Enum.join("\n") + end + + def cycle(program), do: cycle(1, program, program) + + def cycle(x, instructions, program, snapshots \\ {[], []}, queue \\ [], ticks \\ 1) + + def cycle(_x, _instructions, _program, snapshots, _queue, 241) do + snapshots + end + + def cycle(x, [], program, snapshots, queue, ticks) do + cycle(x, program, program, snapshots, queue, ticks) + end + + def cycle(x, instructions, program, snapshots, [v | queue], ticks) do + cycle(x + v, instructions, program, log(snapshots, ticks, x), queue, ticks + 1) + end + + def cycle(x, ["noop" | instructions], program, snapshots, queue = [], ticks) do + cycle(x, instructions, program, log(snapshots, ticks, x), queue, ticks + 1) + end + + def cycle(x, ["addx " <> v | instructions], program, snapshots, queue = [], ticks) do + cycle( + x, + instructions, + program, + log(snapshots, ticks, x), + [String.to_integer(v) | queue], + ticks + 1 + ) + end + + def log({snapshots, pixels}, ticks, x) when ticks in [20, 60, 100, 140, 180, 220] do + {[ticks * x | snapshots], lit(pixels, ticks, x)} + end + + def log({snapshots, pixels}, ticks, x) do + {snapshots, lit(pixels, ticks, x)} + end + + def lit(pixels, pos, x) when rem(pos - 1, 40) in (x - 1)..(x + 1) do + ["#" | pixels] + end + + def lit(pixels, _pos, _x), do: ["." | pixels] +end diff --git a/2022-elixir/test/solutions/day_10_test.exs b/2022-elixir/test/solutions/day_10_test.exs new file mode 100644 index 0000000..22354bf --- /dev/null +++ b/2022-elixir/test/solutions/day_10_test.exs @@ -0,0 +1,171 @@ +defmodule Day10Test do + use ExUnit.Case + doctest Aoc.Solution.Day10 + import Aoc.Solution.Day10 + + @input ~s( + addx 15 + addx -11 + addx 6 + addx -3 + addx 5 + addx -1 + addx -8 + addx 13 + addx 4 + noop + addx -1 + addx 5 + addx -1 + addx 5 + addx -1 + addx 5 + addx -1 + addx 5 + addx -1 + addx -35 + addx 1 + addx 24 + addx -19 + addx 1 + addx 16 + addx -11 + noop + noop + addx 21 + addx -15 + noop + noop + addx -3 + addx 9 + addx 1 + addx -3 + addx 8 + addx 1 + addx 5 + noop + noop + noop + noop + noop + addx -36 + noop + addx 1 + addx 7 + noop + noop + noop + addx 2 + addx 6 + noop + noop + noop + noop + noop + addx 1 + noop + noop + addx 7 + addx 1 + noop + addx -13 + addx 13 + addx 7 + noop + addx 1 + addx -33 + noop + noop + noop + addx 2 + noop + noop + noop + addx 8 + noop + addx -1 + addx 2 + addx 1 + noop + addx 17 + addx -9 + addx 1 + addx 1 + addx -3 + addx 11 + noop + noop + addx 1 + noop + addx 1 + noop + noop + addx -13 + addx -19 + addx 1 + addx 3 + addx 26 + addx -30 + addx 12 + addx -1 + addx 3 + addx 1 + noop + noop + noop + addx -9 + addx 18 + addx 1 + addx 2 + noop + noop + addx 9 + noop + noop + noop + addx -1 + addx 2 + addx -37 + addx 1 + addx 3 + noop + addx 15 + addx -21 + addx 22 + addx -6 + addx 1 + noop + addx 2 + addx 1 + noop + addx -10 + noop + noop + addx 20 + addx 1 + addx 2 + addx 2 + addx -6 + addx -11 + noop + noop + noop + ) + + test "10: Cathode-Ray Tube, part 1" do + expected = 13140 + + result = @input |> parse!() |> solve() + + assert result == expected + end + + @tag :skip + test "10: Cathode-Ray Tube, part 2" do + expected = :something + + result = @input |> parse!() |> solve_again() + + assert result == expected + end +end