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

Day 06

2022/elixir/day06.livemd

Day 06

Mix.install([
  {:kino, "~> 0.7.0"}
])

Puzzle Input

area = Kino.Input.textarea("Puzzle Input")
puzzle_input = Kino.Input.read(area)
example_input = "mjqjpqmgbljsphdztnvjfqwrcgsmlb"

Common

defmodule Navigation do
  @start_of_packet 4
  @start_of_message 14

  def find_packet_marker(str) do
    start_of_data(str, @start_of_packet)
  end

  def find_message_marker(str) do
    start_of_data(str, @start_of_message)
  end

  defp start_of_data(str, len) do
    str
    |> String.codepoints()
    |> Stream.chunk_every(len, 1, :discard)
    |> Stream.with_index(len)
    |> Enum.find(fn {vs, _} -> marker?(vs, len) end)
    |> elem(1)
  end

  defp marker?(vs, len) do
    vs |> MapSet.new() |> MapSet.size() == len
  end
end
ExUnit.start(autorun: false)

defmodule NavigationTests do
  use ExUnit.Case, async: true

  test "start of packet" do
    assert Navigation.find_packet_marker("bvwbjplbgvbhsrlpgdmjqwftvncz") == 5
    assert Navigation.find_packet_marker("nppdvjthqldpwncqszvftbrmjlhg") == 6
    assert Navigation.find_packet_marker("nznrnfrfntjfmvfwmzdfjlvtqnbhcprsg") == 10
    assert Navigation.find_packet_marker("zcfzfwzzqfrljwzlrfnpqdbhtmscgvjw") == 11
  end

  test "start of message" do
    assert Navigation.find_message_marker("mjqjpqmgbljsphdztnvjfqwrcgsmlb") == 19
    assert Navigation.find_message_marker("bvwbjplbgvbhsrlpgdmjqwftvncz") == 23
    assert Navigation.find_message_marker("nppdvjthqldpwncqszvftbrmjlhg") == 23
    assert Navigation.find_message_marker("nznrnfrfntjfmvfwmzdfjlvtqnbhcprsg") == 29
    assert Navigation.find_message_marker("zcfzfwzzqfrljwzlrfnpqdbhtmscgvjw") == 26
  end
end

ExUnit.run()

Part One

Navigation.find_packet_marker(puzzle_input)

Part Two

Navigation.find_message_marker(puzzle_input)