Powered by AppSignal & Oban Pro

Advent of Code 2023 Day 4

2023/day-04.livemd

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()