Powered by AppSignal & Oban Pro

Day 6

notebooks/day06.livemd

Day 6

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

Input

session = System.fetch_env!("LB_AOC_SESSION")

input =
  Req.get!(
    "https://adventofcode.com/2023/day/6/input",
    headers: [{"Cookie", ~s"session=#{session}"}]
  ).body

Kino.Text.new(input, terminal: true)

Part 1

[time, distance] =
  for line <- String.split(input, "\n", trim: true) do
    line
    |> String.split()
    |> Enum.drop(1)
    |> Enum.map(&amp;String.to_integer/1)
  end
defmodule Part1 do
  def run(race_len, btn_len) do
    (race_len - btn_len) * btn_len
  end

  def winning_outcomes(race_len, record) do
    Stream.iterate(1, &amp;(&amp;1 + 1))
    |> Stream.map(&amp;run(race_len, &amp;1))
    |> Stream.take_while(&amp;(&amp;1 > 0))
    |> Enum.count(&amp;(&amp;1 > record))
  end

  def margin_of_error(times, distances) do
    for {race_len, record} <- Enum.zip(times, distances) do
      winning_outcomes(race_len, record)
    end
    |> Enum.product()
  end
end

Part1.margin_of_error(time, distance)

Part 2

[actual_time, actual_distance] =
  for line <- String.split(input, "\n", trim: true) do
    line
    |> String.split()
    |> Enum.drop(1)
    |> Enum.join()
    |> String.to_integer()
  end

Part1.margin_of_error([actual_time], [actual_distance])