defmodule Aoc2023.Day2 do use Aoc2023 def parse(input) do input |> String.split("\n") |> Enum.map(pipe( String.split(": ") |> then(fn ["Game " <> id, rounds] -> {String.to_integer(id), rounds |> String.split("; ") |> Enum.map(pipe( String.split(", ") |> Enum.map(pipe( String.split(" ") |> then(fn [n, color] -> {String.to_existing_atom(color), String.to_integer(n)} end) )) ))} end) )) |> Enum.into(%{}) end @part1_available [ red: 12, green: 13, blue: 14 ] def part1(input) do input |> Enum.filter(pipe( elem(1) |> Enum.all?(pipe( Enum.all?(fn {color, num} -> Keyword.get(@part1_available, color, 0) >= num end) )) )) |> Enum.map(pipe(elem(0))) |> Enum.sum end def part2(input) do input |> Enum.map(pipe( elem(1) |> Enum.reduce(&(Keyword.merge(&1, &2, fn _, m1, m2 -> max(m1, m2) end))) |> Enum.map(pipe(elem(1))) |> Enum.product )) |> Enum.sum end end