Powered by AppSignal & Oban Pro

aoc 2019 - day 8

2019/elixir/day-8.livemd

aoc 2019 - day 8

Setup

Mix.install([{:kino, "~> 0.5.1"}])
input = Kino.Input.textarea("input")

Part 1

input = input |> Kino.Input.read()

for <<part::bytes-150 <- input>> do
  part
  |> String.to_charlist()
  |> Enum.frequencies()
end
|> Enum.min_by(& &1[?0])
|> then(&(&1[?1] * &1[?2]))

Part 2

data =
  for <<part::bytes-150 <- input>>, reduce: [] do
    [] ->
      String.to_charlist(part)

    acc ->
      part
      |> String.to_charlist()
      |> Enum.zip(acc)
      |> Enum.map(fn
        {b, ?2} -> b
        {_, f} -> f
      end)
  end
  |> Enum.chunk_every(25)

# |> Enum.join("\n")
# |> IO.puts()
defmodule Printer do
  def print(data) do
    contents =
      for line <- data do
        line
        |> List.insert_at(0, ?0)
        |> List.insert_at(-1, ?0)
        |> Enum.map(&color(type(&1), " "))

        # |> IO.iodata_to_binary()
      end
      |> Enum.intersperse("\n")

    IO.puts(contents)
  end

  defp color(color, string) do
    IO.ANSI.format([:black_background, color, string])
    |> IO.iodata_to_binary()
  end

  defp type(?0), do: :black
  defp type(_), do: [:white_background]
end

Printer.print(data)