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(&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, &(&1 + 1))
|> Stream.map(&run(race_len, &1))
|> Stream.take_while(&(&1 > 0))
|> Enum.count(&(&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])