Skip to content

Commit fb727a9

Browse files
committed
Solve 2023/11
1 parent 329b2ea commit fb727a9

File tree

7 files changed

+223
-5
lines changed

7 files changed

+223
-5
lines changed

README.md

+4-4
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-
## :trophy: 265/450
64+
## :trophy: 269/450
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) |
6767
|:---:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
68-
| :star2: | 48 | 22 | 34 | 15 | 15 | 44 | 24 | 45 | 18 |
68+
| :star2: | 48 | 22 | 34 | 15 | 15 | 44 | 24 | 45 | 22 |
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: |
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: |
@@ -75,8 +75,8 @@ Note: All files mentioned above are autogenerated and are created by running `mi
7575
| 7 | :1st_place_medal: | :1st_place_medal: | :2nd_place_medal: | | | :1st_place_medal: | :1st_place_medal: | :1st_place_medal: | :1st_place_medal: |
7676
| 8 | :1st_place_medal: | :1st_place_medal: | :1st_place_medal: | :2nd_place_medal: | :1st_place_medal: | :1st_place_medal: | | :1st_place_medal: | :1st_place_medal: |
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: |
78-
| 10 | :1st_place_medal: | :1st_place_medal: | :1st_place_medal: | | :1st_place_medal: | :1st_place_medal: | | :1st_place_medal: | |
79-
| 11 | :1st_place_medal: | | :1st_place_medal: | | | :1st_place_medal: | | :1st_place_medal: | |
78+
| 10 | :1st_place_medal: | :1st_place_medal: | :1st_place_medal: | | :1st_place_medal: | :1st_place_medal: | | :1st_place_medal: | :1st_place_medal: |
79+
| 11 | :1st_place_medal: | | :1st_place_medal: | | | :1st_place_medal: | | :1st_place_medal: | :1st_place_medal: |
8080
| 12 | :1st_place_medal: | :1st_place_medal: | :1st_place_medal: | | | :1st_place_medal: | | :1st_place_medal: | |
8181
| 13 | :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: | |

difficulties.md

+2
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ optimize them and update this page with refined and more accurate data.
7575
| 2022/21 | [Monkey Math](https://adventofcode.com/2022/day/21) | :1st_place_medal: | :snowflake: :snowflake: | [day_21.ex](/lib/2022/day_21.ex) | [day_21_test.exs](/test/2022/day_21_test.exs) | [erlang](/tags.md#erlang), [op-code](/tags.md#op-code), [large-number](/tags.md#large-number), [arithmetic](/tags.md#arithmetic) |
7676
| 2023/2 | [Cube Conundrum](https://adventofcode.com/2023/day/2) | :1st_place_medal: | :snowflake: :snowflake: | [day_02.ex](/lib/2023/day_02.ex) | [day_02_test.exs](/test/2023/day_02_test.exs) | [reduction](/tags.md#reduction) |
7777
| 2023/8 | [Haunted Wasteland](https://adventofcode.com/2023/day/8) | :1st_place_medal: | :snowflake: :snowflake: | [day_08.ex](/lib/2023/day_08.ex) | [day_08_test.exs](/test/2023/day_08_test.exs) | [arithmetic](/tags.md#arithmetic), [sequence](/tags.md#sequence) |
78+
| 2023/11 | [Cosmic Expansion](https://adventofcode.com/2023/day/11) | :1st_place_medal: | :snowflake: :snowflake: | [day_11.ex](/lib/2023/day_11.ex) | [day_11_test.exs](/test/2023/day_11_test.exs) | [grid](/tags.md#grid), [measurement](/tags.md#measurement) |
7879

7980
## m
8081

@@ -135,6 +136,7 @@ optimize them and update this page with refined and more accurate data.
135136
| 2022/18 | [Boiling Boulders](https://adventofcode.com/2022/day/18) | :1st_place_medal: | :snowflake: :snowflake: :snowflake: :snowflake: :snowflake: | [day_18.ex](/lib/2022/day_18.ex) | [day_18_test.exs](/test/2022/day_18_test.exs) | [erlang](/tags.md#erlang), [geometry3d](/tags.md#geometry3d), [surface](/tags.md#surface), [set](/tags.md#set) |
136137
| 2022/19 | [Not Enough Minerals](https://adventofcode.com/2022/day/19) | :1st_place_medal: | :snowflake: :snowflake: :snowflake: :snowflake: :snowflake: | [day_19.ex](/lib/2022/day_19.ex) | [day_19_test.exs](/test/2022/day_19_test.exs) | [erlang](/tags.md#erlang), [slow](/tags.md#slow), [needs-improvement](/tags.md#needs-improvement), [grid](/tags.md#grid), [walk](/tags.md#walk), [optimization](/tags.md#optimization) |
137138
| 2023/5 | [If You Give A Seed A Fertilizer](https://adventofcode.com/2023/day/5) | :1st_place_medal: | :snowflake: :snowflake: :snowflake: :snowflake: :snowflake: | [day_05.ex](/lib/2023/day_05.ex) | [day_05_test.exs](/test/2023/day_05_test.exs) | [range](/tags.md#range), [gb-tree](/tags.md#gb-tree) |
139+
| 2023/10 | [Pipe Maze](https://adventofcode.com/2023/day/10) | :1st_place_medal: | :snowflake: :snowflake: :snowflake: :snowflake: :snowflake: | [day_10.ex](/lib/2023/day_10.ex) | [day_10_test.exs](/test/2023/day_10_test.exs) | [graph](/tags.md#graph), [graph-traversal](/tags.md#graph-traversal), [needs-improvement](/tags.md#needs-improvement), [not-fast-enough](/tags.md#not-fast-enough) |
138140

139141
## xxl
140142

lib/2023/README.md

+3-1
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](/lib/2020) | [2021](/lib/2021) | [2022](/lib/2022) | 2023
77

88

9-
## :trophy: 18/50
9+
## :trophy: 22/50
1010

1111
| Day | Problem Page | Status | Difficulty | Solution Page | Test Page | Tags |
1212
| :---: | :------: | :---: | :---: | :---: | :---: | :---: |
@@ -19,4 +19,6 @@
1919
| 7 | [Camel Cards](https://adventofcode.com/2023/day/7) | :1st_place_medal: | :snowflake: :snowflake: :snowflake: | [day_07.ex](/lib/2023/day_07.ex) | [day_07_test.exs](/test/2023/day_07_test.exs) | [map](/tags.md#map), [pattern-matching](/tags.md#pattern-matching) |
2020
| 8 | [Haunted Wasteland](https://adventofcode.com/2023/day/8) | :1st_place_medal: | :snowflake: :snowflake: | [day_08.ex](/lib/2023/day_08.ex) | [day_08_test.exs](/test/2023/day_08_test.exs) | [arithmetic](/tags.md#arithmetic), [sequence](/tags.md#sequence) |
2121
| 9 | [Mirage Maintenance](https://adventofcode.com/2023/day/9) | :1st_place_medal: | :snowflake: | [day_09.ex](/lib/2023/day_09.ex) | [day_09_test.exs](/test/2023/day_09_test.exs) | [sequence](/tags.md#sequence), [reduction](/tags.md#reduction) |
22+
| 10 | [Pipe Maze](https://adventofcode.com/2023/day/10) | :1st_place_medal: | :snowflake: :snowflake: :snowflake: :snowflake: :snowflake: | [day_10.ex](/lib/2023/day_10.ex) | [day_10_test.exs](/test/2023/day_10_test.exs) | [graph](/tags.md#graph), [graph-traversal](/tags.md#graph-traversal), [needs-improvement](/tags.md#needs-improvement), [not-fast-enough](/tags.md#not-fast-enough) |
23+
| 11 | [Cosmic Expansion](https://adventofcode.com/2023/day/11) | :1st_place_medal: | :snowflake: :snowflake: | [day_11.ex](/lib/2023/day_11.ex) | [day_11_test.exs](/test/2023/day_11_test.exs) | [grid](/tags.md#grid), [measurement](/tags.md#measurement) |
2224

lib/2023/day_11.ex

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
defmodule AdventOfCode.Y2023.Day11 do
2+
@moduledoc """
3+
--- Day 11: Cosmic Expansion ---
4+
Problem Link: https://adventofcode.com/2023/day/11
5+
Difficulty: s
6+
Tags: grid measurement
7+
"""
8+
alias AdventOfCode.Algorithms.Grid
9+
alias AdventOfCode.Helpers.{InputReader, Transformers}
10+
11+
def input, do: InputReader.read_from_file(2023, 11)
12+
13+
def run(input \\ input()) do
14+
input = parse(input)
15+
{all_pairs_distance(input, 2), all_pairs_distance(input, 1_000_000)}
16+
end
17+
18+
def parse(data \\ input()) do
19+
grid =
20+
data
21+
|> Transformers.lines()
22+
|> Enum.map(&String.graphemes/1)
23+
|> Grid.grid2d()
24+
25+
{{row_max, col_max}, _} = Enum.max(grid)
26+
galaxies = for {p, "#"} <- grid, do: p
27+
occupied_rows = for {row, _} <- galaxies, into: %MapSet{}, do: row
28+
occupied_cols = for {_, col} <- galaxies, into: %MapSet{}, do: col
29+
empty_rows = 0..row_max |> MapSet.new() |> MapSet.difference(occupied_rows)
30+
empty_cols = 0..col_max |> MapSet.new() |> MapSet.difference(occupied_cols)
31+
32+
{galaxies, empty_rows, empty_cols}
33+
end
34+
35+
defp all_pairs_distance({galaxies, empty_rows, empty_cols}, rate) do
36+
galaxies
37+
|> expand(empty_rows, empty_cols, rate)
38+
|> then(fn [current | remaining] -> all_pairs_distance(0, current, remaining) end)
39+
end
40+
41+
def all_pairs_distance(distance, _, []), do: distance
42+
43+
def all_pairs_distance(distance, {x1, y1}, [next | remaining] = galaxies) do
44+
for {x2, y2} <- galaxies, reduce: distance do
45+
acc -> acc + abs(x2 - x1) + abs(y2 - y1)
46+
end
47+
|> all_pairs_distance(next, remaining)
48+
end
49+
50+
def expand(galaxies, rows, cols, rate) do
51+
for {x, y} <- galaxies,
52+
do:
53+
{x + (rate - 1) * Enum.count(rows, &(&1 < x)),
54+
y + (rate - 1) * Enum.count(cols, &(&1 < y))}
55+
end
56+
end

0 commit comments

Comments
 (0)