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

AoC 2022 - day 10

tradfursten-elixir/day_10.livemd

AoC 2022 - day 10

Mix.install([:kino])

Section

input = Kino.Input.textarea("input")
defmodule Day01 do
  def solve1(input) do
    l =
      input
      |> String.split("\n", trim: true)
      |> Enum.map(&parse/1)
      |> process(1, 1, [1])
      |> Enum.reverse()
      |> Enum.with_index()
      |> Enum.drop(19)
      |> Enum.take_every(40)
      # |> IO.inspect
      |> Enum.map(fn {a, i} -> a * (i + 1) end)
      # |> IO.inspect
      |> Enum.sum()
  end

  def solve2(input) do
    input
    |> String.split("\n", trim: true)
    |> Enum.map(&parse/1)
    |> process(1, 1, [1])
    |> Enum.reverse()
    |> Enum.with_index()
    |> Enum.map(fn {x, i} ->
      i = rem(i, 40)

      case x in (i - 1)..(i + 1) do
        true -> "#"
        false -> "."
      end
    end)
    |> Enum.chunk_every(40)
    |> Enum.map(&Enum.join(&1, ""))
    |> Enum.join("\n")
  end

  defp parse("noop"), do: {:noop}
  defp parse("addx " <> rest), do: {:addx, String.to_integer(rest)}

  defp process([], _x, _cycle, acc), do: acc

  defp process([{:noop} | tail], x, cycle, acc) do
    # IO.puts(":noop, #{cycle + 1} #{x}")
    process(tail, x, cycle + 1, [x | acc])
  end

  defp process([{:addx, n} | tail], x, cycle, acc) do
    # IO.puts(":addx, #{n} #{cycle + 1} #{x}")
    # IO.puts(":addx, #{n} #{cycle + 2} #{x + n}")
    process(tail, x + n, cycle + 2, [x + n | [x | acc]])
  end
end
Kino.Input.read(input) |> Day01.solve1()
Kino.Input.read(input) |> Day01.solve2() |> IO.puts()