diff --git a/lib/day15.ex b/lib/day15.ex new file mode 100644 index 0000000..dd226db --- /dev/null +++ b/lib/day15.ex @@ -0,0 +1,32 @@ +defmodule Aoc2023.Day15 do + use Aoc2023 + + def parse(input) do + input |> String.split(",") + end + + defp hash(str) do + for <>, reduce: 0 do + acc -> Bitwise.band((acc + char) * 17, 255) + end + end + + def part1(input) do + input |> Enum.map(&hash/1) |> Enum.sum + end + + def part2(input) do + for instr <- input, reduce: 0..255 |> Enum.map(&{&1, []}) |> Enum.into(%{}) do + boxes -> + [_, label, op, lens] = Regex.run(~r/([a-z]+)([-=])(\d*)/, instr) + box = hash(label) + label = String.to_atom(label) + case op do + "=" -> boxes |> Map.update!(box, &Keyword.update(&1, label, String.to_integer(lens), fn _ -> String.to_integer(lens) end)) + "-" -> boxes |> Map.update!(box, &Keyword.delete(&1, label)) + end + end + |> Enum.flat_map(fn {box, lenses} -> lenses |> Enum.with_index(1) |> Enum.map(fn {{_, focus}, i} -> focus * (box + 1) * i end) end) + |> Enum.sum + end +end diff --git a/lib/mix_tasks.ex b/lib/mix_tasks.ex index 0e781f3..e0ab6f2 100644 --- a/lib/mix_tasks.ex +++ b/lib/mix_tasks.ex @@ -16,6 +16,7 @@ defmodule Mix.Tasks.Aoc do defp module(12), do: Aoc2023.Day12 defp module(13), do: Aoc2023.Day13 defp module(14), do: Aoc2023.Day14 + defp module(15), do: Aoc2023.Day15 # [MODULE INSERTION POINT] defp base_dir(), do: System.get_env("AOC_BASE") @@ -252,4 +253,4 @@ defmodule Mix.Tasks.Aoc do {:noreply, state} end end -end +end \ No newline at end of file diff --git a/tests/day15/1 b/tests/day15/1 new file mode 100644 index 0000000..4f58f74 --- /dev/null +++ b/tests/day15/1 @@ -0,0 +1 @@ +rn=1,cm-,qp=3,cm=2,qp-,pc=4,ot=9,ab=5,pc-,pc=6,ot=7 diff --git a/tests/day15/1.1 b/tests/day15/1.1 new file mode 100644 index 0000000..b60143b --- /dev/null +++ b/tests/day15/1.1 @@ -0,0 +1 @@ +1320 \ No newline at end of file diff --git a/tests/day15/1.2 b/tests/day15/1.2 new file mode 100644 index 0000000..aca544d --- /dev/null +++ b/tests/day15/1.2 @@ -0,0 +1 @@ +145 \ No newline at end of file