Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

Day 6

2023/day_6.livemd

Day 6

Mix.install([:kino])

Get input

input =
  Kino.Input.textarea("Paste input here",
    default: """
    Time:      7  15   30
    Distance:  9  40  200
    """
  )
parsed_input =
  Kino.Input.read(input)
  |> String.split("\n", trim: true)
  |> then(fn ["Time:" <> times, "Distance:" <> distances] -> [times, distances] end)
defmodule Helper do
  def find_winning_button_press({time, distance}) do
    Enum.find(0..time, fn speed ->
      resulting_distance = speed * (time - speed)
      resulting_distance > distance
    end)
  end
end

Part 1

races =
  parsed_input
  |> Enum.map(fn s -> s |> String.split(" ", trim: true) |> Enum.map(&amp;String.to_integer/1) end)
  |> List.zip()
races
|> Enum.map(fn {time, distance} ->
  winning_button_hold = Helper.find_winning_button_press({time, distance})
  time - 2 * winning_button_hold + 1
end)
|> Enum.product()

Part 2

race =
  parsed_input
  |> Enum.map(fn s ->
    s
    |> String.split(" ", trim: true)
    |> Enum.join()
    |> then(&amp;String.to_integer/1)
  end)
  |> List.to_tuple()
{time, distance} = race
winning_button_hold = Helper.find_winning_button_press({time, distance})

dbg(winning_button_hold)

time - 2 * winning_button_hold + 1
d_win = 233_101_111_101_487
time = 40_828_492

# d = x * (time - x) where x = 0..time
#  -> d = x * time - x^2

d = time - x
counts = time - 2 * d + 1
# counts = time - 2 * x * time - x^2 + 1