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)