Last active
December 21, 2018 19:49
-
-
Save tiagoengel/4b088be4b7b19edd249a63eff059e62e to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
defmodule Av4 do | |
def do_it() do | |
{:ok, buffer} = File.read("/Users/tiagoengel/Downloads/input-4.txt") | |
list = String.split(buffer, "\n") | |
|> Enum.drop(-1) | |
|> Enum.map(&transform_entry/1) | |
|> Enum.sort(&sort_entry/2) | |
result = traverse_events(list, nil, nil, %{}) | |
{lazy_guard, {_, times}} = Enum.max_by(result, fn {_, { time, _}} -> | |
time | |
end) | |
IO.inspect lazy_guard | |
IO.inspect more_frequent_minute(times, %{}) | |
end | |
def sort_entry(%{date: date_a}, %{date: date_b}) do | |
case DateTime.compare(date_a, date_b) do | |
:lt -> true | |
_ -> false | |
end | |
end | |
def transform_entry(entry) do | |
[date_str, event] = String.split(entry, "] ") | |
{:ok, date, _} = String.replace(date_str, "[", "") | |
|> String.replace(" ", "T") | |
|> Kernel.<>(":00.0Z") | |
|> DateTime.from_iso8601 | |
id = case Regex.run(~r([0-9]+), event) do | |
[h] -> h | |
_ -> nil | |
end | |
%{date: date, event: event, id: id} | |
end | |
def traverse_events([], _, _, acc), do: acc | |
def traverse_events([%{ date: date, event: event, id: id } = head | tail], _, previous_event, acc) when id != nil do | |
traverse_events(tail, id, head, acc) | |
end | |
def traverse_events([%{ date: date, event: event, id: id } = head | tail], current_guard, %{ date: prev_date }, acc) do | |
case event do | |
"falls asleep" -> traverse_events(tail, current_guard, head, acc) | |
"wakes up" -> | |
diff = DateTime.diff(date, prev_date, :second) / 60 | |
new_acc = Map.update(acc, current_guard, { diff, [{ prev_date, date }] }, fn { time, list } -> | |
{ time + diff, list ++ [{ prev_date, date }]} | |
end) | |
traverse_events(tail, current_guard, head, new_acc) | |
end | |
end | |
def more_frequent_minute([], acc) do | |
Enum.max_by(acc, fn { _, count} -> count end) | |
end | |
def more_frequent_minute([{start_event, end_event} | tail], acc) do | |
result = start_event.minute..(end_event.minute - 1) | |
|> Enum.reduce(acc, fn x, acc2 -> Map.update(acc2, x, 0, &(&1 + 1)) end) | |
more_frequent_minute(tail, result) | |
end | |
end | |
Av4.do_it() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment