Powered by AppSignal & Oban Pro

AOC 2022 - Day 06

aoc2022/day06.livemd

AOC 2022 - Day 06

Mix.install([
  {:kino_aoc, "~> 0.1"}
])

AOC Helper

{:ok, puzzle_input} =
  KinoAOC.download_puzzle("2022", "6", System.fetch_env!("LB_AOC_SESSION"))

Part 1 & 2

Code

defmodule DaySix do
  def find_marker(data, marker_length) do
    Enum.reduce_while(1..String.length(data), :unused, fn index, _acc ->
      if marker?(data, index, marker_length) do
        {:halt, index}
      else
        {:cont, index}
      end
    end)
  end

  def marker?(data, index, marker_length) do
    data
    |> sample(index, marker_length)
    |> String.graphemes()
    |> Enum.uniq()
    |> Enum.count()
    |> Kernel.==(marker_length)
  end

  def sample(data, index, length), do: String.slice(data, max(0, index - length)..(index - 1))

  def solve(input, length) do
    IO.puts("--- Part One ---")
    IO.puts("Result: #{run(input, length)}")
  end

  def run(input, length) do
    input
    |> String.trim()
    |> find_marker(length)
  end
end

Test

ExUnit.start(autorun: false)

defmodule DaySixTest do
  use ExUnit.Case, async: true
  import DaySix

  @input "mjqjpqmgbljsphdztnvjfqwrcgsmlb"
  @expected 7

  test "part one" do
    actual = run(@input, 4)
    assert actual == @expected
  end
end

ExUnit.run()

Solution - Part 1

DaySix.solve(puzzle_input, 4)

Solution - Part 2

DaySix.solve(puzzle_input, 14)