diff --git a/advent-of-code-2023.csproj b/advent-of-code-2023.csproj
index 48a4fb0..b8b307c 100644
--- a/advent-of-code-2023.csproj
+++ b/advent-of-code-2023.csproj
@@ -54,6 +54,8 @@
+
+
diff --git a/inputs/12.txt b/inputs/12.txt
new file mode 100644
index 0000000..df0de98
--- /dev/null
+++ b/inputs/12.txt
@@ -0,0 +1,1000 @@
+??#??????#..????? 9,2,1
+???##??#?.?#? 5,1,2
+????.????. 1,1
+.?#?????###???. 1,6,1
+????.?#????#?? 2,1,1,3
+??.??.?????#??##.??. 1,1,10,2
+??.?###?#??????? 2,7,2,1
+?????..#??? 4,1,1
+#?????.?#???.#.???# 1,2,4,1,1,1
+??#??#???????.?#??? 1,1,7,1,2,1
+?..??#????#?.? 3,1,2
+..#?????.#.??#.? 1,3,1,1,1
+?#.?.?.??#??#?#??? 2,1,1,10
+???#???.##?#?????#.? 1,1,1,6,1,1
+?.??#?#?#?#?? 1,8
+?#??????????? 2,4
+??????????? 4,1,1
+????.??#?. 4,3
+??###??????? 6,1,1
+?.?.?#???#?. 1,5
+??.?#?..???.???###? 3,1,7
+?????#.????? 3,2
+#???????.??????#?? 1,4,1,2
+?#??????????#??. 1,11
+?.????..?..???##? 4,1,6
+??????#???#?#?.# 9,1
+?#?#??#?##?##?.#??. 10,3,3
+??##?#?##????? 8,2
+???#??#?.?.???? 5,2
+?.??.?..??????.????# 1,2,1,6,3,1
+?..#????#???#??.?.?# 1,1,9,1
+.?#?.?????. 2,1
+???##.???#???#???? 1,2,5,3,1
+??????????#?.?.??.?? 9,1,1,2
+.#.???????.???#. 1,1,5,1
+??.??????##?.? 1,2,4
+?????.??.#?.#.# 1,2,1,1,1
+#?????.???????#.??? 1,2,1,1,2,2
+?#?????..#????#? 6,1,4
+.??????.???#??? 5,1,1
+??????.?#??# 5,2,1
+??.?#?.?#?.#??? 2,2,1
+???#?.#???.?. 4,3,1
+???.?#??##..##??.? 1,6,3
+???##?#?#.#???.?#?. 1,7,3,3
+#.?????#??????? 1,1,1,6,1
+?#.?.???## 2,1,2
+?.???#????? 1,2,1
+?.?#??.?#?#??.#.?#?? 1,1,6,1,1,1
+??.????.??#? 1,1,1,2
+??.#?#??.???#??#?? 1,1,1,1,7,1
+.?.??.#??? 1,1,2
+????????##?#??#?..? 6,1
+?.???#?#.?.?#. 1,5,1,1
+?.??#???.??. 4,1
+???.???.?#.?#??#?.?? 2,1,2,2,3,1
+.#????#.??#? 6,4
+#?????.???##?? 4,1,1,4
+..????#??????????# 10,3
+#????##?#..? 9,1
+?#.?.?#?.? 2,1,1
+?#?.##???????.????? 3,4,2,3,1
+?..?#??##????????# 1,7,1,1
+??.?#.??????????. 1,2,2,6
+?????..?#?????????#? 1,1,8,1,2
+??#???????. 1,4
+?????????##.?????? 1,8,1,4
+#?#.?.??###??#????? 1,1,1,9
+??#????#.??????.??## 1,6,2,2,4
+...#?.?###? 1,4
+#.?#..???#??. 1,1,1,3
+.????.???? 1,3
+.#??..???????.?? 1,1,5,1
+.???????????? 3,1,4
+?..#????????.?.#?? 1,3,1,1,1,1
+???##??.???.#? 2,2,3,1
+??#?#?????????. 7,1,1,1
+???###?#??.???? 9,2
+??#?.??????.??##???? 3,1,2,4,1
+????.???.? 2,1,1
+?..?...#??????#?.?? 1,2
+????#???#?????? 4,1,6
+??####??????.#??#?? 8,2,1,1
+#???????.??.??. 5,1,1,2
+????#?#??? 1,5
+.????????? 1,2
+???????#?. 1,2
+?###..##?. 3,2
+.??#??.??????.??#.#? 2,1,4,1,1,1
+?.??###?#.? 5,1
+???##???#?#?.#?. 11,2
+.??#???..?#?????#? 3,5,2
+???#?#.???#?? 1,1,4
+?.??.??.?? 1,1,1
+???.???#???#?????#? 1,12
+?#??????#?.?#? 3,1,3,2
+?#??.?##???.?.?. 3,5,1
+????.?????# 1,4,1
+.???#???#??#.?.??? 2,5
+##??????.?????? 5,1,1,1,1
+.?##?###??#?? 7,2
+#.????#?????????#??# 1,2,11,2
+?.??.?#???????? 1,1,10
+???#????#?? 2,1,1
+????..??#? 1,2
+.??..????##.? 2,5
+?????.#??? 1,2,1
+?..#.??????? 1,1,4
+??#??#???###?# 5,3,1
+???.?#..#? 1,1,1
+??#?????#??#????##?? 1,2,1,3,1,6
+??????????###??.?. 2,3,3,1,1
+??#???.??? 3,1,1
+????????.? 1,3,1
+?#??.??????.? 2,6
+???.#????..#??#? 2,1,3,5
+????.?#??#? 2,2,2
+??.????#????#????#. 1,1,5,1,1,1
+??#.????##?#??# 1,8
+?#???##?#???.#????. 8,2,1
+#?#????#?#?.#?. 1,8,2
+#??#??##?#???. 1,10
+.?????.??? 5,2
+?#???????.?. 2,1,1,1
+?.##???..??#??###?? 5,1,8
+?.??????#???.?#? 1,7,1
+??.#??????.?.#???#? 1,4,1,1,3
+.?#?????#????# 2,10
+##??????#..? 2,2,3,1
+#?????.??????#?? 6,2,2
+?.#?????#?# 5,1,1
+????.???#????????? 4,12
+???##??.??????? 5,3,1
+#?????#.?.??.#?# 1,1,1,1,3
+??##??#?#? 4,1,1
+???????????.?? 1,3,1,2
+.?????#.??#. 2,2,1
+#.#?.??##????#????? 1,1,1,7,1,1
+?.??#.??????? 1,1,1,2
+#?.?#??#?????.?.? 1,5,1,1
+?.?.??#??? 1,4
+???#??#?.?.????#.#. 7,1,2,2,1
+..???#????????#? 5,1,1,2
+##????..#???? 3,2,4
+?.?.#?#?????.#??#?? 6,1,4
+???.?##???.????.?? 2,4,1,1,1,1
+??#????.?#?. 4,2
+?#???????#?#???#? 3,1,7,2
+????..#???? 2,5
+?#.?????????? 2,1,3,1
+?????.??##?#.#????? 1,1,6,1,2,1
+#??#??..#? 1,1,1
+?????#????#??#???.? 2,8,1,1,1
+.????##?.#????#?. 4,6
+.?.???.#?###.? 1,5
+?.??##??????.#??# 8,4
+?#????#??#. 2,5
+??#??#.#???#???# 1,2,2,1,1
+.#?..???.#??#?????#. 2,1,1,2,5,1
+?.???##??#?##.? 1,7,2,1
+?#??#?#.??.?.? 3,3,1
+??#???#???#????. 11,1
+.###?????????? 4,1,3
+??#??#????..###?.?? 6,2,3,1
+#???.##?.?? 4,2,1
+??.##??#??.????# 6,4
+????#?????. 1,7
+???.???????#???#? 2,1,10
+?????###??.?##?? 1,5,3
+???#.##?#???#?#??? 2,1,8,1,1
+?..?##?.?????#? 1,3,5
+????????????###???? 1,1,2,1,8
+#??.?#?#?.?????#?. 3,1,1,1,1,1
+?.?????.?#??##??# 2,1,3,5
+???##?#??????#.??? 10,1,1
+??.?###?#? 1,6
+???###??????? 6,4
+??????#.?.#??? 1,2,2
+.?.?.??#?????#???#?? 1,1,8,2
+?#..??????#.????. 2,1,2,1,2
+.??#?.????##??#.?.# 1,2,7,1,1
+??###????.???#???? 5,2,2,2,1
+?#???#?#..?? 2,1,1,2
+?.#?#??.???? 3,3
+.???#?.??????###???? 3,9
+????.##?????..#??.? 1,1,3,1,1,3
+????????.??????#? 1,3,6
+????.#.?#?#?????#??. 2,1,11
+#???????#? 1,1,1
+?????##?##? 3,6
+?#???.??##?#?????.# 1,2,7,1,1,1
+.?.#??.??.???##???#? 3,1,9
+#????????#???.??? 2,1,1,5,1
+????#??.?.?#??###?# 2,1,1,1,9
+?#.??..??###???? 1,1,1,5,1
+?.??????.?#.?.?#???. 6,2,1,2
+????#??????? 1,6,1
+#?.??.??#?.??#??? 1,2,1,1,5
+.?##?????#?##??.? 5,6
+?????..####????.? 4,8
+?#?????###???????. 9,5
+?????????#???..? 1,3
+??#?.???.?.?.?? 2,1,1
+???.??????#??#??#. 1,2,1,1,2,1
+.#???###??#???.?#??? 11,3
+?.???.??##?. 2,3
+???#???????##??#? 4,1,5
+.???#?.?????## 1,1,2,3
+?..????##????.??#.?. 7,2
+?#?#.??#???.????#.? 4,6,1,1
+.#??????##??##.?###? 2,2,4,2,3
+?????#???##???.##?. 1,4,3,1,3
+#..???##???##?.??#. 1,5,4,1
+.????#?#..????#??. 6,2
+??#??.???#?####. 2,1,8
+.???.??#?? 1,4
+?#?..????#??????? 2,9,1
+????#??#??#???.?. 6,4,1,1
+???????#.?..?? 5,1,1
+??##?????##.??.????? 11,1,1
+.#?##?????. 5,1
+#.??????#??????? 1,10,1
+??#??????.##???. 1,1,1,1,4
+?????#??#?. 1,1,2
+?.?#?#??.?.#???? 4,3
+#?#.?#.????? 1,1,1,1
+??????????#? 5,1
+??????#?.?##?#?????? 3,7
+.????????.?...? 1,2,1,1,1
+??##???##??#.???? 1,2,4,1,3
+???#?.#????? 1,1,1,2
+.??????.????.??#? 4,3,4
+??????.??????? 1,1,2,2
+????..#??#??? 1,2,1,1
+??#??????#?????.???. 10,2
+?..#???..??..?.? 4,1
+??#?#??#??.#.??#? 7,1,1
+..?#???.?.?????? 5,3
+?.????#???.?#?? 1,2,4,2
+.?#????#??.?? 5,3,1
+.#.????##??????????# 1,17
+???????.???.# 2,2,2,1
+??##?????.??. 7,1
+?.?.????.??? 1,1,1,1
+?.????????.# 1,4,1
+?????#??..#?#.? 1,1,3,3
+?#?.#?##??#?? 1,5,2
+?.??##??#??#???? 5,4
+?.?##?..???###??? 3,6
+??#.??#.??.. 2,1,1
+#?##?????????#???? 1,2,1,6,2
+?.?????.?????#??.#.? 1,1,1,8,1,1
+??.?#?.#?##????#.? 3,5,3
+..??.????????..? 1,2
+.???..????.???..? 3,2,2,1
+?.?.??.???. 1,1,1
+????#?#??????.??.??. 8,1
+??#????????? 4,1,3
+??#??????..#?#?? 2,1,2,3,1
+?#??#.???# 1,1,1
+??#?????#?? 2,4
+????#.?#???? 5,1,2
+??.???#?????.??#??#? 1,3,1,6
+?#.?#.????.#? 1,2,2,1
+#?#??#????.?.??????? 8,1,1,2
+??##???#.??. 4,2,1
+?##??#???.? 6,1,1
+?.#?#.?#??????? 3,5
+?????#???#..?. 1,8,1
+??#..#????.. 2,1,1
+?#????.?#?. 2,2,3
+?.#????#????###?? 8,3
+????...?.?? 2,1
+##.????#?????.?##?? 2,5,4
+.?#????.???? 6,1
+??.?????..???..??? 2,3,3,2
+???????#???#???????? 1,1,8,1,1,1
+.?.???.?#??.?.?? 1,1,3,1,1
+????#.????###.?? 1,1,1,7,1
+?.?##?#???.#???.? 5,4
+????#?...??.##?????? 2,2,1,5,1
+??.???###? 2,6
+??.??.?.?##???. 1,2,6
+???????#???#?.??#??? 10,5
+?.???????#?#??. 1,8,3
+..?#?##?.???? 4,2
+.?##?#?????. 5,1
+?#????#?.??. 1,2,1
+??#?#.???????. 3,3
+???.????#??.# 2,7,1
+????#?.#????????? 5,1,1,1,1
+????##???????? 5,1,1,1
+???#?????..?#? 2,5,3
+?..??##.?????#.?? 4,1,1
+.?#????.???#####?? 4,2,7
+???.?###.???.? 4,2
+?#?????.?#???? 6,4
+???#?.?..????? 5,1,1,2
+??.#??????####??? 1,1,2,1,7
+?.???????#? 2,3
+..#????????#? 8,1
+?#?##?##?##????. 12,1
+?#?.??.?.?# 2,1,1
+.?.?#???#?.????. 1,6,1
+?#???.??.???????? 5,1,1,2
+???????#?#??.?..?? 1,6,1,1,1
+???????#???.. 3,1,1
+..??#?????????? 1,2,6
+??????##?????#???## 8,1,2
+??????.#?####?#?#??# 1,1,1,6,2,1
+#?#????..#?.? 1,5,1,1
+?##???..?#? 2,1,1
+.????#.????.??#?#. 1,2,2,3,1
+?###??????#. 5,1,1
+.?##??#?????...???? 9,4
+?.???#?##?#??? 1,10
+???.?.?#???#???? 2,1,3,2,2
+?????##?##?#? 2,2,2,2
+????#???## 2,2
+??##..#.??.? 4,1,1,1
+??..#?#????? 4,1
+.??#??????#?????#?? 3,3,3,4
+#?#??#?#??#??. 6,1,4
+???##????.?#. 5,1,2
+??????##?????# 7,1,2
+#??##?#?#????#?????? 12,1,1,1
+?.?.???.???. 1,1,3,2
+???#.??#####??##?? 1,1,12
+??#?##.?#.?? 4,2
+?????????.???.??#?. 1,6,1,4
+?.#??.?#.???.?. 1,1,2,1,1
+?.#????#??.??? 6,2
+#?..?#?#???###??#?? 2,14
+????????##?????.?#. 3,5,1,2
+.#??#?..?????#????? 2,2,8,2
+#?????#?????.?.?# 1,1,4,1,2
+???#???????? 1,2,6
+???????.?..? 1,1,1,1
+..?#.?#???.#????#?. 1,3,1,1,1,2
+.??#?????##????##.?? 11,3
+.##?.##???##?#?#??? 3,11
+?##???#.????#??.#? 7,1,1,3,1
+???.??#??#?????????? 1,1,1,10,1
+?#.#??????#????#???# 2,4,3,7
+.#????#?##??#????#? 2,8,3
+????????#???.???#??? 1,5,1,2,1,1
+.#??????#? 2,4
+#?#?????????# 3,5,1
+..??#??.#?? 1,1,2
+??.?#????.??? 3,3
+???#?#?##?#?????? 11,1
+#?????#?##???#?.?.?? 4,8,1
+?#??.?#??. 2,4
+???????..?#?.??? 3,2
+?.##?#?.????##?. 5,4
+???.#???????????##? 1,7,2,3
+.??#?.??#??? 1,1,4
+??.??.?#??? 1,4
+..?????#.?.. 1,1
+??????.???#?#?##??# 1,1,1,1,6,2
+??##?#..#??##?#???.? 5,7,1
+???#?#????#?.#. 1,5,1,1
+.????????? 1,1,1
+?#??????????????? 6,1,1,1,1
+?.?##???..#. 1,2,1,1
+#?#????.#.?????##??. 3,1,1,7
+?????.?#?#??#??????? 1,1,1,6,5
+??..?.??.#????# 2,1,2,4,1
+?##??#??????????.? 9,2,1,1
+#?.#..?#?### 1,1,6
+???#???.???#??#.?? 1,1,1,3,1,1
+?#?????.?#????#???? 3,9
+.??????.??.? 4,2
+?#?#?.?#??#?#???? 4,2,2,1,1
+???.#??#?##??? 1,1,6
+??.?..??.?..#????. 1,1,2,1,2,1
+???#?????. 2,1,2
+.???#??#??? 3,4
+#????#?#???? 1,2,3,2
+??#??.#?... 2,2
+??.?.??#??#?. 2,1,5
+???#??????????? 8,1
+#????#?????# 2,7
+??????.#.##?? 4,1,2,1
+?.?.?#?###??#? 1,1,6,2
+??.?.?#???#???? 1,1,8,1
+?###?..??????.#?.??# 4,5,1,1,1
+??##?#???????##??# 6,8
+???.?????.????. 1,3,1
+????#?????????#??? 9,3
+??#???#??????#???? 10,3
+.??.##?#??#???#??.. 9,2
+..#?#?###???.? 7,1
+?????#??#???#??.?.? 2,6,2,1,1
+??????.???#????.? 1,8
+.?????.#.##? 2,1,2
+?.??#?#??????? 1,4,1,1
+??#???#.?.?#??#? 2,2,2,3
+.?#?..????# 2,1,2
+.??##??#?#??? 4,2,1,1
+?#???#?#?#..? 2,3,1
+.?????###????. 1,5,1
+??.???#???#?# 1,8
+?#?.#?#?#??.?#?. 2,6,2
+?.????#??#???.?? 1,7,1
+?.??...???? 1,2,1
+.#?.?#.?.???? 1,1,1
+.#?##??????? 5,3
+..#?#??.#????#?? 3,7
+?.?#??##?#?????##?? 1,1,7,2
+??????#..?#????? 6,2,2
+??#.??.?..?.???? 2,1,1,1,2
+???..???????? 3,7
+???????.#.??????. 1,1,1,1,6
+?#?.??.?#?#?#??????. 2,1,6,1,1
+.?#??????. 1,1,1
+.?##??#.????? 6,1
+?.?#?.?#.?? 3,1,1
+?????.????? 1,1,2
+??.???????#?? 1,5
+???????#?.???.????? 3,2,1,2,5
+??????????##?????? 2,2,6,1,1
+??#????.?????#?##?# 2,1,9,1
+??????#?#.?.?. 8,1
+?..#?.??##.?.?? 1,2,2,1,1
+??..#??##.?#????#? 1,1,2,1,4
+????#?#..?.#?????? 7,1,1,5
+.#??????????.???.? 6,1,1,2,1
+#?..???.?? 1,3,1
+..?????.??.??# 2,2,2,3
+.??????.???#??.?? 1,3
+..?#.?.????.#?????? 1,1,2,7
+??#?#?.???????.? 3,1,1,3
+????#??????????## 11,1,2
+##??????.???????. 5,1,1
+#????#????#?##? 1,10
+???##???##?#?????#?? 15,1
+????.??????#?#?? 2,7
+???#??..?#??##?? 3,8
+.##?.#.???? 2,1,2
+.?#?????????#?##?#?? 2,1,8,1,1
+???###..?#?..??###?? 5,3,1,5
+?#?.??#?#?. 1,3,1
+??????#?????#??.?.# 1,6,5,1,1
+??????#???.# 3,4,1
+??#?.??.?##.?#? 3,2,2
+????????..??.?.. 1,1
+#???#??.????# 7,1,2
+??????.?#??. 1,1,1,2
+?.#???#???????.? 1,6,1
+#.#.##????.#? 1,1,6,1
+?.?#?????.?#?#? 4,5
+??.?#????? 1,1,1
+.?##?????#.????.??? 7,1,1
+####.#???#.?.???#?#? 4,1,2,6
+???.##??#???##????? 1,1,14
+??????#??#??#?#???? 7,1,2,2
+.#.????##???????? 1,9,3
+#??#?.???##?? 2,2,2
+#??#?.??.? 5,2
+?#?##?#####????#.?# 12,1,1,1
+.?#?#??#??#?????.. 10,2
+?????.???#????? 3,7
+?.????#.??.??.???##? 1,2,1,1,1,4
+?????#??..?????##? 6,7
+?#??#?.???????##? 1,1,1,1,3
+?##?????.#.?#? 8,1,1
+.?#????.??? 4,2
+#????#???#????.?#?? 1,1,8,3
+?.??????#????#???# 1,1,1,7,2
+???????#?#?#?? 2,7
+??#?????.#? 3,2,1
+?#?.??.?..#????.??## 1,1,1,5,1,2
+?????..????????. 2,1,4
+.???#?#??#??#?.???? 13,1,1
+.#?..???????? 1,1,1,2
+??????#??????? 3,9
+??#?.??.?.????#???? 4,1,2,2
+??##??.????#? 3,1,1
+.???##?.?????###. 4,6
+?#.??#???#? 1,5,1
+????.???.????#. 2,1,5
+??.?.?#?????#?. 2,3,2
+?.???##??##.????? 9,1
+..?.??????????#?.??? 1,1,9,1,1
+#?.##??##??#???.? 1,7,1,1,1
+#???.#?.????????.# 3,2,3,1,1
+?#???#?.#?????## 1,2,2,1,2
+.#?##?##??#?# 1,10
+?#?##.????.#?????? 1,2,2,1,2,4
+#..??###????.#? 1,5,2
+.???#??????##???#?? 8,4,1
+?.????#???????????. 1,9,2
+?#??#????##?.??????? 11,1,2
+??#?#.???? 5,1
+#?????.???# 4,1,2
+???#??#???????????? 2,2,1,7,2
+????.???#?????? 1,1,1,1,3
+?????????.???#????? 9,1,3,1
+??????.??.??.???.??. 4,1,1,2,2,1
+???.?#???????#??? 2,4,2,2
+###???#???#??.??##?. 7,5,5
+.?????####???????? 6,1
+????.????? 1,1,1
+?????###??#???? 2,5,5
+.??.???#??.?.???. 2,5,1,3
+#.??#????.???### 1,3,3,1,3
+????????#.? 1,3
+????##??#.?????. 1,3,1,1,1
+..#????#..?#?????? 3,1,5
+??#??#?#???#?.? 2,2,2,3,1
+###??#?????.?. 4,5
+????.?#???.?? 3,2,1
+#??????..??#??????? 4,2,2,1,2
+???#?#?..#??.??? 4,3
+???#????..?? 8,1
+#?.?#?????? 2,2,3
+??#.????.????## 1,1,1,1,4
+???#.?.#?..? 1,1,1,1
+#??#????#??##?#? 6,2,5
+.????.#???. 1,2
+?????.?????.??##??.? 3,1,1,2,4,1
+.?#??#??.?. 2,4
+????????#???..? 2,6
+?#???##???#?.?..??# 8,2,2
+.??#?..#????.?? 1,5
+.??????#???.?#?#. 1,4,3
+????.?????#? 1,1,1,2
+.#.?.?.??? 1,1,1
+#??????.#? 3,2
+?????.#?##?.???#. 2,1,5,2,1
+???#?.?.???##??.?. 1,4
+?##???????? 4,5
+?#?#??#???#??.#?#?? 3,8,4
+##?????#??????? 2,5,1,1
+????.?#??..????##?? 1,1,1,1,6
+????.#???.????#??#? 1,3,1,3,2
+?..???#??###???? 1,1,8
+??#?#??#???? 3,4,2
+#????.??.#?? 5,1,1,1
+?.????##???#?????.? 1,11
+??????..?.?#?.??. 1,2,1,3,1
+?????.?#?? 1,1,1
+.?.????????# 1,2,5
+.?.?.#?#.????. 1,1,1,3
+.???.??#?????#?? 3,10
+???#?#????.?? 5,2,1
+??#.???.?? 2,1,1
+??###??????.?#?? 11,3
+??.?????????#?. 2,2
+.??#?#??##???????.# 12,1,1
+.##??????????.. 3,1,1,2
+?????##.?#??.#?.??# 1,1,2,1,1,3
+.??..???#??#??.# 2,1,1,2,1
+??#.?#.#?.?##?#?#??# 2,1,1,6,1
+?.??.??#??? 1,1
+#?##??.?##?#?#?#?? 5,10
+.??#?.#??#. 1,2,1
+?#??????#?.?? 1,5,1
+##???..???#?..?????? 2,2,4,3
+??.#????.#?? 1,1,2,1
+?.?#.???.???? 1,1,2,1
+.???##?..?..?#?.??? 3,1
+?????????.##????.??. 7,4
+##???#?.??.???. 3,1,2,1
+????????#..#?.?##?.? 9,2,3
+?.??.?..?#. 1,1,1
+???????.?##. 5,1,3
+#?#.#.???????????##? 3,1,6,6
+?.??#??????? 4,3
+??#?##???.##? 8,2
+???.???.#????.#?.? 2,3,3,1,2
+???????##???? 2,2,4,1
+????##?#???? 1,7,1
+##??..???? 2,1,1
+?#??..??.? 3,1
+?.??#??#..????.??? 3,2,1,1,3
+#?#..#?????#??.? 3,1,5
+?????.???????#??. 1,3,2
+?.?#????.?? 4,1
+?#???#????????#? 11,1
+#????#.#??#????#?#?. 1,3,6,3
+?????##?.##??.? 2,3
+??.??#??..??? 4,2
+?#?#???#??#??##????? 1,8,4,1
+?????.?.?. 2,1,1
+?.?#..???##??.?. 1,1,5,1
+??##???#???#?#.?.?. 1,8,1,1,1,1
+?#???#??????.???#??. 10,2,2
+#?.???#??#?.?????? 1,7,4
+???????##?#??? 1,1,8
+??.?????##?? 1,1,5
+??#??##??##?????##?? 2,2,9,1
+?.?#??#?##?.???????? 8,7
+???#?#?#?#??????.?? 2,1,11
+.????????..?? 1,1,2,1
+?#??#?.??.?#? 4,1,1
+???.?????#.?#??.. 6,3
+#..?#???????. 1,8
+?.???##?##?##??#?..? 14,1
+?.???..??.??##?? 2,2,2
+????#.#?.? 1,1,2
+??????#??????#??? 1,4,1,4
+?????.?.??. 4,2
+?##??..#?.? 3,2
+#?.??#.?##??#??#? 1,1,1,8
+??#??##?##?#?#?..? 2,10,1
+??????##??????.???? 1,10,1,1
+?????...?# 3,1
+?#?.?#?#?.?# 3,1,1,2
+.#?.?#.?#? 1,1,2
+??#????????#???.???? 13,1
+.????????###????#. 2,1,8
+???.?##??.??????# 1,5,1,2
+????????.?? 1,5,1
+??.?#?##???#?#.. 5,3
+.#????????#?#? 3,4,4
+???????.??#??? 4,4
+##..????##?.?.?. 2,2,4,1
+?.???????#?#.????#? 10,4
+.?????#??.????#??. 5,1
+?#.##??#?????. 1,7
+?????????.????? 6,1,2
+.?..????#? 1,4
+?.##???????#?? 1,3,5
+??#?????#??#?#?????. 2,11
+.?.???????## 1,6
+#???..?.?.?? 3,1,1,1
+##?????..??? 2,1,2
+#?.??.???????#.???? 1,1,1,2,2,4
+?#?#?????.?.?? 4,1,1,1
+?????#?#?.???.?.? 8,1,1,1
+??###?#??????.?.#?. 10,1
+?#????.?????.?? 1,1,4,1
+?#?#???##?#??#??#.# 1,1,7,4,1
+#.?????#????? 1,1,6
+?..#??.???. 1,2
+????#?#??.???. 1,5,1
+.???.?????#?##?..? 1,8
+#??#?#???????.#???#? 6,4,1,1,1,1
+.?.##?.?..??????? 3,5
+??.#???.#?#?.???#??? 1,4,3,1,1,2
+.##?.??.?## 2,1,2
+?##.??#.?#???#? 3,2,1,3
+.??????#?????? 8,2
+#..?????#????#.?#?#. 1,6,1,1,2,1
+.????.??.?#?? 2,2,3
+?#?#???????####.?#? 3,1,4,3
+?#.????#.?.??? 1,1,2,2
+???????.?#??#????? 1,1,9
+.#?##.????? 1,2,3
+???#??#?.??.?. 8,1
+..??#??.???#???.? 4,4
+???#??##???##??????? 13,1
+?????#.?????#???#? 1,1,1,1,4,1
+????##????.??.?##. 6,3
+#???.#?.?#? 1,1,2
+##???????#?#.???? 10,1,1,1
+??#??##??#??.??.?.? 10,1
+?#??#?#????#????? 1,9,1
+#???????.##?.?#???? 2,1,3,2,2
+?###??#?#?.#..??? 10,1,1,1
+??##??.?????.??. 3,1,1,1,1
+??#.?#???.?? 1,5
+?##?#????##??#? 10,1
+???#??????##?#???? 2,10
+???#?.??#??? 1,1,4
+???#?#????##?#?.?? 13,1
+?#??????????.??. 2,4,2
+?#.?##?#?? 1,4
+????????..? 1,1
+.??##?#???? 5,2
+?##???#????###? 3,5,4
+??..?.???????##?? 1,1,8
+??#?##?????##??. 8,3
+.##?..#?????##...? 3,8
+????????#??.???# 10,1,1
+.??????#?????. 1,1,5
+?????#???#. 1,3,1
+#.?#.??#.???##.. 1,1,2,4
+??#.?.??#? 3,1,1
+?.?.##??#??#.?.# 1,8,1,1
+??????##?#?#? 1,5,1,1
+??????#?????..????? 3,3,2,5
+?##?????#.? 5,1,1
+??????.??#.##???? 2,3,3,1
+####???????#??#?# 6,1,5,1
+.??#??#.?#.????##??# 1,1,1,2,1,6
+#?#?#?#????????.?? 9,4,1
+???###?##??.???. 1,8,1
+???##???#??#.??? 2,6,2,1
+???.??#????? 1,6
+..?????#?. 1,1,1
+#?#??.#????#? 5,6
+.????#?????#?? 5,1,1
+??.??.??#.??????.# 1,1,3,1,1,1
+???????..#?#??#. 5,6
+??.???###??##?????# 1,1,12,1
+???.??????#?##?. 2,10
+#????????.?..#.#.? 2,5,1,1,1,1
+.?#???##.???#????##. 7,1,1,2
+???????#???.##???# 2,1,1,6
+?#???#???.?.?? 2,4,1,1
+?.?.?.???.???.???? 1,1,2,1,2,1
+?#??????.?#????#???. 4,1,1,1,1,1
+??#?.##???? 1,1,5
+?????#???# 3,1,1
+.????.????#.. 3,1,2
+???????#?.??##.???.? 5,2,1
+?????????#?. 8,2
+????#?#?.?.??##????? 1,5,1,1,4,1
+?#.?#????####??#.? 2,12,1
+?.?##..????#? 3,5
+???#???#??? 1,6
+??###???#????#.????? 1,7,1,1,2,1
+??.????.?? 1,1,1
+????.?##?#?## 2,7
+.??????#???. 2,5
+???##????#?#..## 1,2,4,2
+.????.?##?? 1,1,4
+#.??#?#.????.?.. 1,5,3,1
+#.??.?#?.?#??. 1,1,1,3
+???#??????#.?#?? 6,1,1,2
+??.?.?#?.?? 1,3
+?#???????#.? 4,1,1
+?..????##????????.? 1,5,1,1,3,1
+#..?#.?#??#??#??##?? 1,2,2,9
+#??#?##??..??. 1,5,1,2
+?#?????#????#??#..?? 2,12,1
+??#.???#??????? 3,2,3,1,1
+.?????.#????#???? 3,9
+???.????#??????.?# 1,2,1,4,1
+??.???.?#?# 1,3,4
+#????????#??#..?#.? 4,8,2
+????#?#?#??????????? 9,6
+#???????#???#???.?.? 1,1,1,9,1,1
+?????#?#?#??????. 1,9,2
+?#????..?#????# 1,1,1,7
+#?????????### 5,1,3
+.#?????????? 1,3,1,1
+?.?##???????#??#..?# 7,1,4,1
+?#???????##??##?? 3,11
+.????.#??.?#?#?#?.#? 2,1,1,1,7,1
+???????#?.. 2,2
+??#?#.?###??##??#?? 1,1,1,8,1,1
+??##.?????????#?? 1,2,10
+.?????.?#?. 1,1,2
+#?????#??#???#..# 1,1,6,3,1
+?#????#???.?.#?. 1,1,4,1,2
+??#???##??.????#? 8,5
+.????.?????#??. 4,1,4
+????.??###?. 3,6
+????.#???.? 1,4,1
+??#???#????###?.. 3,8
+.?#???????###??.## 13,2
+????.#.????#??? 1,1,1,1,2
+#??#?????.? 4,1,1
+#?#.???????.? 3,3,1,1
+.????????.??. 3,2,1
+??.?.??.??##?????? 1,1,1,9
+?..?#??#?#??#.?? 1,7,1
+??.???##??#?.?? 2,5
+.????#.??????? 3,1,2,3
+??..??????#? 1,1,2,2
+??#??.????# 1,3
+??.???????? 1,6
+??.?.?????????.???. 1,6,3
+#???###???.#??? 1,6,2
+?.#???#??????# 2,4,1
+??##.???#??.????##. 2,5,6
+##.?.????????# 2,1,3,1
+#?##.??.#???? 4,4
+????#????..?#?? 5,3
+.??##?#???.?.???? 9,1,1
+???#?#?#?.?.?.. 8,1,1
+#????##???#???#???.# 4,2,7,1
+.?.???#.?##?????# 1,1,2,3
+#?????????#???..#. 5,8,1
+???#??????#?..??? 5,3,2
+???#?????? 4,1,1
+?.???#????####????#? 1,3,6,1
+????#?.#???.??#??? 1,1,2,1,5
+##????#?..???? 7,2
+?#??.?.??#?..???#? 4,1,1,2,5
+.##????????..?? 6,1,1,1
+????????.#????. 1,1,1,1,2
+??????????#??.?????? 3,4,2,1,1,1
+?#?.??????.? 1,2,2
+.?.?#????#???? 2,1
+?.?#????.?? 1,6,1
+.?##???.?????. 2,2,4
+#.????##?? 1,7
+??#???##?#?? 2,6
+.?.?#????. 3,2
+?#??#?#.?.?##???? 6,1,4,1
+?????.?.???#??????? 1,1,1,5,3
+.#???????.#? 5,1
+????..??#???#?. 3,8
+?#??#???.?#?##.?? 7,4
+?#????#..#????????? 2,1,1,4,1,1
+...?#??#?.#?? 3,2,2
+###???#?.???? 4,2,3
+???#??????..?##? 4,4,4
+????.????#? 2,1
+????##?#???.???? 7,1,1
+?????????.?..??. 3,2,1,2
+#?..#????? 1,1,2
+##???#????#?.???.. 7,2,1,1
+??#????????#?..?##?? 11,3
+.?#?..#??##???.. 3,8
+##?#????#.?#?.#???## 2,2,3,2,2,2
+???#???????????.? 1,3,5,1,1
+#.????????#? 1,1,1,3
+??.?.??.?.?.??????? 1,2
+???.#???????#??## 1,3,8
+..?#??.??##?????. 2,5
+????.?????????? 1,1,2,2
+#????.??#? 5,2
+?.#??#????#?????.?# 5,5,1
+?.?#??#??? 4,1
+????????.????.? 8,2
+????.?#?????. 1,1,3,2
+???#??.?#??# 5,5
+????#.?#?.##??????. 1,1,3,5,2
+.?#??.?#?#?????. 4,4,2
+??..?#?#????.#? 6,1
+.?.#.?#????#???#?##? 1,1,15
+#.?????##.? 1,5,1
+.##?????.????????? 5,2,4
+???.???.##???#.?#?? 1,1,1,6,4
+???#??#?????# 1,2,4,1
+#???.##??##????? 4,9
+???...#?...???# 1,2,3
+##?#?#????.# 6,1,1
+.??#??..????.?# 2,1,1,1,1
+##??#???????#.??# 5,1,1,1,2
+.#???#?????##.??#?. 1,3,1,1,2,3
+??????#???? 2,3
+?.???#??#? 1,2,2
+?#??.##?????#? 2,2,1,2
+??#.??#?.??.#?#??? 3,3,1,1,1,1
+?.?##?.?.???#?#.? 1,3,1,4
+??.???#?###?#.? 1,1,6,1,1
+.?.#?????#?.?????? 1,3,3,2,1
+?#?#?####..#.? 8,1
+???##?#????.??#??#?? 9,1,3,3
+??#????#?.??#?. 1,7,4
+???#..?.?? 1,1,1
+?????#????.??###? 6,1,6
+.#?????#?????.??# 1,5,1,1,2
+???#????..???#### 3,7
+???????##..? 1,4
+.??.??.???... 1,2,3
+.??.#?#?????#? 1,9
+???#???.?????? 1,4,2,1
+??.?#.?.??.?#???#?? 2,1,1,8
+##.##?????????#.?? 2,2,7
+???###??##?..??.??? 5,3,1,2
+#..????#?#???? 1,1,4,2
+???????????#? 2,2
+??.?##?#????????#??# 1,8,2,1
+????#?#???????????? 7,1,1,2,1
+.#??.?#??.# 1,2,1
+?#???????? 2,1,2
+?????#??#???.??? 1,4,1,2
+?.?????.?.????##? 3,7
+???..#???#???#??. 1,2,7
+???.#??#?#???#.?? 1,1,8,2
+###?##?.???#??# 7,5
+.???.?.??#? 1,1,2
+??#??.???# 2,4
+??###?????. 6,1
+???#?#????.?.?#.?.# 4,5,2,1,1
+.??????.?#...?#??. 2,1,3
+.??#.??#?? 1,2
+??#??.?#??#? 1,1,1,4
+.?#?#?..#?.??? 5,1,2
+#??#?##?#?..?#??? 1,7,1
+#???????## 2,3,2
+???.????##??#?#?.#?? 1,11,1
+#.?..????#?#??..?#? 1,1,9,1
+.?.?????#??? 1,4,1,1
+.???.???..#?##??? 3,1,5
+??..????.???.?# 1,4,1,2
+???????#?? 1,1,3
+.????????#??#.??. 1,9,1
+?.?.#????.#????????. 3,7
+????#??#??????.??.#? 8,3,2,1
+?????.#???..???#??? 2,1,4,4,1
+??#????..?.? 5,1
+???#?#?#????.?##???? 11,7
+?????????????#??? 4,10
+?.??#...?#???.?.. 1,3
+.????...???#...? 1,2
+??#?.#.?????##? 3,1,1,1,2
+????#.??#?.#. 1,1,3,1
+#.??????#??##??#???? 1,17
+###????.#?? 5,2
+??????????#.?.?...?. 10,1,1
+#.#.#.???##??#??.# 1,1,1,9,1
+.??.??.#?. 1,1,1
+?#???.???##??#?#? 1,1,1,8
+.??##?#??????#???## 9,3,3
+.???????#? 5,3
+.????###??#?.???? 9,2
+#?##??????????? 7,3,1
+???..#?#???#???.? 1,9
+??#.???#.# 2,1,1
+#.?#??.#?.?? 1,3,1,2
+.#??????#???????. 2,4,1,2
+..??????.??? 1,2
+?##???.??.??#???. 2,2,1,3,1
+.?.?##???#.?? 3,2,1
+..???????? 3,1
+??.??#????????#?#? 1,1,1,1,5
+#?.?#.###??##??????? 2,1,9,1
+.#?????.??. 2,1,1
+.??.??#????## 2,4,2
+?#?#?#?#?###?..?? 12,1
+??#??.??#???? 3,2
+#??#??????.?????? 1,1,4,1,1
+#??#???#??.????#??? 4,2,5,1
+???????.?#?? 5,1
+?.#??#??#????#???.? 8,6,1
+.?##?#?.?.?? 5,1
+??###??????##??. 5,4
+?#?#.???.??# 1,1,2,2
+.???????.?#?... 3,3
+??.?#?????.?.??##?#? 1,1,3,1,7
+?#.???????.???#? 2,1,1,1,2
+.??#?????. 4,1
+????.?#???.??????.. 2,3,1,5
+.??????.#? 1,2
+.??.???#?.? 2,3,1
+#?##?.?.???.## 5,1,1,2
+.##????.?? 4,1
+#??.?#???.?##?... 1,1,4,3
+?...##??.? 1,2,1
+?###..#??? 3,1,1
+?#?##?#??##??? 1,8,1
+.??###??.?#?.???###? 4,3,5
+?.??????#?##???? 1,1,9,1
+?????#??.?????? 7,2
+.???#????#???#? 6,2,3
+????.????.?#?..??? 3,4,3,2
+????.#?.???#?? 1,1,2,6
+?.#???#?#?.?#?? 1,5,2,1,1
+?#?.#.???????.?? 1,1,1,3,1
+?#?????????????? 3,1,2,1,3
+???.#??#?#???# 7,1
+??#????#???.##??#. 8,1,5
+???#?????#??.? 2,5
+.#????.???? 5,1
+??????#?????###?? 5,3
+?..??#???.????? 1,1,1,2,1
+#??.?...?.??. 2,1,2
+?#???#?????.#??? 2,1,1,2,1
+?#?????????.??????? 2,3,1,3,2
+.?#???????? 2,2,1
+?#??.?.?.?.? 3,1
+?##?..????#?? 4,1,4
+???#?..???????# 1,2,7
+??#??##?.??????.?? 2,2,1,1,1,1
+.#?#...#?????? 3,1
+.??..??##? 1,4
+?????##??.??##?.. 6,5
+#?..?#???.?? 1,3,1
+?##??.?.#?#????? 3,1,3,1,2
+.?#?????..#?#..?? 7,3,1
+????????##?##.?#.#?? 1,1,1,7,1,2
+???..????.?.???##?? 2,2,1,1,2,1
+??????.??????.# 3,1,2,1
+#.??#????.??#?? 1,3,1,1,1
+??#####??#?????#?# 10,3
+##???###?#????? 12,1
+????????????? 2,5
+??#??.????.?##? 2,4,2
+?.?#???.#?#.???#.. 1,4,3,2
+????#????#? 2,2,2
+???.#?.?#????? 1,1,2,6
+?.#???#?????#?????. 5,5
+??????#??#??? 1,7
+??.??????#???#?????# 1,1,7,3,1
+#?..?????? 1,3
+??#???..???.# 3,2,2,1
+?###?????? 6,1
+???##.#??#?? 1,3,1,3
+???##??..?#?#??? 3,4
+??????##??.?????#? 9,1,5
+?#???#?.?#???? 5,5
+??.?.???.?? 1,2
+??##??#?????# 2,7
+???????.???????##?#. 1,1,1,1,7
+#?#????#???.##.? 8,1,2,1
+???#.??###??..#?#?? 1,1,4,1,1,3
+.?.??###???#?.?????? 7,1
+?#?#?#???????.?#? 5,2,3,2
+???##???.??????#? 1,3,1,1,5
+???????#?#??.? 1,2,5
+????#?.??? 2,1,1
\ No newline at end of file
diff --git a/inputs/12a.txt b/inputs/12a.txt
new file mode 100644
index 0000000..c5bec3a
--- /dev/null
+++ b/inputs/12a.txt
@@ -0,0 +1,6 @@
+???.### 1,1,3
+.??..??...?##. 1,1,3
+?#?#?#?#?#?#?#? 1,3,1,6
+????.#...#... 4,1,1
+????.######..#####. 1,6,5
+?###???????? 3,2,1
\ No newline at end of file
diff --git a/src/12.cs b/src/12.cs
new file mode 100644
index 0000000..98ff3fa
--- /dev/null
+++ b/src/12.cs
@@ -0,0 +1,222 @@
+using aoc2023.Util;
+
+namespace aoc2023;
+
+internal class Day12 : Day
+{
+ private readonly List<(string puzzle, List slots)> springList = [];
+
+ internal override void Parse()
+ {
+ var lines = Parsing.ReadAllLines($"{GetDay()}");
+ foreach (var line in lines)
+ {
+ var split = line.Split(' ');
+ var nums = split[1].Split(',').Select(int.Parse);
+ springList.Add((split[0], nums.ToList()));
+ }
+ }
+
+ HashSet GeneratePossibilities(string input)
+ {
+ Queue possibilities = new();
+ possibilities.Enqueue(input);
+ while (true)
+ {
+ var p = possibilities.Peek();
+ if (!p.Contains('?'))
+ {
+ break;
+ }
+
+ possibilities.Dequeue();
+ for (int j = 0; j < p.Length; j++)
+ {
+ if (p[j] == '#' || p[j] == '.')
+ {
+ continue;
+ }
+
+ possibilities.Enqueue(p.ReplaceAt(j, '#'));
+ possibilities.Enqueue(p.ReplaceAt(j, '.'));
+ break;
+ }
+ }
+
+ return possibilities.ToHashSet();
+ }
+
+ bool IsValidString(string p, List springs)
+ {
+ int group = 0;
+ int count = 0;
+ int i;
+ for (i = 0; i <= p.Length; i++)
+ {
+ if (i == p.Length)
+ {
+ if (group >= 0 && group < springs.Count && springs[group] == count)
+ {
+ group++;
+ count = 0;
+ }
+
+ break;
+ }
+ if (p[i] == '#')
+ {
+ count++;
+ if (group >= 0 && group < springs.Count)
+ {
+ if (count > springs[group])
+ {
+ break;
+ }
+ }
+ continue;
+ }
+
+ if (p[i] == '.')
+ {
+ if (group >= 0 && group < springs.Count)
+ {
+ if (springs[group] == count)
+ {
+ group++;
+ count = 0;
+ }
+ else if (count > 0)
+ {
+ break;
+ }
+ }
+ }
+ }
+
+ var isValid = i == p.Length && group == springs.Count && count == 0;
+ return isValid;
+ }
+
+ long GetValidStrings(HashSet possibilities, List springs)
+ {
+ long total = 0;
+ foreach (var p in possibilities)
+ {
+ if (IsValidString(p, springs))
+ {
+ total++;
+ }
+ }
+
+ return total;
+ }
+
+ long Solve(List<(string puzzle, List slots)> list)
+ {
+ long numMatching = 0;
+ foreach (var line in list)
+ {
+ HashSet possibilities = GeneratePossibilities(line.puzzle);
+ long thisValid = GetValidStrings(possibilities, line.slots);
+ numMatching += thisValid;
+ }
+
+ return numMatching;
+ }
+ // all of the above was my original implementation that worked for part 1, but was far, far too slow for part 2
+
+ // this is a solution very heavily cribbed from a post on the subreddit as i was just not understanding how to
+ // optimize my existing solution appropriately.
+ long GetPermutations(string row, List pattern)
+ {
+ Dictionary<(int group, long amount), long> permutations = [];
+ permutations.Add((0, 0), 1);
+
+ foreach (var ch in row)
+ {
+ List<(int groupID, long groupAmount, long permutations)> next = [];
+ foreach (var kvp in permutations)
+ {
+ int groupID = kvp.Key.group;
+ long groupAmount = kvp.Key.amount;
+ if (ch != '#')
+ {
+ if (groupAmount == 0)
+ {
+ next.Add((groupID, groupAmount, kvp.Value));
+ }
+ else if (groupAmount == pattern[groupID])
+ {
+ next.Add((groupID + 1, 0, kvp.Value));
+ }
+ }
+
+ if (ch != '.')
+ {
+ if (groupID < pattern.Count && groupAmount < pattern[groupID])
+ {
+ next.Add((groupID, groupAmount + 1, kvp.Value));
+ }
+ }
+ }
+
+ permutations.Clear();
+ foreach (var tuple in next)
+ {
+ var key = (tuple.groupID, tuple.groupAmount);
+ if (!permutations.TryAdd(key, tuple.permutations))
+ {
+ permutations[key] += tuple.permutations;
+ }
+ }
+ }
+
+ long total = 0;
+ foreach (var kvp in permutations)
+ {
+ if (isValid(kvp.Key.group, kvp.Key.amount))
+ {
+ total += kvp.Value;
+ }
+ }
+
+ return total;
+
+ bool isValid(int groupID, long groupAmount)
+ {
+ return groupID == pattern.Count || (groupID == pattern.Count - 1 && groupAmount == pattern[groupID]);
+ }
+ }
+
+ internal override string Part1()
+ {
+ long total = Solve(springList);
+
+ return $"<+white>{total}";
+ }
+
+ internal override string Part2()
+ {
+ List<(string puzzle, List slots)> unfolded = new(springList.Count);
+ foreach (var folded in springList)
+ {
+ string puzzle2 = string.Empty;
+ List springs = new(folded.slots.Count * 5);
+ for (int i = 0; i < 5; i++)
+ {
+ if (puzzle2.Length > 0)
+ {
+ puzzle2 += "?";
+ }
+ puzzle2 += folded.puzzle;
+ springs.AddRange(folded.slots);
+ }
+
+ unfolded.Add((puzzle2, springs));
+ }
+
+ long total = unfolded.Sum(item => GetPermutations(item.puzzle, item.slots));
+
+ return $"<+white>{total}";
+ }
+}
diff --git a/src/Util/Extensions.cs b/src/Util/Extensions.cs
index cec054b..52664d6 100644
--- a/src/Util/Extensions.cs
+++ b/src/Util/Extensions.cs
@@ -24,4 +24,22 @@ public static class Extensions
return -1;
}
+
+ public static string ReplaceFirst(this string str, char ch, char replace)
+ {
+ for (int i = 0; i < str.Length; i++)
+ {
+ if (str[i] == ch)
+ {
+ return str.ReplaceAt(i, replace);
+ }
+ }
+
+ return str;
+ }
+
+ public static string ReplaceAt(this string str, int index, char replace)
+ {
+ return str[..index] + replace + str[(index + 1)..];
+ }
}