Powered by AppSignal & Oban Pro

Advent of Code 2023 Day 2 Part 1

2023_day2_part1.livemd

Advent of Code 2023 Day 2 Part 1

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

Get Inputs

{:ok, puzzle_input} =
  KinoAOC.download_puzzle("2023", "2", System.fetch_env!("LB_SESSION"))

My answer

games =
  puzzle_input
  |> String.split("\n")
  |> Enum.into(%{}, fn line ->
    [title, items] = String.split(line, ":")

    game_num =
      title
      |> String.replace("Game ", "")
      |> String.to_integer()

    game =
      items
      |> String.split(";")
      |> Enum.map(fn subsets ->
        subsets
        |> String.split(",")
        |> Enum.into(%{}, fn subset ->
          [_, number, color] = String.split(subset, " ")
          {color, String.to_integer(number)}
        end)
      end)

    {game_num, game}
  end)
defmodule Checker do
  def check(%{"red" => num}) when num > 12, do: false
  def check(%{"green" => num}) when num > 13, do: false
  def check(%{"blue" => num}) when num > 14, do: false
  def check(_subset), do: true
end
games
|> Enum.reduce(0, fn {game_num, game}, acc ->
  acc + if Enum.all?(game, &Checker.check(&1)), do: game_num, else: 0
end)