aoc2022/day6.livemd
2022-12-12 20:49:39 +01:00

1.4 KiB

AOC 2022 - Day 6

Mix.install([
  {:req, "~> 0.3.3"}
])

Puzzle description

Day 6: Tuning Trouble.

Input

defmodule Load do
  def input do
    aoc_session = System.fetch_env!("LB_AOC_SESSION")
    input_url = "https://adventofcode.com/2022/day/6/input"
    Req.get!(input_url, headers: [cookie: "session=#{aoc_session}"]).body
  end
end

Solution

defmodule Marker do
  def find(input, marker_length) do
    input
    |> String.graphemes()
    |> Enum.chunk_every(marker_length, 1)
    |> Enum.map(&MapSet.new/1)
    |> Enum.find_index(&(MapSet.size(&1) == marker_length))
    |> Kernel.+(marker_length)
  end
end
defmodule Part1 do
  @marker_length 4
  def run(input) do
    input
    |> Marker.find(@marker_length)
  end
end

defmodule Part2 do
  @marker_length 14
  def run(input) do
    input
    |> Marker.find(@marker_length)
  end
end

ExUnit.start(autorun: false)

defmodule Test do
  use ExUnit.Case, async: true
  @example_input ~s(mjqjpqmgbljsphdztnvjfqwrcgsmlb)
  @input Load.input()

  test "it loads the input" do
    assert String.length(@input) > 0
  end

  test "part 1 example" do
    assert Part1.run(@example_input) === 7
  end

  test "part 1" do
    assert Part1.run(@input) === 1093
  end

  test "part 2 example" do
    assert Part2.run(@example_input) === 19
  end

  test "part 2" do
    assert Part2.run(@input) === 3534
  end
end

ExUnit.run()