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

day 6

lib/day_6.livemd

day 6

Mix.install([
  {:kino, "~> 0.11.3"}
])

Section

input = Kino.Input.textarea("input")

Part 1

[time, distance] =
  input
  |> Kino.Input.read()
  |> String.trim()
  |> String.split("\n")
  |> Enum.map(fn x ->
    format =
      x
      |> String.split(~r/\s+/, trim: true)
      |> Enum.reject(&(&1 == ""))

    column = Enum.at(format, 0)

    value =
      Enum.drop(format, 1)
      |> Enum.map(&String.to_integer/1)

    [column, value]
  end)

solution

total_time_tuple = Enum.at(time, 1) |> Enum.with_index()
record_distance = Enum.at(distance, 1)

Enum.reduce(total_time_tuple, 1, fn {total_time, index}, acc ->
  count =
    1..total_time
    |> Enum.filter(fn time ->
      distance = (total_time - time) * time
      distance > Enum.at(record_distance, index)
    end)
    |> Enum.count()

  acc * count
end)

Part 2

[total_time, record_distance] =
  input
  |> Kino.Input.read()
  |> String.trim()
  |> String.split("\n")
  |> Enum.map(fn x ->
    x
    |> String.replace(~r/\D+/, "")
    |> String.to_integer()
  end)

Solution

Enum.count(1..total_time, fn time ->
  (total_time - time) * time > record_distance
end)