Advent of Code 2023 - Day 6
Sample
sample = """
Time: 7 15 30
Distance: 9 40 200
"""
"Time: 7 15 30\nDistance: 9 40 200\n"
Input
input = """
Time: 40 82 84 92
Distance: 233 1011 1110 1487
"""
"Time: 40 82 84 92\nDistance: 233 1011 1110 1487\n"
Part 1
quad = fn t, r ->
break_even = (t - :math.sqrt(t * t - 4 * r)) / 2
ceiling = ceil(break_even)
if ceiling > break_even do
ceiling
else
break_even + 1
end
end
[times, records] =
input
|> String.split("\n", trim: true)
|> Enum.map(fn line ->
[_label, values] = String.split(line, ~r/:\s+/)
values |> String.split(~r/\s+/) |> Enum.map(&String.to_integer/1)
end)
races = Enum.zip(times, records)
Enum.map(races, fn {time, record} ->
x = quad.(time, record)
time - 2 * x + 1
end)
|> Enum.product()
3316275
Part 2
quad = fn t, r ->
break_even = (t - :math.sqrt(t * t - 4 * r)) / 2
ceiling = ceil(break_even)
if ceiling > break_even do
ceiling
else
break_even + 1
end
end
[time, record] =
input
|> String.split("\n", trim: true)
|> Enum.map(fn line ->
[_label, values] = String.split(line, ~r/:\s+/)
values |> String.replace(~r/\s+/, "") |> String.to_integer()
end)
x = quad.(time, record)
time - x * 2 + 1
27102791