Skip to content

Instantly share code, notes, and snippets.

@tiagoengel
Last active December 21, 2018 19:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tiagoengel/4b088be4b7b19edd249a63eff059e62e to your computer and use it in GitHub Desktop.
Save tiagoengel/4b088be4b7b19edd249a63eff059e62e to your computer and use it in GitHub Desktop.
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