diff --git a/lib/day1.ex b/lib/day1.ex index 1122ecc..b129f8c 100644 --- a/lib/day1.ex +++ b/lib/day1.ex @@ -25,7 +25,10 @@ defmodule AocKata.Day1 do """ @spec resulting_frequency(Enumerable.t()) :: integer def resulting_frequency(frequency_changes) do - # TODO implement + Enum.reduce(frequency_changes, 0, fn + "-" <> num, acc -> acc - String.to_integer(num) + "+" <> num, acc -> acc + String.to_integer(num) + end) end @doc """ @@ -57,6 +60,19 @@ defmodule AocKata.Day1 do def resulting_frequency_fixed(frequency_changes) do frequency_changes = Stream.repeatedly(fn -> frequency_changes end) |> Stream.flat_map(& &1) - # TODO + Enum.reduce_while(frequency_changes, {0, [0]}, fn + change, {sum, visited} -> + sum = + case change do + "+" <> num -> sum + String.to_integer(num) + "-" <> num -> sum - String.to_integer(num) + end + + if sum in visited do + {:halt, sum} + else + {:cont, {sum, [sum | visited]}} + end + end) end end diff --git a/lib/day2.ex b/lib/day2.ex index aec5bd5..0939367 100644 --- a/lib/day2.ex +++ b/lib/day2.ex @@ -25,7 +25,9 @@ defmodule AocKata.Day2 do """ @spec checksum(Enumerable.t()) :: integer def checksum(box_ids) do - 12345 + two_letters = Enum.filter(box_ids, &has_same_letters(&1, 2)) |> Enum.count() + three_letters = Enum.filter(box_ids, &has_same_letters(&1, 3)) |> Enum.count() + two_letters * three_letters end @doc """ @@ -46,6 +48,14 @@ defmodule AocKata.Day2 do """ @spec common_letters(Enumerable.t()) :: String.t() def common_letters(box_ids) do - "abc" + end + + def has_same_letters(string, count) do + string = String.to_charlist(string) + + Enum.any?(?a..?z, fn letter -> + amount = Enum.filter(string, &(&1 == letter)) |> Enum.count() + amount == count + end) end end