Add refactored Day 10 Part 2 for clarity.
This commit is contained in:
parent
dba1986b34
commit
80c393e6ba
2 changed files with 44 additions and 0 deletions
|
@ -52,6 +52,12 @@ than that, because we don't need to keep the connections around, just the weight
|
||||||
|
|
||||||
Finally, the weight of the max joltage adapter is the answer.
|
Finally, the weight of the max joltage adapter is the answer.
|
||||||
|
|
||||||
|
** Update **
|
||||||
|
|
||||||
|
I added day10part2-refactored.exs, which contains a commented and arguably easier to understand
|
||||||
|
version that uses Enum.reduce instead of so much recursion. However, in benchmarks it was
|
||||||
|
negligibly (~1 microsecond) slower, so I decided to leave the original version in place.
|
||||||
|
|
||||||
+------------------+
|
+------------------+
|
||||||
| Overall Thoughts |
|
| Overall Thoughts |
|
||||||
+------------------+
|
+------------------+
|
||||||
|
|
38
day10/day10part2-refactored.exs
Normal file
38
day10/day10part2-refactored.exs
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
defmodule Day10Part2 do
|
||||||
|
def run do
|
||||||
|
File.read!("input")
|
||||||
|
|> String.split("\n", trim: true)
|
||||||
|
|> Enum.map(&String.to_integer/1)
|
||||||
|
|> count_arrangements()
|
||||||
|
|> IO.puts()
|
||||||
|
end
|
||||||
|
|
||||||
|
# Entry point. Start with one arrangement: the outlet.
|
||||||
|
def count_arrangements(list), do: count_arrangements(%{0 => 1}, [0 | Enum.sort(list)])
|
||||||
|
|
||||||
|
# Termination point. We've checked all the adapters. The number of arrangments
|
||||||
|
# to the last adapter is the answer.
|
||||||
|
def count_arrangements(arrangements, [last]), do: arrangements[last]
|
||||||
|
|
||||||
|
# Check each adapter in turn by comparing it to the next three adapters.
|
||||||
|
def count_arrangements(arrangements, [current | rest]) do
|
||||||
|
count_for_adapter(current, Enum.take(rest, 3), arrangements)
|
||||||
|
|> count_arrangements(rest)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Compare the next three adapters to the current adapter.
|
||||||
|
# For each checked adapter, if the joltage difference is 3 or less, we can connect them,
|
||||||
|
# so add the number of arrangements up to the current adapter to that adapter.
|
||||||
|
def count_for_adapter(current, next_three, arrangements) do
|
||||||
|
Enum.reduce(next_three, arrangements, fn adapter, arrangements ->
|
||||||
|
if adapter - current <= 3 do
|
||||||
|
current_count = arrangements[current]
|
||||||
|
Map.update(arrangements, adapter, current_count, &(&1 + current_count))
|
||||||
|
else
|
||||||
|
arrangements
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
Day10Part2.run()
|
Loading…
Reference in a new issue