Powered by AppSignal & Oban Pro

Advent of code day 06

2023/livebooks/day-06.livemd

Advent of code day 06

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

Setup input

example = Kino.Input.textarea("Please paste your input example:")
input = Kino.Input.textarea("Please paste your real input:")

Part 01

[time, distance] =
  example
  |> Kino.Input.read()
  |> String.split(["\n", "Distance:"], trim: true)

times =
  time
  |> String.split(["Time:", " "], trim: true)
  |> Enum.map(&String.to_integer/1)

distances = distance |> String.split(" ", trim: true) |> Enum.map(&String.to_integer/1)

Enum.zip(times, distances)
|> Enum.reduce(1, fn {t, d}, acc ->
  margin =
    for hold <- 0..t, hold * (t - hold) > d do
      1
    end
    |> Enum.sum()

  margin * acc
end)

Part 02

[time, distance] =
  example
  |> Kino.Input.read()
  |> String.split(["\n", "Distance:"], trim: true)

times =
  time |> String.split(["Time:", " "], trim: true) |> Enum.join("") |> String.to_integer()

distances =
  distance |> String.split(" ", trim: true) |> Enum.join("") |> String.to_integer()

# we probably could solve it in O(1) using math
# also, putting it inside a module so it compiles and runs faster.
defmodule T do
  def f(times, distances) do
    Enum.zip([times], [distances])
    |> Enum.reduce(1, fn {t, d}, acc ->
      margin =
        for hold <- 0..t, hold * (t - hold) > d do
          1
        end
        |> Enum.sum()

      margin * acc
    end)
  end
end

T.f(times, distances)