Skip to content

Commit 7ea6da5

Browse files
committed
day11
1 parent e50ebd5 commit 7ea6da5

File tree

2 files changed

+91
-0
lines changed

2 files changed

+91
-0
lines changed

11/sample_input

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
...#......
2+
.......#..
3+
#.........
4+
..........
5+
......#...
6+
.#........
7+
.........#
8+
..........
9+
.......#..
10+
#...#.....

11/sol.exs

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
defmodule Day11 do
2+
def read_input(file_path) do
3+
case File.read(file_path) do
4+
{:ok, content} ->
5+
content
6+
|> String.split("\n", trim: true)
7+
|> Enum.map(&String.graphemes/1)
8+
9+
{:error, reason} ->
10+
raise "Oh no! #{reason}"
11+
end
12+
end
13+
14+
def get_val({row, col}, space), do: space |> Enum.at(row) |> Enum.at(col)
15+
16+
def extract_empty_cols_index(space) do
17+
0..(length(Enum.at(space, 0)) - 1)
18+
|> Enum.filter(fn col ->
19+
0..(length(space) - 1)
20+
|> Enum.map(fn row -> {row, col} end)
21+
|> Enum.map(fn pos -> get_val(pos, space) end)
22+
|> Enum.all?(fn val -> val == "." end)
23+
end)
24+
end
25+
26+
def extract_empty_rows_index(space) do
27+
0..(length(space) - 1)
28+
|> Enum.filter(fn row -> Enum.at(space, row) |> Enum.all?(fn val -> val == "." end) end)
29+
end
30+
31+
def extract_galaxy_coords(space) do
32+
0..(length(space) - 1)
33+
|> Enum.flat_map(fn row ->
34+
0..(length(Enum.at(space, 0)) - 1)
35+
|> Enum.map(fn col -> {row, col} end)
36+
end)
37+
|> Enum.filter(fn {row, col} -> get_val({row, col}, space) != "." end)
38+
end
39+
40+
def expanded_coordH(row, expansion_rate, empty_rows) do
41+
empty_rows
42+
|> Enum.take_while(fn r -> r < row end)
43+
|> length()
44+
|> (fn l -> row + l * (expansion_rate - 1) end).()
45+
end
46+
47+
def expanded_coord({row, col}, expansion_rate, empty_rows, empty_cols) do
48+
{expanded_coordH(row, expansion_rate, empty_rows),
49+
expanded_coordH(col, expansion_rate, empty_cols)}
50+
end
51+
52+
def distance({row, col}, {row2, col2}) do
53+
abs(row2 - row) + abs(col2 - col)
54+
end
55+
56+
def dist_of_combs([], acc), do: acc
57+
58+
def dist_of_combs([coord | rest], acc) do
59+
dist_of_combs(
60+
rest,
61+
acc + (rest |> Enum.map(fn coord2 -> distance(coord, coord2) end) |> Enum.sum())
62+
)
63+
end
64+
65+
def solve(file_path, exp_rate) do
66+
space = read_input(file_path)
67+
empty_rows = extract_empty_rows_index(space)
68+
empty_cols = extract_empty_cols_index(space)
69+
coords = extract_galaxy_coords(space)
70+
71+
coords
72+
|> Enum.map(fn coord -> expanded_coord(coord, exp_rate, empty_rows, empty_cols) end)
73+
|> dist_of_combs(0)
74+
end
75+
76+
def partA(file_path), do: solve(file_path, 2)
77+
def partB(file_path), do: solve(file_path, 1_000_000)
78+
end
79+
80+
IO.puts(Day11.partA("./input"))
81+
IO.puts(Day11.partB("./input"))

0 commit comments

Comments
 (0)