Powered by AppSignal & Oban Pro

Untitled

Day%2010:%20Cathode-Ray%20Tube.livemd

Untitled

Section

input =
  "addx 15\naddx -11\naddx 6\naddx -3\naddx 5\naddx -1\naddx -8\naddx 13\naddx 4\nnoop\naddx -1\naddx 5\naddx -1\naddx 5\naddx -1\naddx 5\naddx -1\naddx 5\naddx -1\naddx -35\naddx 1\naddx 24\naddx -19\naddx 1\naddx 16\naddx -11\nnoop\nnoop\naddx 21\naddx -15\nnoop\nnoop\naddx -3\naddx 9\naddx 1\naddx -3\naddx 8\naddx 1\naddx 5\nnoop\nnoop\nnoop\nnoop\nnoop\naddx -36\nnoop\naddx 1\naddx 7\nnoop\nnoop\nnoop\naddx 2\naddx 6\nnoop\nnoop\nnoop\nnoop\nnoop\naddx 1\nnoop\nnoop\naddx 7\naddx 1\nnoop\naddx -13\naddx 13\naddx 7\nnoop\naddx 1\naddx -33\nnoop\nnoop\nnoop\naddx 2\nnoop\nnoop\nnoop\naddx 8\nnoop\naddx -1\naddx 2\naddx 1\nnoop\naddx 17\naddx -9\naddx 1\naddx 1\naddx -3\naddx 11\nnoop\nnoop\naddx 1\nnoop\naddx 1\nnoop\nnoop\naddx -13\naddx -19\naddx 1\naddx 3\naddx 26\naddx -30\naddx 12\naddx -1\naddx 3\naddx 1\nnoop\nnoop\nnoop\naddx -9\naddx 18\naddx 1\naddx 2\nnoop\nnoop\naddx 9\nnoop\nnoop\nnoop\naddx -1\naddx 2\naddx -37\naddx 1\naddx 3\nnoop\naddx 15\naddx -21\naddx 22\naddx -6\naddx 1\nnoop\naddx 2\naddx 1\nnoop\naddx -10\nnoop\nnoop\naddx 20\naddx 1\naddx 2\naddx 2\naddx -6\naddx -11\nnoop\nnoop\nnoop\n"

input =
  "addx 1\nnoop\naddx 4\nnoop\nnoop\nnoop\naddx 6\naddx -1\naddx 5\nnoop\nnoop\nnoop\naddx 5\naddx -14\nnoop\naddx 19\nnoop\naddx 1\naddx 4\naddx 1\nnoop\nnoop\naddx 2\naddx 5\naddx -27\naddx 20\naddx -30\naddx 2\naddx 5\naddx 2\naddx 4\naddx -3\naddx 2\naddx 5\naddx 2\naddx -9\naddx 1\naddx 11\nnoop\naddx -20\naddx 7\naddx 23\naddx 2\naddx 3\naddx -2\naddx -34\naddx -2\nnoop\naddx 3\nnoop\naddx 3\naddx 2\nnoop\naddx 3\naddx 2\naddx 5\naddx 2\naddx -9\naddx -7\naddx 21\nnoop\naddx 8\nnoop\naddx -1\naddx 3\naddx -2\naddx 5\naddx -37\nnoop\naddx 35\naddx -31\naddx 1\naddx 4\naddx -1\naddx 2\nnoop\naddx 3\naddx 1\naddx 5\naddx -2\naddx 7\naddx -2\naddx -2\naddx 10\nnoop\naddx 4\nnoop\nnoop\naddx -19\naddx 20\naddx -38\nnoop\nnoop\naddx 7\naddx 2\naddx 3\nnoop\naddx 4\naddx -3\naddx 2\naddx 2\nnoop\naddx 3\nnoop\nnoop\nnoop\naddx 5\nnoop\naddx 7\naddx -2\naddx 7\nnoop\nnoop\naddx -5\naddx 6\naddx -36\nnoop\naddx 1\naddx 2\naddx 5\naddx 2\naddx 3\naddx -2\naddx 2\naddx 5\naddx 2\naddx 1\nnoop\naddx 4\naddx -16\naddx 21\nnoop\nnoop\naddx 1\naddx -8\naddx 12\nnoop\nnoop\nnoop\nnoop\n"
defmodule D10 do
  def signal_strength(instructions, cycle) do
    instructions
    |> Enum.take(cycle - 1)
    |> Enum.sum()
    |> Kernel.+(1)
    |> Kernel.*(cycle)
  end

  def sprite_position(cycle, instructions) do
    IO.inspect(cycle, label: "cycle")

    instructions
    |> Enum.take(cycle)
    |> Enum.sum()
    |> Kernel.+(1)
    |> then(&[&1 - 1, &1, &1 + 1])
    |> IO.inspect(label: "position")
  end

  def display(cycle, instructions) do
    cycle
    |> Enum.map(&(&1 in sprite_position(&1, instructions)))
    |> Enum.map(&if(&1, do: "#", else: "."))
  end

  def transform_instruction(["addx", value]), do: [0, String.to_integer(value)]
  def transform_instruction(["noop"]), do: [0]
end
import D10
# Part 1
instructions =
  input
  |> String.split("\n", trim: true)
  |> Enum.map(&String.split(&1, " "))
  |> Enum.flat_map(&D10.transform_instruction/1)

Enum.to_list(20..220//40)
|> Enum.map(&D10.signal_strength(instructions, &1))
|> Enum.sum()
# Part 2
Enum.to_list(0..239)
|> Enum.map(fn x ->
  rem(x, 40) in sprite_position(x, instructions)
end)
|> Enum.map(&if(&1, do: "◼︎", else: " "))
|> Enum.chunk_every(40)
|> Enum.intersperse("\n")
|> Enum.join()
|> IO.puts()

# Enum.to_list(0..220)
# |> Enum.map(&D10.signal_strength(instructions, &1))
# |> Enum.sum()