44 lines
No EOL
910 B
Elixir
44 lines
No EOL
910 B
Elixir
defmodule Day01 do
|
|
defp find_recurring(data) do
|
|
Enum.reduce_while(data, {0, MapSet.new([0])}, fn term, {prev, known} ->
|
|
freq = prev + term
|
|
if MapSet.member?(known, freq) do
|
|
{:halt, freq}
|
|
else
|
|
{:cont, {freq, MapSet.put(known, freq)}}
|
|
end
|
|
end)
|
|
end
|
|
|
|
defp parse(data) do
|
|
String.split(data, "\n")
|
|
|> Enum.map(&String.trim/1)
|
|
|> Enum.map(&String.to_integer/1)
|
|
end
|
|
|
|
def solve(data) do
|
|
data
|
|
|> parse
|
|
|> Enum.sum
|
|
end
|
|
|
|
def solve_again(data) do
|
|
data
|
|
|> parse
|
|
|> Stream.cycle
|
|
|> find_recurring
|
|
end
|
|
|
|
def show do
|
|
data = File.read!("data/01.in")
|
|
:timer.tc(fn -> solve(data) end)
|
|
|> elem(0)
|
|
|> Kernel./(1_000_000)
|
|
|> IO.inspect
|
|
:timer.tc(fn -> solve_again(data) end)
|
|
|> elem(0)
|
|
|> Kernel./(1_000_000)
|
|
|> IO.inspect
|
|
end
|
|
end
|
|
Day01.show() |