Created
December 9, 2020 18:42
-
-
Save ynonp/dfdfbdb30fcb98ed356f2c76c69dcba3 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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