Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

Day 10

2022/day10.livemd

Day 10

input = """
addx 1
noop
noop
noop
addx 5
addx 5
noop
noop
addx 9
addx -5
addx 1
addx 4
noop
noop
noop
addx 6
addx -1
noop
addx 5
addx -2
addx 7
noop
addx 3
addx -2
addx -38
noop
noop
addx 32
addx -22
noop
addx 2
addx 3
noop
addx 2
addx -2
addx 7
addx -2
noop
addx 3
addx 2
addx 5
addx 2
addx -5
addx 10
noop
addx 3
noop
addx -38
addx 1
addx 27
noop
addx -20
noop
addx 2
addx 27
noop
addx -22
noop
noop
noop
noop
addx 3
addx 5
addx 2
addx -11
addx 16
addx -2
addx -17
addx 24
noop
noop
addx 1
addx -38
addx 15
addx 10
addx -15
noop
addx 2
addx 26
noop
addx -21
addx 19
addx -33
addx 19
noop
addx -6
addx 9
addx 3
addx 4
addx -21
addx 4
addx 20
noop
addx 3
addx -38
addx 28
addx -21
addx 9
addx -8
addx 2
addx 5
addx 2
addx -9
addx 14
addx -2
addx -5
addx 12
addx 3
addx -2
addx 2
addx 7
noop
noop
addx -27
addx 28
addx -36
noop
addx 1
addx 5
addx -1
noop
addx 6
addx -1
addx 5
addx 5
noop
noop
addx -2
addx 20
addx -10
addx -3
addx 1
addx 3
addx 2
addx 4
addx 3
noop
addx -30
noop
"""

Part 1

program =
  input
  |> String.split("\n", trim: true)
  |> Enum.map(fn
    "addx " <> value -> {:addx, String.to_integer(value)}
    "noop" -> :noop
  end)

interesting_cycles =
  0..5
  |> Enum.map(&amp;(&amp;1 * 40 + 20))

program_run =
  Enum.reduce(program, [{1, 1}], fn instruction, [{cycle, x_reg} | _] = acc ->
    acc = [{cycle + 1, x_reg} | acc]

    case instruction do
      :noop ->
        acc

      {:addx, value} ->
        [{cycle + 2, x_reg + value} | acc]
    end
  end)

program_run
|> Enum.filter(fn {cycle, _value} -> cycle in interesting_cycles end)
|> Enum.map(fn {cycle, value} -> cycle * value end)
|> Enum.sum()

Part 2

program_run
|> Enum.reverse()
|> Enum.map(fn {cycle, x_position} ->
  if rem(cycle - 1, 40) in (x_position - 1)..(x_position + 1) do
    "#"
  else
    "."
  end
end)
|> Enum.chunk_every(40)
|> Enum.map(&amp;Enum.join/1)
|> Enum.join("\n")
|> IO.puts()