diff --git a/2023/README.md b/2023/README.md
index dca55fa..094313d 100644
--- a/2023/README.md
+++ b/2023/README.md
@@ -1,12 +1,12 @@
# Advent of Code 2023
-| S | M | T | W | T | F | S |
-| :-: | :-: | :-: | :-: | :-: | :-: | :-------------------------: |
-| | | | | | [1] | [2] |
-| [3] | [4] | [5] | 6 | [7] | [8] | [9][haskell][9h] |
-| 10 | [11] | 12 | 13 | 14 | 15 | 16 |
-| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
-| 24 | 25 | | | | | |
+| S | M | T | W | T | F | S |
+| :-: | :-: | :-: | :-: | :-: | :-: | :-------------------------: |
+| | | | | | [1] | [2] |
+| [3] | [4] | [5] | 6 | [7] | [8] | [9][haskell][9h] |
+| 10 | [11] | 12 | [13] | 14 | 15 | 16 |
+| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
+| 24 | 25 | | | | | |
[1]: ./lib/2023/1.ex
[2]: ./lib/2023/2.ex
@@ -22,3 +22,5 @@
[9h]: ./9.hs
[11]: ./lib/2023/11.ex
+
+[13]: ./lib/2023/13.ex
diff --git a/2023/lib/2023/13.ex b/2023/lib/2023/13.ex
new file mode 100644
index 0000000..5fb2c3b
--- /dev/null
+++ b/2023/lib/2023/13.ex
@@ -0,0 +1,44 @@
+import AOC
+import AOCHelpers
+
+aoc 2023, 13 do
+ def p1(input) do
+ input
+ |> String.split("\n\n")
+ |> Enum.map(&lines_of_chars/1)
+ |> Enum.map(&summarize/1)
+ |> Enum.sum()
+ end
+
+ def p2(_input) do
+ end
+
+ def summarize(lines) do
+ vertical_line_of_reflection = find_reflection_index(lines)
+ horizontal_line_of_reflection = lines |> transpose() |> find_reflection_index()
+
+ summary = vertical_line_of_reflection + 100 * horizontal_line_of_reflection
+
+ summary
+ end
+
+ def find_reflection_index(lines) do
+ len = lines |> List.first() |> length()
+
+ idx =
+ for i <- 1..(len - 1) do
+ lines
+ |> Enum.all?(fn line ->
+ line
+ |> Enum.split(i)
+ |> Tuple.to_list()
+ |> map_list([&Enum.reverse/1, &id/1])
+ |> Enum.zip_with(&apply(Kernel, :==, &1))
+ |> Enum.all?(is?(true))
+ end)
+ end
+ |> Enum.find_index(is?(true))
+
+ if idx, do: idx + 1, else: 0
+ end
+end
diff --git a/2023/lib/aoc_helpers.ex b/2023/lib/aoc_helpers.ex
index cdda4a3..fa90c04 100644
--- a/2023/lib/aoc_helpers.ex
+++ b/2023/lib/aoc_helpers.ex
@@ -7,10 +7,12 @@ defmodule AOCHelpers do
String.split(str)
end
- def letters(str) when is_binary(str) do
+ def chars(str) when is_binary(str) do
String.split(str, "", trim: true)
end
+ def letters(str), do: chars(str)
+
def integers(str) when is_binary(str) do
str
|> words()
@@ -27,6 +29,12 @@ defmodule AOCHelpers do
|> Enum.map(&integers/1)
end
+ def lines_of_chars(input) do
+ input
+ |> lines()
+ |> Enum.map(&chars/1)
+ end
+
def to_grid(str) do
lists =
str
@@ -77,4 +85,10 @@ defmodule AOCHelpers do
def combinations([x | xs], n) do
for(tail <- combinations(xs, n - 1), do: [x | tail]) ++ combinations(xs, n)
end
+
+ def transpose(list_of_lists) do
+ list_of_lists
+ |> Enum.zip()
+ |> Enum.map(&Tuple.to_list/1)
+ end
end
diff --git a/README.md b/README.md
index bbf2052..e2b4e09 100644
--- a/README.md
+++ b/README.md
@@ -14,7 +14,7 @@
1. [2020] **17/50** 🌟
1. [2021] **43/50** 🌟
1. [2022] **14/50** 🌟
-1. [2023] **17/50** 🌟
+1. [2023] **18/50** 🌟
[2015]: ./2015
[2017]: ./2017