Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

Day 2 - Advent of Code 2023

2023/day2.livemd

Day 2 - Advent of Code 2023

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

Section

{:ok, puzzle_input} =
  KinoAOC.download_puzzle("2023", "2", System.fetch_env!("LB_AOC_SESSION"))
defmodule AoC.Day2 do
  def part1(input) do
    input
    |> String.split("\n", trim: true)
    |> Enum.filter(
      &amp;match?(%{green: g, red: r, blue: b} when g <= 13 and r <= 12 and b <= 14, bag_max(&amp;1))
    )
    |> Enum.map(fn s -> Regex.run(~r/Game (\d+)/, s) |> List.last() |> String.to_integer() end)
    |> Enum.sum()
  end

  def part2(input) do
    input
    |> String.split("\n", trim: true)
    |> Enum.map(&amp;bag_max/1)
    |> Enum.map(fn c -> c[:green] * c[:red] * c[:blue] end)
    |> Enum.sum()
  end

  def bag_max(line) do
    Regex.scan(~r/(\d+) (blue|red|green)/, line)
    |> Enum.map(&amp;tl/1)
    |> Enum.group_by(&amp;String.to_atom(List.last(&amp;1)), &amp;String.to_integer(List.first(&amp;1)))
    |> Enum.into(%{}, fn {k, v} -> {k, Enum.max(v)} end)
  end
end

Part 1

puzzle_input
|> AoC.Day2.part1()

Part 2

puzzle_input
|> AoC.Day2.part2()