Add solutions for 2022:10 "Cathode-Ray Tube"

This commit is contained in:
Anders Englöf Ytterström 2022-12-12 14:27:16 +01:00 committed by Anders Englöf Ytterström
parent e2da7dc954
commit 4420dfa522
2 changed files with 255 additions and 0 deletions

View file

@ -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

View file

@ -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