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

Advent 2022 - Day 6

day6.livemd

Advent 2022 - Day 6

Mix.install([
  {:kino, github: "livebook-dev/kino"}
])
:ok

Setup

input = Kino.Input.textarea("Please paste your input file:")
packets =
  input
  |> Kino.Input.read()
  |> String.graphemes()
["m", "j", "q", "j", "p", "q", "m", "g", "b", "l", "j", "s", "p", "h", "d", "z", "t", "n", "v", "j",
 "f", "q", "w", "r", "c", "g", "s", "m", "l", "b"]

Utils

defmodule CommunicationDevice do
  def find_first_duplicate(packets, chunk_size) do
    index =
      packets
      |> Enum.chunk_every(chunk_size, 1, :discard)
      |> Enum.map(&MapSet.new(&1))
      |> Enum.with_index()
      |> Enum.find(fn {set, _index} -> MapSet.size(set) == chunk_size end)
      |> elem(1)

    index + chunk_size
  end
end
{:module, CommunicationDevice, <<70, 79, 82, 49, 0, 0, 8, ...>>, {:find_first_duplicate, 2}}

Part 1

CommunicationDevice.find_first_duplicate(packets, 4)
7

Part 2

CommunicationDevice.find_first_duplicate(packets, 14)
19