From 566a9b76b85a920e6fcb7e15f1d8d5d7f46b69ea Mon Sep 17 00:00:00 2001 From: Jeremy Kaplan Date: Wed, 9 Dec 2020 21:51:34 -0800 Subject: [PATCH] Day 10 Part 1 --- 2020/day10/day10.ex | 48 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 2020/day10/day10.ex diff --git a/2020/day10/day10.ex b/2020/day10/day10.ex new file mode 100644 index 0000000..6f4a67e --- /dev/null +++ b/2020/day10/day10.ex @@ -0,0 +1,48 @@ +defmodule Day10 do + defp read_input do + Path.expand('input', Path.dirname(__ENV__.file)) + |> File.read!() + end + + defp parse_adapters(text) do + joltages = text |> String.trim() |> String.split("\n") |> Enum.map(&String.to_integer/1) + joltages ++ [3 + Enum.max(joltages)] + end + + defp super_power(adapters, stack = [top | _rest]) do + as = Enum.filter(adapters, fn next -> can_stack?(top, next) end) + + if Enum.empty?(as) do + stack + else + next = Enum.min(as) + remaining = Enum.reject(adapters, fn a -> a == next end) + super_power(remaining, [next | stack]) + end + end + + defp can_stack?(a1, a2) do + d = a2 - a1 + 1 <= d and d <= 3 + end + + defp pairs(enum) do + Enum.chunk_every(enum, 2, 1, :discard) + end + + def part1 do + adapters = read_input() |> parse_adapters() + + counts = + super_power(adapters, [0]) + |> pairs() + |> Enum.reduce(%{}, fn [a2, a1], counts -> + d = a2 - a1 + Map.put(counts, d, Map.get(counts, d, 0) + 1) + end) + + counts[3] * counts[1] + end +end + +Day10.part1() |> IO.inspect()