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

Day 6: Wait For It

day06.livemd

Day 6: Wait For It

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

Input

input = Kino.Input.textarea("Please, paste your input here:")
defmodule Day6Shared do
  def distance(hold_for, time_limit) do
    time_to_move = time_limit - hold_for
    speed = hold_for

    speed * time_to_move
  end
end

Part 1

defmodule Day6Part1 do
  import Day6Shared, only: [distance: 2]

  def solve(input) do
    input
    |> parse()
    |> Enum.map(fn {time_limit, max_distance} ->
      Enum.count(1..time_limit, fn hold_for ->
        distance(hold_for, time_limit) > max_distance
      end)
    end)
    |> Enum.reduce(fn ways, acc -> acc * ways end)
  end

  defp parse(input) do
    [raw_time, raw_distance] =
      input
      |> Kino.Input.read()
      |> String.split("\n")

    [_ | times] = String.split(raw_time, ~r/\s+/)
    times = Enum.map(times, &String.to_integer/1)

    [_ | distances] = String.split(raw_distance, ~r/\s+/)
    distances = Enum.map(distances, &String.to_integer/1)

    Enum.zip(times, distances)
  end
end

Day6Part1.solve(input)

Part 2

defmodule Day6Part2 do
  import Day6Shared, only: [distance: 2]

  def solve(input) do
    {time_limit, max_distance} = parse(input)

    Enum.count(1..time_limit, fn hold_for ->
      distance(hold_for, time_limit) > max_distance
    end)
  end

  defp parse(input) do
    [raw_time, raw_distance] =
      input
      |> Kino.Input.read()
      |> String.split("\n")

    [_ | times] = String.split(raw_time, ~r/\s+/)
    time = times |> Enum.join() |> String.to_integer()

    [_ | distances] = String.split(raw_distance, ~r/\s+/)
    distance = distances |> Enum.join() |> String.to_integer()

    {time, distance}
  end
end

Day6Part2.solve(input)