Skip to content

Commit fba6c26

Browse files
committed
Solve 2024/12 - 1
1 parent f6028ef commit fba6c26

File tree

8 files changed

+246
-8
lines changed

8 files changed

+246
-8
lines changed

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,11 @@ Note that you can call those commands independently and also set up pre-commit h
6161

6262
Note: All files mentioned above are autogenerated and are created by running `mix update_stats` task.
6363

64-
# :star: 297/500 :dart: 203 :trophy: 148.5/250 :dart: 101.5
64+
# :star: 299/500 :dart: 201 :trophy: 149.5/250 :dart: 100.5
6565

6666
| Day | [2015](/lib/2015) | [2016](/lib/2016) | [2017](/lib/2017) | [2018](/lib/2018) | [2019](/lib/2019) | [2020](/lib/2020) | [2021](/lib/2021) | [2022](/lib/2022) | [2023](/lib/2023) | [2024](/lib/2024) |
6767
|:---:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
68-
| :star2: | 48 | 22 | 34 | 15 | 15 | 44 | 24 | 45 | 44 | 6 |
68+
| :star2: | 48 | 22 | 34 | 15 | 15 | 45 | 24 | 45 | 44 | 7 |
6969
| 1 | :1st_place_medal: | :1st_place_medal: | :1st_place_medal: | :1st_place_medal: | :1st_place_medal: | :1st_place_medal: | :1st_place_medal: | :1st_place_medal: | :1st_place_medal: | :1st_place_medal: |
7070
| 2 | :1st_place_medal: | :1st_place_medal: | :1st_place_medal: | :1st_place_medal: | :1st_place_medal: | :1st_place_medal: | :1st_place_medal: | :1st_place_medal: | :1st_place_medal: | |
7171
| 3 | :1st_place_medal: | :1st_place_medal: | :1st_place_medal: | :1st_place_medal: | :1st_place_medal: | :1st_place_medal: | :1st_place_medal: | :1st_place_medal: | :1st_place_medal: | :1st_place_medal: |
@@ -77,7 +77,7 @@ Note: All files mentioned above are autogenerated and are created by running `mi
7777
| 9 | :1st_place_medal: | :1st_place_medal: | :1st_place_medal: | :1st_place_medal: | | :1st_place_medal: | :1st_place_medal: | :1st_place_medal: | :1st_place_medal: | |
7878
| 10 | :1st_place_medal: | :1st_place_medal: | :1st_place_medal: | | :1st_place_medal: | :1st_place_medal: | | :1st_place_medal: | :1st_place_medal: | |
7979
| 11 | :1st_place_medal: | | :1st_place_medal: | | | :1st_place_medal: | | :1st_place_medal: | :1st_place_medal: | |
80-
| 12 | :1st_place_medal: | :1st_place_medal: | :1st_place_medal: | | | :1st_place_medal: | | :1st_place_medal: | :1st_place_medal: | |
80+
| 12 | :1st_place_medal: | :1st_place_medal: | :1st_place_medal: | | | :1st_place_medal: | | :1st_place_medal: | :1st_place_medal: | :2nd_place_medal: |
8181
| 13 | :1st_place_medal: | | :1st_place_medal: | | | :1st_place_medal: | | :1st_place_medal: | :1st_place_medal: | |
8282
| 14 | :1st_place_medal: | | :2nd_place_medal: | | | :1st_place_medal: | | :1st_place_medal: | :1st_place_medal: | |
8383
| 15 | :1st_place_medal: | | :1st_place_medal: | | | :1st_place_medal: | :1st_place_medal: | :1st_place_medal: | :1st_place_medal: | |
@@ -88,7 +88,7 @@ Note: All files mentioned above are autogenerated and are created by running `mi
8888
| 20 | :1st_place_medal: | | | | | :2nd_place_medal: | | :1st_place_medal: | | |
8989
| 21 | :1st_place_medal: | | | | | :1st_place_medal: | :1st_place_medal: | :1st_place_medal: | | |
9090
| 22 | | | | | | :1st_place_medal: | | :2nd_place_medal: | :1st_place_medal: | |
91-
| 23 | :1st_place_medal: | | :2nd_place_medal: | | | :2nd_place_medal: | | :1st_place_medal: | :1st_place_medal: | |
91+
| 23 | :1st_place_medal: | | :2nd_place_medal: | | | :1st_place_medal: | | :1st_place_medal: | :1st_place_medal: | |
9292
| 24 | :1st_place_medal: | | | | | :2nd_place_medal: | | :1st_place_medal: | :1st_place_medal: | |
9393
| 25 | :1st_place_medal: | | | | | :1st_place_medal: | :1st_place_medal: | :1st_place_medal: | :1st_place_medal: | |
9494

