Powered by AppSignal & Oban Pro

Day 16

day_16.livemd

Day 16

Setup

Mix.install([
  {:kino, "~> 0.4.1"}
])
input = Kino.Input.textarea("Please provide your input: ")
input =
  input
  |> Kino.Input.read()
  |> String.trim()
  |> :binary.decode_hex()

Part 1

<<version::3, type::3, rest::bits>> = input
defmodule AOC.DaySixteen do
  def solve(input) do
    packets(input)
  end

  def packets(bitstring) do
    packets(bitstring, [])
  end

  defp packets("", packets), do: packets |> Enum.reverse()

  defp packets(bitstring, packets) do
    {packet, rest} = packet(bitstring)
    packets(rest, [packet | packets])
  end

  defp packet(<<version::3, type::3, rest::bits>>) do
    packet = %{version: version, type: type}
    {packet, rest}
  end
end