diff --git a/README.org b/README.org index 2a9d72e..71d401c 100644 --- a/README.org +++ b/README.org @@ -13,3 +13,7 @@ Day 3: [[https://livebook.dev/run?url=https%3A%2F%2Fgit.datarift.nl%2Ferwin%2Fao Day 4: [[https://livebook.dev/run?url=https%3A%2F%2Fgit.datarift.nl%2Ferwin%2Faoc2022%2Fraw%2Fbranch%2Fmain%2Fday4.livemd][Run in Livebook]] Day 5: [[https://livebook.dev/run?url=https%3A%2F%2Fgit.datarift.nl%2Ferwin%2Faoc2022%2Fraw%2Fbranch%2Fmain%2Fday5.livemd][Run in Livebook]] + +Day 6: [[https://livebook.dev/run?url=https%3A%2F%2Fgit.datarift.nl%2Ferwin%2Faoc2022%2Fraw%2Fbranch%2Fmain%2Fday6.livemd][Run in Livebook]] + + diff --git a/day6.livemd b/day6.livemd new file mode 100644 index 0000000..0b77080 --- /dev/null +++ b/day6.livemd @@ -0,0 +1,86 @@ +# AOC 2022 - Day 6 + +```elixir +Mix.install([ + {:req, "~> 0.3.3"} +]) +``` + +## Puzzle description + +[Day 6: Tuning Trouble](https://adventofcode.com/2022/day/6). + +## Input + +```elixir +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 + +```elixir +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 +``` + +```elixir +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() +```