Add solutions for 2022:10 "Cathode-Ray Tube"
This commit is contained in:
parent
e2da7dc954
commit
4420dfa522
2 changed files with 255 additions and 0 deletions
84
2022-elixir/lib/solutions/day_10.ex
Normal file
84
2022-elixir/lib/solutions/day_10.ex
Normal 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
|
||||
171
2022-elixir/test/solutions/day_10_test.exs
Normal file
171
2022-elixir/test/solutions/day_10_test.exs
Normal 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
|
||||
Loading…
Add table
Reference in a new issue