Advent of Code 2023 Day 4
Mix.install([
{:kino_aoc, "~> 0.1.5"}
])
Prep
{:ok, puzzle_input} =
KinoAOC.download_puzzle("2023", "4", System.fetch_env!("LB_AOC_SESSION"))
IO.puts(puzzle_input)
cards =
puzzle_input
|> String.split("\n")
|> Stream.map(&String.split(&1, ~r/[:|]/))
|> Stream.map(fn [_, win, got] ->
{
win |> String.split(" ", trim: true),
got |> String.split(" ", trim: true)
}
end)
|> Stream.map(fn {win, got} ->
win -- win -- got
end)
|> Enum.map(&length/1)
Part 1
cards
|> Stream.map(&(2 ** (&1 - 1)))
|> Stream.map(&floor/1)
|> Enum.sum()
Part 2
cards =
cards
|> Stream.with_index(1)
|> Map.new(fn {won, i} -> {i, won} end)
counts =
cards
|> Map.new(fn {i, _} -> {i, 1} end)
counts =
for i <- 1..map_size(cards), reduce: counts do
counts ->
won = cards[i]
for j <- (i + 1)..(i + won)//1, j <= map_size(counts), reduce: counts do
counts -> %{counts | j => counts[j] + counts[i]}
end
end
counts
|> Map.values()
|> Enum.sum()