lib/2020/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
[2015](/lib/2015) | [2016](/lib/2016) | [2017](/lib/2017) | [2018](/lib/2018) | [2019](/lib/2019) | 2020 | [2021](/lib/2021) | [2022](/lib/2022) | [2023](/lib/2023) | [2024](/lib/2024)
77

88

9-
## :trophy: 44/50
9+
## :trophy: 45/50
1010

1111
| Day | Problem Page | Status | Difficulty | Solution Page | Test Page | Tags |
1212
| :---: | :------: | :---: | :---: | :---: | :---: | :---: |
@@ -31,7 +31,7 @@
3131
| 20 | [Jurassic Jigsaw](https://adventofcode.com/2020/day/20) | :2nd_place_medal: | :shrug: | [day_20.ex](/lib/2020/day_20.ex) | [day_20_test.exs](/test/2020/day_20_test.exs) | |
3232
| 21 | [Allergen Assessment](https://adventofcode.com/2020/day/21) | :1st_place_medal: | :shrug: | [day_21.ex](/lib/2020/day_21.ex) | [day_21_test.exs](/test/2020/day_21_test.exs) | |
3333
| 22 | [Crab Combat](https://adventofcode.com/2020/day/22) | :1st_place_medal: | :shrug: | [day_22.ex](/lib/2020/day_22.ex) | [day_22_test.exs](/test/2020/day_22_test.exs) | |
34-
| 23 | [Crab Cups](https://adventofcode.com/2020/day/23) | :2nd_place_medal: | :shrug: | [day_23.ex](/lib/2020/day_23.ex) | [day_23_test.exs](/test/2020/day_23_test.exs) | |
34+
| 23 | [Crab Cups](https://adventofcode.com/2020/day/23) | :1st_place_medal: | :shrug: | [day_23.ex](/lib/2020/day_23.ex) | [day_23_test.exs](/test/2020/day_23_test.exs) | |
3535
| 24 | [Lobby Layout](https://adventofcode.com/2020/day/24) | :2nd_place_medal: | :shrug: | [day_24.ex](/lib/2020/day_24.ex) | [day_24_test.exs](/test/2020/day_24_test.exs) | |
3636
| 25 | [Combo Breaker](https://adventofcode.com/2020/day/25) | :1st_place_medal: | :shrug: | [day_25.ex](/lib/2020/day_25.ex) | [day_25_test.exs](/test/2020/day_25_test.exs) | |
3737

lib/2024/README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@
66
[2015](/lib/2015) | [2016](/lib/2016) | [2017](/lib/2017) | [2018](/lib/2018) | [2019](/lib/2019) | [2020](/lib/2020) | [2021](/lib/2021) | [2022](/lib/2022) | [2023](/lib/2023) | 2024
77

88

9-
## :trophy: 6/50
9+
## :trophy: 7/50
1010

1111
| Day | Problem Page | Status | Difficulty | Solution Page | Test Page | Tags |
1212
| :---: | :------: | :---: | :---: | :---: | :---: | :---: |
1313
| 1 | [Historian Hysteria](https://adventofcode.com/2024/day/1) | :1st_place_medal: | :snowflake: | [day_01.ex](/lib/2024/day_01.ex) | [day_01_test.exs](/test/2024/day_01_test.exs) | [list](/wiki/tags.md#list) |
1414
| 3 | [Mull It Over](https://adventofcode.com/2024/day/3) | :1st_place_medal: | :snowflake: | [day_03.ex](/lib/2024/day_03.ex) | [day_03_test.exs](/test/2024/day_03_test.exs) | [regex](/wiki/tags.md#regex), [fsm](/wiki/tags.md#fsm) |
1515
| 5 | [Print Queue](https://adventofcode.com/2024/day/5) | :1st_place_medal: | :snowflake: | [day_05.ex](/lib/2024/day_05.ex) | [day_05_test.exs](/test/2024/day_05_test.exs) | [set](/wiki/tags.md#set), [sort](/wiki/tags.md#sort) |
16+
| 12 | [Garden Groups](https://adventofcode.com/2024/day/12) | :2nd_place_medal: | :snowflake: :snowflake: :snowflake: | [day_12.ex](/lib/2024/day_12.ex) | [day_12_test.exs](/test/2024/day_12_test.exs) | [geometry](/wiki/tags.md#geometry), [disjoint-set](/wiki/tags.md#disjoint-set) |
1617

lib/2024/day_12.ex

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
defmodule AdventOfCode.Y2024.Day12 do
2+
@moduledoc """
3+
--- Day 12: Garden Groups ---
4+
Problem Link: https://adventofcode.com/2024/day/12
5+
Difficulty: m
6+
Tags: geometry disjoint-set
7+
"""
8+
alias AdventOfCode.Algorithms.DisjointSet
9+
alias AdventOfCode.Algorithms.Grid
10+
alias AdventOfCode.Helpers.{InputReader, Transformers}
11+
12+
def input, do: InputReader.read_from_file(2024, 12)
13+
14+
def run(input \\ input()) do
15+
input = parse(input)
16+
17+
{run_1(input), run_2(input)}
18+
end
19+
20+
defp run_1(input) do
21+
Enum.sum_by(input, fn {_, plants} ->
22+
plants |> Enum.sum_by(fn plant -> calculate_price(plant, &perimeters/1) end)
23+
end)
24+
end
25+
26+
defp run_2(_input) do
27+
nil
28+
end
29+
30+
def parse(data \\ input()),
31+
do: Transformers.lines(data) |> Enum.map(&String.graphemes/1) |> Grid.grid2d() |> plants()
32+
33+
def plants(grid) do
34+
grid
35+
|> Enum.group_by(fn {_, plant} -> plant end, fn {grid, _} -> grid end)
36+
|> Map.new(fn {plant, locations} -> {plant, regions(locations)} end)
37+
end
38+
39+
defp regions(plants) do
40+
Enum.reduce(plants, DisjointSet.new(plants), fn plant, region ->
41+
plant
42+
|> Grid.surrounding4()
43+
|> Enum.reduce(region, fn neighbour, region_acc ->
44+
region_acc
45+
|> DisjointSet.union(plant, neighbour)
46+
end)
47+
end)
48+
|> DisjointSet.components()
49+
end
50+
51+
defp calculate_price(plant_set, multiply_by) do
52+
Enum.sum(multiply_by.(plant_set)) * Enum.count(plant_set)
53+
end
54+
55+
defp perimeters(plant_set) do
56+
plant_set
57+
|> Enum.map(fn plant ->
58+
plant
59+
|> Grid.surrounding4()
60+
|> Enum.reject(&MapSet.member?(plant_set, &1))
61+
|> Enum.count()
62+
end)
63+
end
64+
65+
def sample_input_1, do: "AAAA\nBBCD\nBBCC\nEEEC"
66+
67+
def sample_input_2 do
68+
~w[
69+
RRRRIICCFF
70+
RRRRIICCCF
71+
VVRRRCCFFF
72+
VVRCCCJFFF
73+
VVVVCJJCFE
74+
VVIVCCJJEE
75+
VVIIICJJEE
76+
MIIIIIJJEE
77+
MIIISIJEEE
78+
MMMISSJEEE
79+
]
80+
|> Enum.join("\n")
81+
end
82+
end

0 commit comments

Comments
 (0)