From 9218b5cb84167cc519018c976e1d7270deceadd9 Mon Sep 17 00:00:00 2001 From: Rebecca Le Date: Thu, 19 Dec 2024 15:41:30 +0800 Subject: [PATCH] 2024 day 19, part 1 --- README.md | 4 ++-- lib/y2024/README.md | 3 ++- lib/y2024/day19.ex | 45 ++++++++++++++++++++++++++++++++++++++ lib/y2024/input/day19.txt | Bin 0 -> 23526 bytes test/y2024/day19_test.exs | 31 ++++++++++++++++++++++++++ 5 files changed, 80 insertions(+), 3 deletions(-) create mode 100644 lib/y2024/day19.ex create mode 100644 lib/y2024/input/day19.txt create mode 100644 test/y2024/day19_test.exs diff --git a/README.md b/README.md index f12a5d7..03d85cd 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,8 @@ My Elixir solutions for [Advent of Code](https://adventofcode.com/) (all years). -

453 stars

-

34 stars
+

454 stars

+

35 stars
44 stars
50 stars
46 stars
diff --git a/lib/y2024/README.md b/lib/y2024/README.md index 27fb3e4..b5436c6 100644 --- a/lib/y2024/README.md +++ b/lib/y2024/README.md @@ -2,7 +2,7 @@ My Elixir solutions for [Advent of Code 2024](https://adventofcode.com/2024). -34 stars +35 stars ## Benchmarks @@ -48,4 +48,5 @@ day 16, part 2 13.07 76.51 ms ±5.00% 76.09 ms 85. day 17, part 1 45.64 K 21.91 μs ±15.81% 21.17 μs 37.50 μs day 18, part 1 22.53 44.38 ms ±5.11% 44.48 ms 48.54 ms day 18, part 2 4.04 247.58 ms ±3.18% 247.68 ms 260.90 ms +day 19, part 1 19.46 51.38 ms ±1.08% 51.16 ms 53.08 ms ``` diff --git a/lib/y2024/day19.ex b/lib/y2024/day19.ex new file mode 100644 index 0000000..2d39c3b --- /dev/null +++ b/lib/y2024/day19.ex @@ -0,0 +1,45 @@ +defmodule Y2024.Day19 do + use Advent.Day, no: 19 + + def part1(%{from: from_towels, to: to_towels}) do + Enum.count(to_towels, fn to -> + can_make?(to, from_towels) + end) + end + + # @doc """ + # iex> Day19.part2("update or delete me") + # "update or delete me" + # """ + # def part2(input) do + # input + # end + + defp can_make?(to, from_towels) do + find_towel_list([{to, []}], from_towels) != nil + end + + defp find_towel_list([], _from_towels), do: nil + defp find_towel_list([{[], made} | _rest], _from_towels), do: Enum.reverse(made) + + defp find_towel_list([{to, made} | rest], from_towels) do + new = + from_towels + |> Enum.filter(fn from -> List.starts_with?(to, from) end) + |> Enum.map(fn from -> {Enum.drop(to, length(from)), [from | made]} end) + + find_towel_list(new ++ rest, from_towels) + end + + def parse_input(input) do + [from, to] = String.split(input, "\n\n", trim: true) + + %{ + from: String.split(from, ", ") |> Enum.map(&String.graphemes/1), + to: String.split(to, "\n", trim: true) |> Enum.map(&String.graphemes/1) + } + end + + def part1_verify, do: input() |> parse_input() |> part1() + # def part2_verify, do: input() |> parse_input() |> part2() +end diff --git a/lib/y2024/input/day19.txt b/lib/y2024/input/day19.txt new file mode 100644 index 0000000000000000000000000000000000000000..227db5ee6d3191543f8b6d1dd62f2fb2e0e3a001 GIT binary patch literal 23526 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 literal 0 HcmV?d00001 diff --git a/test/y2024/day19_test.exs b/test/y2024/day19_test.exs new file mode 100644 index 0000000..3f74390 --- /dev/null +++ b/test/y2024/day19_test.exs @@ -0,0 +1,31 @@ +defmodule Y2024.Day19Test do + use ExUnit.Case, async: true + alias Y2024.Day19 + doctest Day19 + + @sample """ + r, wr, b, g, bwu, rb, gb, br + + brwrr + bggr + gbbr + rrbgbr + ubwu + bwurrg + brgr + bbrgwb + """ + + test "part1" do + assert Day19.parse_input(@sample) |> Day19.part1() == 6 + end + + test "parse_input" do + assert %{from: from, to: to} = Day19.parse_input(@sample) + assert [["r"], ["w", "r"] | _rest] = from + assert [["b", "r", "w", "r", "r"], ["b", "g", "g", "r"] | _rest] = to + end + + test "verification, part 1", do: assert(Day19.part1_verify() == 285) + # test "verification, part 2", do: assert(Day19.part2_verify() == "update or delete me") +end