From cc8f6109ca607b8282c5f917ecfa830c5053e612 Mon Sep 17 00:00:00 2001 From: Benjamin Weber Date: Tue, 24 Sep 2019 20:57:09 +0200 Subject: [PATCH] first steps with elixir --- lib/day1.ex | 40 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/lib/day1.ex b/lib/day1.ex index 1122ecc..4cc923c 100644 --- a/lib/day1.ex +++ b/lib/day1.ex @@ -25,8 +25,27 @@ defmodule AocKata.Day1 do """ @spec resulting_frequency(Enumerable.t()) :: integer def resulting_frequency(frequency_changes) do - # TODO implement + # frequency_changes + # |> Enum.map(fn x -> + # x |> Integer.parse + # |> elem(0) end) + # |> Enum.sum + # frequency_changes + # |> Enum.reduce(0, fn x, acc -> (x |> Integer.parse |> elem(0)) + acc end) + + rf(frequency_changes, 0) end +defp rf([head|tail], acc) do + acc = head + |> Integer.parse + |> elem(0) + |> Kernel.+(acc) + rf(tail, acc) +end +defp rf([], acc), do: acc + + + @doc """ You notice that the device repeats the same frequency change list over and over. To calibrate the device, you need to find the first frequency it reaches twice. @@ -55,8 +74,21 @@ defmodule AocKata.Day1 do """ @spec resulting_frequency_fixed(Enumerable.t()) :: integer def resulting_frequency_fixed(frequency_changes) do - frequency_changes = Stream.repeatedly(fn -> frequency_changes end) |> Stream.flat_map(& &1) - - # TODO + # frequency_changes = Stream.repeatedly(fn -> frequency_changes end) |> Stream.flat_map(& &1) + (frequency_changes ++ frequency_changes ++ frequency_changes) + |> Enum.map(fn x -> + x |> Integer.parse + |> elem(0) end) + |> Enum.reduce_while([0], fn x, [head|_] = acc -> + if Enum.member? acc, (x + head) do + {:halt, (x + head)} + else + {:cont, [x + head|acc]} + end + end) + |> case do + [head|_] -> head + acc -> acc + end end end