From 52f3f8c5c8fcab065b4e580b6094ad3f5a889975 Mon Sep 17 00:00:00 2001 From: Moritz Schmale Date: Tue, 24 Sep 2019 20:33:46 +0200 Subject: [PATCH] solutions 3/4 --- lib/day1.ex | 20 ++++++++++++++++++-- lib/day2.ex | 14 ++++++++++++-- 2 files changed, 30 insertions(+), 4 deletions(-) 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