37 lines
838 B
Elixir
37 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()
|