AdventOfCode/2020/day13/day13part2-cheating.exs

36 lines
838 B
Elixir

defmodule Day13Part2 do
def run do
File.read!("input")
|> String.split(["\n", ","], trim: true)
|> Enum.drop(1)
|> Enum.map(&parse_schedule/1)
|> Enum.with_index()
|> Enum.reject(&match?({:any, _}, &1))
|> Enum.reduce({0, 1}, &find_sequential_departures/2)
|> elem(0)
|> IO.puts()
end
def parse_schedule(id) do
case Integer.parse(id) do
{id, ""} -> id
_ -> :any
end
end
# Adapted from voltone's solution ❤️
# https://elixirforum.com/t/advent-of-code-2020-day-13/36180/6
defp find_sequential_departures({bus, index}, {t, step}) do
if rem(t + index, bus) == 0 do
{t, lcm(step, bus)}
else
find_sequential_departures({bus, index}, {t + step, step})
end
end
defp lcm(a, b) do
div(a * b, Integer.gcd(a, b))
end
end
Day13Part2.run()