From c6c501af2a6f11628857240a75d479f672138b6b Mon Sep 17 00:00:00 2001 From: bluepython508 Date: Sat, 2 Dec 2023 18:13:05 +0000 Subject: [PATCH] Day 2 --- lib/common.ex | 11 +++++++++++ lib/day2.ex | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++ tests/day2/1 | 5 +++++ tests/day2/1.1 | 1 + tests/day2/1.2 | 1 + 5 files changed, 70 insertions(+) create mode 100644 lib/day2.ex create mode 100644 tests/day2/1 create mode 100644 tests/day2/1.1 create mode 100644 tests/day2/1.2 diff --git a/lib/common.ex b/lib/common.ex index 5caf2e7..6882171 100644 --- a/lib/common.ex +++ b/lib/common.ex @@ -1,4 +1,15 @@ defmodule Aoc2023.Common do def stringify(s) when is_binary(s) do s end def stringify(n) when is_integer(n) do inspect(n) end + def stringify(nil), do: "nil" + + def map_nth(tup, n, fun) do + put_elem(tup, n, fun.(elem(tup, n))) + end + + defmacro pipe(expr) do + quote do + fn (val) -> val |> unquote(expr) end + end + end end diff --git a/lib/day2.ex b/lib/day2.ex new file mode 100644 index 0000000..f693515 --- /dev/null +++ b/lib/day2.ex @@ -0,0 +1,52 @@ +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 diff --git a/tests/day2/1 b/tests/day2/1 new file mode 100644 index 0000000..295c36d --- /dev/null +++ b/tests/day2/1 @@ -0,0 +1,5 @@ +Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green +Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue +Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red +Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red +Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green diff --git a/tests/day2/1.1 b/tests/day2/1.1 new file mode 100644 index 0000000..45a4fb7 --- /dev/null +++ b/tests/day2/1.1 @@ -0,0 +1 @@ +8 diff --git a/tests/day2/1.2 b/tests/day2/1.2 new file mode 100644 index 0000000..184e5a1 --- /dev/null +++ b/tests/day2/1.2 @@ -0,0 +1 @@ +2286