Skip to content

Instantly share code, notes, and snippets.

@ynonp
Created December 9, 2020 18:42
Show Gist options
  • Save ynonp/dfdfbdb30fcb98ed356f2c76c69dcba3 to your computer and use it in GitHub Desktop.
Save ynonp/dfdfbdb30fcb98ed356f2c76c69dcba3 to your computer and use it in GitHub Desktop.
defmodule Day9 do
@preamble_length 25
def read_input do
File.read!("input/day9.txt")
|> String.split("\n", trim: true)
|> Enum.map(&String.to_integer/1)
end
def valid?(window, item) do
for i <- window, j <- window, i != j do
i + j == item
end
|> Enum.any?
end
def partial_sum_edges(sequence, target) do
first = Enum.at(sequence, 0)
Enum.reduce_while(sequence, { 0, first, 0 }, fn val, { total, smallest, largest } ->
cond do
total == target -> { :halt, { total, smallest, largest } }
total > target -> { :halt, { :notfound, 0, 0 } }
true -> { :cont, { total + val, min(smallest, val), max(largest, val) } }
end
end)
end
def find_partial_sum(data, target) do
case partial_sum_edges(data, target) do
{ :notfound, _, _ } -> find_partial_sum(Enum.drop(data, 1), target)
{ ^target, first, last } -> first + last
end
end
def find_first_invalid(window, [item | rest]) do
if valid?(window, item) do
find_first_invalid(Enum.drop(window, 1) ++ [item], rest)
else
item
end
end
def part1 do
[window, data] = [Enum.take(read_input(), @preamble_length), Enum.drop(read_input(), @preamble_length)]
find_first_invalid(window, data)
|> IO.inspect
end
def part2 do
[window, data] = [Enum.take(read_input(), @preamble_length), Enum.drop(read_input(), @preamble_length)]
invalid_number = find_first_invalid(window, data)
find_partial_sum(window ++ data, invalid_number)
|> IO.inspect
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment