Powered by AppSignal & Oban Pro

Day 06

2023/day06.livemd

Day 06

Mix.install([:kino_aoc])

Section

{:ok, puzzle_input} =
  KinoAOC.download_puzzle("2023", "6", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION"))
{:ok, "Time:        44     80     65     72\nDistance:   208   1581   1050   1102"}
# puzzle_input =
"""
Time:      7  15   30
Distance:  9  40  200
"""
|> String.trim()
"Time:      7  15   30\nDistance:  9  40  200"
defmodule Day06 do
  def solve(t, d) do
    delta = t ** 2 - 4 * d

    sq_delta = :math.sqrt(delta)

    diff = if sq_delta == floor(sq_delta), do: 1, else: 0

    x1 = (-t + sq_delta) / -2
    x2 = (-t - sq_delta) / -2

    ceil(x2) - ceil(x1) - diff
  end
end
{:module, Day06, <<70, 79, 82, 49, 0, 0, 8, ...>>, {:solve, 2}}

Part 1

puzzle_input
|> String.split("\n")
|> Enum.map(fn line ->
  line
  |> String.split(" ", trim: true)
  |> tl()
  |> Enum.map(&String.to_integer/1)
end)
|> Enum.zip()
|> Enum.map(fn {t, d} -> Day06.solve(t, d) end)
|> Enum.product()
32076

Part 2

[t, d] =
  puzzle_input
  |> String.split("\n")
  |> Enum.map(fn line ->
    line
    |> String.split(" ", trim: true)
    |> tl()
    |> Enum.join()
    |> String.to_integer()
  end)

Day06.solve(t, d)
34278221