diff --git a/lib/day13/day13.ex b/lib/day13/day13.ex new file mode 100644 index 0000000..530fa48 --- /dev/null +++ b/lib/day13/day13.ex @@ -0,0 +1,67 @@ +defmodule Day13 do + @example """ + 939 + 7,13,x,x,59,x,31,19 + """ + + def part1(example \\ false) do + {earliest_time, busses} = parse_input(example) + + bus_id = + busses + |> Enum.reject(&(&1 == "x")) + |> Enum.min_by(fn bus -> + bus - rem(earliest_time, bus) + end) + + bus_id * (bus_id - rem(earliest_time, bus_id)) + end + + def part2(example \\ false) do + {_, busses} = parse_input(example) + + busses = + busses + |> Enum.with_index() + |> Enum.reject(&(elem(&1, 0) == "x")) + + find_time(0, busses) + end + + def parse_input(example) do + [l1, l2] = + if(example, do: @example, else: File.read!("lib/day13/input.txt")) + |> String.trim() + |> String.split() + + busses = + l2 + |> String.split(",") + |> Enum.map(fn + "x" -> "x" + s -> String.to_integer(s) + end) + + {String.to_integer(l1), busses} + end + + def find_time(time, busses) do + {valid, rest} = + Enum.split_while(busses, fn {id, index} -> + rem(time + index, id) == 0 + end) + + case rest do + [] -> + time + + _ -> + if valid == [] do + raise "uh oh" + end + + step = Enum.reduce(valid, 1, &(elem(&1, 0) * &2)) + find_time(time + step, busses) + end + end +end diff --git a/lib/day13/input.txt b/lib/day13/input.txt new file mode 100644 index 0000000..096e2cc --- /dev/null +++ b/lib/day13/input.txt @@ -0,0 +1,2 @@ +1002618 +19,x,x,x,x,x,x,x,x,41,x,x,x,37,x,x,x,x,x,367,x,x,x,x,x,x,x,x,x,x,x,x,13,x,x,x,17,x,x,x,x,x,x,x,x,x,x,x,29,x,373,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,23