advent-of-code/2018-elixir/lib/day01.ex
2021-11-01 16:45:03 +01:00

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()