From 0b8e14d18f54006edfb8f63e180aa27a0712cc29 Mon Sep 17 00:00:00 2001 From: artemtam Date: Sun, 17 Dec 2023 17:12:27 +0100 Subject: [PATCH] feat(day-12): parts 1 & 2 --- src/day-12/input.txt | 1000 +++++++++++++++++++++++++++++++++++ src/day-12/solution.test.ts | 14 + src/day-12/solution.ts | 128 +++++ 3 files changed, 1142 insertions(+) create mode 100644 src/day-12/input.txt create mode 100644 src/day-12/solution.test.ts create mode 100644 src/day-12/solution.ts diff --git a/src/day-12/input.txt b/src/day-12/input.txt new file mode 100644 index 0000000..183cded --- /dev/null +++ b/src/day-12/input.txt @@ -0,0 +1,1000 @@ +##????????#?#?????? 4,1,8,2 +?.#??????.#????#?? 1,1,1,1,1,7 +.#??.??.????###????? 1,1,2,8,3 +??.???#???? 1,4,1 +?????.??????##. 2,3,3 +.??#??.??# 3,2 +?.#?##??#.?#????? 1,5,1,2,3 +?.###??.??#?????? 4,8 +?#?????#??? 2,1,1 +???????..??#?. 3,1 +??#??###.????#??.??? 1,6,2,3,3 +???????#?????#..?? 5,2 +....#?##????.??#?? 4,1 +?#??.?.?#????? 2,1,4 +?#?##????#??.#?# 5,4,1,1 +..?.????#?????????? 1,1,1,1,1,4 +?.????#???? 4,2 +??.#???.????? 1,3,1,1 +.?###???????.?## 4,2,3 +#??.?##????#????? 3,8,2 +?#.???.?#? 2,1,2 +?#???.#????.?? 4,2,1,2 +.???.??.#?????#?# 1,1,4,1,1 +??..??????# 1,1,1 +.#???..#?. 1,1,2 +.?##????????###?. 2,1,2,5 +.?#???#????#? 1,1,1,3 +#...?..?????..#. 1,1,3,1,1 +#?#?#?.?#?????# 5,3,1 +#.##???...?#.? 1,5,1,1 +????????##?. 2,2,3 +??.??.??#??# 1,1,2,1 +???#?#.???.????.? 4,3,1,1 +?#?????#?#??.??? 2,7,2 +#????????.??.?##..## 1,2,1,1,3,2 +???.?.?#??##????? 2,10 +???.????##?.??? 1,2,3 +#??.??.?????? 1,2,1,1 +.??????.??#?????? 1,1 +????.?.??.?#?#?.??? 3,1,1,1,2,2 +?#??????????#### 5,1,6 +.??.???... 2,2 +.#???#??#???#???? 1,1,1,8,1 +#?#.???#???#?#.????# 1,1,10,1,1 +#.?.????.#????? 1,4,1,4 +?#???#??##???? 1,7 +#??.??.???#?#? 3,1,6 +#?#?.?????. 4,1,3 +?#.#???.????? 1,3,5 +..?.??##?#??????##?? 1,14 +?????##?###.??. 1,6,1 +?#?.?????##.# 2,6,1 +?#.????..?????#. 1,1,1,1,3 +?#????????????? 2,1,1,1,2 +?#..????????????? 2,2,7 +#.#??#??#?????? 1,12 +?#??#.##??? 4,4 +?#?.?#?#?. 1,4 +??.?#????#??#??.#?? 1,8,2 +..#?????????? 3,3 +?#..#?.?#?#?????? 1,1,2,5 +??.??..?????? 1,1,2 +???#???#.????# 6,3,1 +????#?.??#??.? 1,1,4,1 +?#?#??.????..??? 1,1,3,2 +???#??#???.??#???#? 1,8,1,1,3 +?.??????..#??? 1,5,1 +??????.?#??? 2,1,3 +.?#??????.?#####? 3,1,6 +#?##??.##??????? 5,8 +??.#?.??#?####? 2,7 +????#???#?##.????? 4,4,1 +????#?#??????#??? 1,3,1,1,4 +??..???.???##??#.??# 1,3,4,2,1 +#???????..????#??? 3,1,2,7 +?????.#?????? 1,7 +#??#?#????#???.?? 1,6,2,1,1 +????##?????##?????. 2,3,2,4 +?..#??#??##. 2,1,2 +?.#??.##??#????#?? 1,11 +?????#????.?????##?? 10,5 +?##?.?????.??? 3,3,1 +???.??#??#?#? 1,7 +?.??.?????? 1,1,3 +??#??.??????.?. 3,1,2,1,1 +??????.?##??????#? 2,3,9 +..??..##.??? 2,2,3 +#?#?#?##..?.#?#?#?.? 3,4,5,1 +?#????#????.# 7,1,1 +?????.?#.?#????#??? 1,2,7,1 +??..?.??????????. 3,1 +??.?#?.?.#??#? 2,1,5 +?.???#?????#???#.??? 1,7,2,1,1,1 +????.?????#???#?# 1,1,12 +??#?????##??#????. 1,9 +..?#.??#?#?????#?. 1,9 +.???????#??? 2,4 +???..?????? 3,1,2 +.#?????#????#? 1,5,2 +.?#??#???? 1,3 +????.??##??.???? 1,1,3,1,1 +?.?..???????. 1,1 +???.?.?.?? 1,1,1 +???????..???#??. 5,1,4 +???????##??. 1,2,3,1 +?.??.?.?????##???? 1,8 +???#?.?#???#??? 4,3,2 +#.##????## 1,3,2 +??##????#?#??????# 9,5,1 +??#???.#???#?#??? 1,1,1,9 +??#?????#??#? 5,5 +??????#...????#?.? 6,5 +??????##??#? 1,1,7 +.?????.???? 1,1,3 +???##?#####?????# 11,2 +?.?.?#?#????. 1,5,1 +..???????? 2,2 +?????.?#?.####? 2,2,2,5 +.??#.?#?#... 3,4 +???#??#?.???????? 7,4,1 +.??????????????#??? 1,7,5,1 +.??##??..?###?#??? 3,8 +??#??????.?##? 6,3 +?###?#?????.????#?#? 10,4 +????#.????????????? 1,1,2,3,3 +.#.???##??#??? 1,6,1,1 +??##..??#?#??# 4,1,1,4 +.??#?????? 3,1,1 +#???.#?.??#??????#?# 3,2,5,4 +???.??##??? 1,6 +.?.???.??#???...???? 2,1 +???#?#?????????.#? 1,2,2,1,1,1 +?#??????..#?. 3,1,1 +?.???.?#?#. 1,3 +???#?????.#?# 6,1,1,1 +???.#??????#??#?.. 2,3,6 +?????##?#??#????. 1,9,1 +??????#.#???#?#?. 6,2,4 +????#???#????# 11,1 +#??.??..##.???????#? 3,1,2,1,6 +.#???#??#?#??????.?? 15,1 +?????#????#?????##?? 1,1,11 +?#.??#?#?? 2,2,2 +.??#??#???###?????? 1,12,1,1 +.???.?.??? 3,2 +?????#.#.??.#.???? 2,3,1,1,1,3 +???#??..#????.????.# 1,2,1,5,3,1 +.?##????#???#??#?? 9,4 +???.?#???????## 1,4,1,2 +?..????????.? 2,1 +?#???#?#??? 1,5 +.????????#?. 6,2 +??????????. 4,1 +?#????#???#?.. 1,1,1,3 +##.#????.# 2,4,1 +#?#?#??.?#?# 3,3,3 +?????..?.??#?#?.??. 2,1,5,1 +?#???##????????. 1,5,3 +##????.?.###.? 2,1,3 +??##???.?#??##. 7,5 +???#.????.?#?#? 4,1,3 +??#???#?##??# 2,1,4,1 +??.#????#?#?? 2,1,5 +.????.???#?.# 4,1,1,1 +???????#???# 1,1,1,1 +??.?.?##?????? 1,3,1 +?.?#??#?##??? 1,4,3 +??.#?..#?????? 2,2,4 +..?.????#????? 3,2,1 +???.?#?????? 1,1,1,3 +.##?#???#?????.? 5,1,2 +?.??.??.??? 1,1,2 +?#???#???##??.??#? 12,1 +????.#??.???#?? 2,1,1,1,3 +.???##????#.#?.??#? 1,5,1,1,1,2 +.?.?#????????##? 6,5 +.??????##??.??#??.? 5,3,1,2 +#??.???##? 1,1,3 +#???????#????.?#??? 1,1,1,7,1,1 +.#?#??.#?? 3,2 +?????#??.??????.#. 1,3,3,1 +???????#??.?.? 1,4 +?#.???#?.?? 1,3,1 +???????#????.?#??# 9,4 +??????????####.#?? 3,8,3 +???..?#???#???????? 3,14 +..#?#??#??#?? 7,2 +?????.?#??.? 1,1,1,1 +??#???#?.? 3,1 +???.???#?? 1,4,1 +#?????.?.?#?.??..? 6,2,2 +##??????#?? 6,3 +##?.#....?.? 3,1,1 +.?.?#?#???#? 1,8 +##???#.?..#?#? 6,1,3 +#.???##?.?.?# 1,5,2 +?????.??#??##??.?.. 4,7 +.?#??#???#?#???# 3,2,6,1 +??????.#?????#?#? 1,2,1,1,3 +??.????.?? 1,1,1 +???#??.#?##.?? 3,1,2,1 +????#????? 3,2 +??#???.#????#??? 1,1,1,1,6 +?#????????.??? 2,5,1,1 +?????????.?##? 4,3 +.??.#??##. 1,2 +.#???#?#?#?.???.??? 9,1 +.?#?#???#.? 1,5,1 +?###?.??#?.??? 4,1,2,2 +??.??.??.### 1,1,1,3 +.?##??????.??#??.??? 3,3,1,3,1,1 +?#?.??.?????#??#??. 1,1,1,5,2 +???##??.#???#?.?. 3,1,1,2,1 +#???#?.?#?...??????# 1,3,3,1,5 +??#??????#??. 3,7 +?.??????????? 6,1 +?..????#???? 5,1 +.?#?.???#?#?????#.?? 1,7,4,2 +????#?#???#?? 5,2 +???#??????#?????. 11,1 +???..???#???#? 1,1,1,7 +?.??#?????.?????.? 1,4,2,1,2,1 +??????????#? 3,2,1 +?###.??###?? 3,4 +??#??????.?.?##?#??? 3,4,7 +.#.######?.? 1,7 +?????###?#.?#?????.. 7,6 +???.?.#??.??..? 2,2,2,1 +????#.??.?.??? 1,1,1,2 +?#???.??????# 2,1,2,1 +?????..??#??# 4,3,1 +?.#..?#..??#?.?# 1,1,2,4,2 +??????.?###.?? 1,1,4,1 +?#?##?#???#????? 10,1 +?.?##??.???#??#.?.? 1,2,7,1 +..??#?#??#??????.??? 5,6,1 +#???#?#??.#???.? 2,5,2 +???#??????###?? 5,4 +?????????.?#?#? 3,3 +.???????????##?#?. 8,5 +?.?????#.? 1,2,1 +?#.??????#????#?? 1,1,1,1,5 +????###?###.? 1,7 +?????#?#??...#?? 8,1 +###?...?##? 4,2 +????.????. 2,1,1 +??.##?#?#.??##??. 6,1,2,1 +???????#????# 1,2,3 +??#????##???????? 5,3,1,1 +???#.??#??? 2,1,5 +????#??????#.???? 5,1,1,1,2 +????.????..# 2,1,1,1 +.??????##??.. 1,6 +??#??.???..#?#?##?? 2,3,1,5 +????.#?.??.?#?.?#? 3,2,2,3,2 +.???????????#??#. 1,5,1,2 +.?#????.??????#???? 4,1,1,1,2,1 +#???##??????? 2,4,1 +##??#???#??#?#? 3,1,8 +.???.?.#??.? 1,1,1,1 +?#??##????.?#??#??## 3,2,2,2,1,3 +?????????#??#???#??? 1,5,4,1,3 +.???.??????. 2,1 +???#?????????? 2,2 +.?#.???#??.#. 1,1,3,1 +????.???#??#??.#? 2,1,2,2,1 +???#.?????????? 1,2,2,1,3 +??#??????.??.##??? 1,1,1,2,3,1 +??#?????????.??..??# 11,1,3 +#?##??????#?????? 6,1,7 +.?#??#.?##? 5,2 +???.?#..????..?? 2,1,1,2,1 +??#?#???.????? 6,5 +???.???#??#?.. 1,1,1,5 +..???#???.? 3,2 +#???###??.???? 9,2 +???.????.?# 1,1,2 +????#???????#?? 1,5,3,2 +???#??????#?? 1,2,6 +?##????#.#?.? 7,2 +?#.?#??#???? 2,1,2 +??#.??#??? 1,2 +?.#.##.#??##?????? 1,1,2,6,1,1 +??#????????#.??? 3,3,1,1,1 +.#???#??##????..#?? 11,1,1 +#?????##?#?#????#?? 4,12 +???????.??#?.?#? 4,1,2,1 +?##??#??#??#??. 3,8 +..?.?.??????????#?? 1,2,1,7 +???...?#?.?#.# 1,2,2,1 +???????..? 2,2,1 +?#???#???#???## 2,4,1,1,2 +.##.??#????. 2,2,3 +??.#.??#?.?#?? 1,4,2 +??#??.?#???.? 3,1,2,1 +?.??.???#?????? 1,10 +???#??????????. 1,3 +??#???????#??... 4,3 +??????#???.???.?? 8,1,1 +??.???#???##?.. 1,1,1,4 +?#????#?#????#? 8,3 +?????????#??.? 3,4 +??.#????#?????.?# 1,6,1,1,2 +????##?#..????..### 1,1,2,1,3,3 +?..?#??#?#?.???#???? 5,2,7 +?.#?.#????#??? 1,1,3,1 +.???#?.?.. 2,1,1 +????#.?.?# 2,1,1 +##?.#???#???.#?.???? 2,7,1,1,1 +#?#?..?????##.?#??? 4,7,5 +??.??.???#?? 1,1,2,2 +????#.????#???##?? 4,8 +#???????#?##?. 2,2,5 +?.???###?#??.. 1,3,3 +?####????? 4,1 +??.#.??#????????# 1,1,9,1 +?.??.????? 2,5 +#?????#???#??? 1,9,1 +?#??????????#?.#?? 3,10,2 +??????.?.#?? 1,1,3 +???#??###???#?.? 8,2 +??#####?#????.? 8,2 +?#??????#.? 6,1,1 +?#?#???.#??#???? 4,2,1,1,1 +????#????##??.?# 1,2,1,3,1 +??.?#?#.???.??#? 4,1,4 +?.??.???????#????. 1,1,1,5,1,1 +.?#????##??#??#??##? 3,9,4 +??.??.?????????. 2,2,4,1 +#?.???#???.??????#?? 1,1,1,1,7 +?##?????????#??????? 3,9,3 +.??...?#?#???? 2,4 +??.?#???????? 1,2,3 +#..??????#???#?#.? 1,1,1,3,3,1 +?.#??##?????? 1,3,2 +.????..???????? 4,2,3,1 +?????????.?#????.?. 6,5 +.???.???#?#??????? 1,1,1,4,1,1 +??##?#?????? 3,1,1,1 +.#?????????. 1,1,2 +?#?????????#?????.?# 8,6,1 +?.#?#???.??.? 3,2,1 +###?..?#???? 4,4 +??#???????? 4,2 +?????#??#..?.. 1,5,1 +??#?#.?.#?#??? 5,3,1 +???..?????.???#????. 1,3,2 +????.?#????#?.??? 1,1,8,1,1 +.?#.??????????#.?? 2,1,2,1,1,1 +?###??..???# 5,3 +.?#???..?. 1,1,1 +#?????.?#?????? 1,1,4,1 +#.##??#??#?#??.?? 1,5,4,1,1 +.?##?...???..???#?#? 3,3,6 +??#..????? 2,2 +?????.????. 1,1,2 +#?????.????##??#? 2,1,9 +?????????##?..????? 9,2,1 +???#..??#??? 2,3 +#????#####?.?????? 10,1,1,1 +?????.???#?????? 1,1,1,5,1 +??#???.????.??# 5,1,1,1 +?.??????.?##?? 1,3,3 +?#.??.#????????.#? 1,2,2,4,1 +??#?.???..# 2,1 +??.??#??##. 1,5 +?##???##?? 4,3 +#???.?#???..???##.#? 1,1,2,1,5,1 +.???####?#. 7,1 +??????###??? 1,1,6 +????#?.?.???.?????.? 3,2,5 +.#?.?????#?#??.??? 2,1,2,3,1,1 +.#?.??.?##.#? 1,1,2,2 +???.#??????????.# 1,1,1,4,1 +??#?#???#?# 6,1,1 +.??#????.#.?. 3,3,1,1 +???#???.???. 3,3 +?#?#.?#?#?#?###??.?? 4,11,1 +?.?.#????. 1,1,2 +..?##?.?#. 3,1 +???#?.#?##??..#.??# 3,6,1,1,1 +?#???.????.? 4,3,1 +??.??#?##???#? 1,7,1 +##??#.???? 5,2 +???##??#??#??#???... 1,13 +?#????.?#?.#??? 2,2,3,1,1 +?.??.##??? 1,4 +????.?#???# 2,1,2 +??#????.?# 2,1,2 +.????????#????#?? 4,2,2,2 +???#?????.?#??.??. 1,5,1,2,1,1 +????#?.#.? 1,1,1 +????????#?#?###?. 1,9 +???.?????????????? 1,9,4 +.????#.???#..???? 3,2,1,1,1 +??#??##??????#????? 1,8,2,1 +???#.????.?#?.????? 1,1,4,1,1,1 +???.?????#?? 1,1,1,5 +????.???.?? 2,3,1 +??????##.?#???.??? 8,1,1 +???#.?.#????#?. 1,2,7 +????#??#???.#?#. 8,1,1 +???????????##?.?.??? 2,2,5,1 +?..???.?###.#???. 1,2,4,4 +#.??.?????#??#?????? 1,8,3 +..#?#?????##???#.? 1,9,1,1 +?.#?##?????????##? 1,5,1,1,4 +???.???#????##??? 2,1,1,6,1 +?.#???.#.????? 3,1,3 +.#?#???.?? 1,2,1 +????.?#??#?.? 1,1,2,2 +.???????.???#?? 3,4 +#?.??.#??##?#??????? 1,1,2,10 +?###???#??? 3,3,1 +?????#?????#?#???. 7,1,1,1,1 +?.?????#??????#?#. 4,3,1,1,1 +..?#.?.#.#??#???.?# 2,1,1,6,1 +.?..??##.? 1,3 +??#???#??#??#??#???? 3,2,12 +.?#????????#. 7,2 +?#?.????.?. 2,3,1 +#??#?#????#.#????#? 1,1,3,1,1,5 +.?.????????.? 2,2 +#.?#???????.#??#?. 1,5,1,1,3 +#???#??.?.#? 1,3,1,1 +?.?.??###??? 1,1,5 +?..????#??#?#??????? 1,10,4 +??.#.???#.? 1,4 +?..????????? 2,1 +#??..###?.? 2,3,1 +#.?#?..?#???.?# 1,2,5,1 +#.??????#?.????? 1,1,4,2 +.?????##???#??.? 1,8 +??????????? 1,2 +???.???#?????.???? 3,1,1,1,1,4 +????????.. 1,2 +#?????#.?.#.??#.?# 7,1,1,1,1 +?..???????#???? 1,2,1,5 +??..???#.. 1,4 +??.#.?????? 1,3 +.???#???#.???? 5,1,2,1 +????.???.?? 4,2,1 +#.???????#?#???. 1,13 +?#???????##?. 3,5 +.???????.?#???# 1,4,1,1 +??#???.#???#? 2,5 +???.??#???? 1,4 +???????????.? 2,1 +?.???###??. 1,1,5 +#???.?#?.??? 1,1,1,1 +#.??.??#?????? 1,4,1,1 +???????.?.. 1,2,1 +#????#?.#.??? 6,1,1,1 +?????#.?.?#??.#?..?? 3,1,1,3,2,1 +.???..????#??? 1,1,3 +?????.????.?#? 1,1,2,2 +.?#.??..?#??##? 2,1,5 +????.??#?#. 1,5 +.???.?..##??? 1,2 +?????#????##????? 1,1,1,7 +.??#?#?#???.#?.? 1,6,1,1 +#.#????????#?#?.???? 1,1,6,1,1,1 +#?.?.?##?#??#?? 1,1,2,1,2 +???#??.?#???# 1,2,3,1 +????.????#?#??## 1,1,1,1,5 +..????#?#?.? 3,3,1 +.??###?#..?##.?? 6,3 +???.?#?????. 2,1,3 +???#??????#????#? 6,1,2,2 +??.?#??.?#.?.? 1,3,1,1 +??????????..????## 1,1,3,1,3 +?.??.#????.???#??.#? 1,2,1,1,4,1 +?#????##??# 1,2,5 +???#.???#.????#???? 1,1,3,5,1 +#.???????.???????#. 1,1,1,1,4,1 +#?#??.#????????#. 5,2,4,2 +?????#..?#???#???? 6,5,1 +?.?#??.??#? 4,3 +?#???##??.???.?#??.? 8,4 +??#??????#?#?#. 4,1,6 +.??#????#????#?. 7,3 +#??#???##??.??#??. 9,1,1,1,1 +.??##??.##??.? 5,4,1 +??#??##??#??????# 3,2,2,6 +#????#???????????? 1,1,1,4,2 +##.??????????#?#?..# 2,2,8,1 +.??#???#??.?## 4,1,2 +#????#?#??#.#???..# 1,1,7,1,2,1 +???????????## 2,1,2,3 +??#???.#??.. 3,1,1 +???????#.???#????. 2,3,1,4,1 +???.?#?.#?#?#?? 2,2,1,1,1 +?#???.???#?#? 2,2,1,2 +.##??#?.????##????#? 5,11 +###??#??.#????# 3,1,1,3 +??##???####????.??? 4,5,1,1,1,1 +.?#??.??#???##????. 3,1,5 +???##????.????. 1,3,1,1,2 +??#????????#? 3,2,5 +?#??..?###?.???.. 2,4,1 +##?.??.????#?? 3,1,1,4 +#????#?#????#?#????? 3,13,1 +?.??????#? 1,1,1 +#?##??#??????..?? 9,1,1 +.?.??????#?#??# 1,1,7,1 +?#??.#????# 2,1,2 +????#???##??#? 1,7 +...###?.??#.?? 3,2 +.??#?????.? 3,1 +???#??.??. 4,2 +???.?????#???? 2,1,2,4 +#??#??.??##??? 1,2,4 +?.###?.??#? 4,1,2 +?#?.??..#??##?#??.? 2,1,8 +.??#.?????..#??#? 3,4 +??????##??..##?.?. 2,5,2,1 +??????.??? 4,1,1 +?#???.??#?????#? 2,1,3,5 +??#?#########.?? 12,1 +????#?.????? 1,3,1,1 +?.?#??#??? 3,1 +?#????#?#?.?.#?? 3,6,1,1 +#?.??????#??#??.?.? 1,10,1 +???.??????. 2,2 +.????????. 1,2,1 +??#..#??.?? 3,2,1 +#?#?#??????#???????# 16,1 +?#?.?##.?#??# 3,3,2,1 +??.?????.???? 1,1,2,1 +..??#.?.?#?#?##? 3,8 +??????.??#?.???? 2,2,4,1 +.??#??#.?? 3,1 +..?.?.??##??????.??? 1,1,6,1,1 +?#???????????? 8,1,1 +.##???.?#????.??? 4,3,1,1 +?#?#?.??.###????#??? 4,3,2,4 +..?.?????#??###???? 1,12 +#??#??.#?#?? 5,1,1,1 +?#?#?.#???#. 1,1,1,3 +.#??????.??...??# 6,1,1,1 +.????##??##?????#?## 11,5 +?#??#..????? 5,2 +?????.?##?????#? 1,1,3,2,2 +?..#.?#??##??? 1,1,1,6 +????#??#????.?# 1,3,2,1,1 +?????????? 1,2 +?????.#?.? 1,2 +?####?#??.??#????##? 8,8 +?.?#????????#???. 2,1,7 +?#?#??????? 6,1 +?##?##????.???#???? 9,2,1,3 +?.#????.???..???? 5,1,2 +#.??..???????#??? 1,2,1,6 +??????????.?.#????. 2,3 +.???.??????###?. 3,6 +#.#??.?.???????#??. 1,1,1,1,3,5 +????#.?..###?#.???? 1,3,1,5,1,1 +???#???#??.? 1,3,1,1 +??.?.?.?????# 2,1,1,1 +#.???????.????? 1,2,1,2 +#?????.?#???#? 1,3,2,2 +.#???????###???? 3,3,6 +.??#????????. 2,4 +.?.#?.??.????#?#??? 1,2,1,9 +?????..???????#..?#? 2,8,2 +..#??#??##??#??? 2,9,1 +?.??????#.#...?.# 1,5,1,1,1 +.?????#???#?..?? 4,3,1 +???#?????? 1,1,1 +.????????#?..? 10,1 +..??#??#????????.? 8,2 +?.####?#???#??????.# 1,12,1,1 +?.?#??#?????.#?? 2,5,3 +.????????????? 9,1 +?.?.##?#?????###. 1,5,3 +?#?#?#??????? 3,4,1,1 +??##?.???????? 3,2,3 +????#.??###????# 4,3,1,2 +????##???##? 1,7 +?????#???#.??#?? 8,2 +#??#?#?#.#??#???.# 2,3,1,2,3,1 +??.????#???.??.?? 1,7,2,1 +.?##?#?..????..?? 5,1 +???#??#???????. 10,1 +??#???#????? 1,3,1,3 +??????????#?. 7,1 +.???.?..????????##? 2,11 +.????????????????##? 10,1,6 +?##???????#?? 4,1,2 +#?.??#??##??#?#? 1,5,1,1 +?#?..???#??#????.# 2,7,1 +?.??#.?.?#??. 3,3 +?#?#???????????? 9,1 +????????#?? 2,1,1 +.#?.?###?#??.?.?#. 2,7,2 +.?.????.##. 4,2 +?????????#??#? 2,6 +.?..??#?????.?##???? 1,4,2,6 +#?.????..? 2,1,1 +??##??.?????????.? 5,4,1,1 +?????#??#??.??#????# 3,5,8 +????.#???.???????#?. 1,1,4,3,2,2 +??#.??#??.? 3,3,1 +???#???#???#? 4,1,4 +#???#?#??##??#?##??? 2,5,5,2,1 +??...?#???? 2,2 +???#.???##.. 4,2 +.?#?###.????? 2,3,1 +????.##?.?.?? 1,2,1,1 +.##???????????. 5,4 +?#??##??.??#??# 7,1,4 +#??#?..??.??? 5,1,1 +#?????.??.?..??#.# 6,1,1,1,1,1 +#??#.?###???????#??? 1,2,5,1,2 +????.#?????????#? 3,5,2,2 +????????#?#?. 2,3 +??#.#?.???? 1,1,2 +??????.?#??#???? 4,8 +??????#???? 1,5 +.#???.?.??. 1,1,2 +#..??#??????#.??..? 1,1,1,5,1,1 +?????????.??.. 2,2 +.?#?..#?#?#??????##? 3,1,4,7 +?.???.???.#????# 1,1,1,4,1 +???#???.?#.?? 3,1,2 +?#??.?#???.??#?#?.# 1,1,2,2,3,1 +?#?#???#?#?#?# 1,1,9 +.?#?????#??#?.?? 1,4,1,2 +????###????#???. 1,10,1 +??.??.???????#. 1,2,1,3,1 +??????#???##? 1,7 +?.?#??.??#????### 1,1,10 +???#?#..??? 6,3 +#?????.????? 1,1,1,1 +.???.??##? 2,3 +?????##?.?.?? 3,3,1,1 +?.?.??#?????#? 1,3,1,1 +??.?.?#??##. 2,6 +???.?#.???##?#?.?##? 2,7,3 +?.???#??#?#?.#??##. 8,1,3 +??..?#??..? 1,3,1 +??????#???#????? 1,1,4,2,2 +??#.????#.?? 1,2,1,2 +#??????##???????.#? 9,1,1,1 +#?###????? 5,1 +???#.???#.??.#.???? 4,3,1,2 +.#????????..?.?#??#. 9,1,3,1 +?.???????.???#? 6,1,1 +?.??#?#????? 6,2 +?????????.? 1,1,4 +??????#???# 1,8 +#????.???###??? 1,1,1,5,1 +.?.?#???##?#? 1,1,7 +#?#??.###??#?.# 1,2,7,1 +?#?.#???#?. 2,1,4 +?#.??#?????#?###? 1,1,1,1,6 +.??????##?#??###. 11,3 +..????#???#?????? 1,3,7 +?##??????.????.? 9,2,1 +?????.?.?#? 2,1,2 +???????##????#?? 4,2,2,1 +?.?#???????..???.??? 1,8,2,1 +?.??????##?.?##??? 6,4 +?#.??.??#?###?? 1,1,7,1 +..#?????.??# 2,2,2 +.???##???.? 4,1 +?#??????.??. 3,1 +?.?..??.???#??????? 1,1,2,5,2,1 +??.??????#?##?.# 1,1,1,7,1 +??#??.##?. 3,2 +?..??#????.?????. 2,1 +?#.#???#???.??? 2,2,2,1 +..?#?..???.?? 2,2,1 +???#?#?.?.? 1,4,1 +#?#?#????#?????? 10,1,1 +???????????#??#???# 5,1,2,1,2 +.?.?.#?#??#??. 1,8 +???#??##?#??.??#. 10,3 +?#????.???..?##?? 5,1,1,2,1 +??..??###?#.? 1,6 +?#??#????????.??#?. 8,1,3 +???.???#.???#?# 1,4,2,1,1 +????#??.??.??????? 7,1,6 +.?..?.?#?#??#?.??? 1,1,1,1,3,1 +??##??#??#????#. 8,3 +?..?????..????. 1,3 +#??.????????#??? 1,1,9 +?.#.??#??..???#???# 1,5,8 +?.?#..?..#????.?# 2,1,4,1 +??.#.???#?## 1,1,7 +.??...?.?? 1,1 +?#???#??.??#?#????? 4,1,1,7,1 +???#.??#?????.#? 4,3,1,1,2 +?#??#?#???.?#??.?. 10,3 +.#??.#?#.???. 2,1,1,1 +??#??.??#???#?? 3,7 +????.???#?.??#?### 1,1,1,2,7 +#?.???????????#? 2,4,1,2 +#?#?..?#???.# 3,1,1,1 +??.?#??.???.##??? 3,2,4 +?.?.??#???##? 1,1,2,4 +.?##???.?. 4,1,1 +?????#??##??#?? 1,9 +???##?.????#?? 3,7 +???#??#?????##.?##?? 2,9,3 +.????..??. 1,1,1 +.??.#.?#??#??..?#?? 2,1,7,2 +#????##.?.????.?.? 7,3 +#??.?#?#.??? 1,1,1,3 +.??.?##???. 1,4 +?.#??#?##??????#?? 7,8 +?.???#.?.?.?#?#??? 1,1,1,1,1,4 +?????.?#?#??#? 1,7 +???.?.#??#?? 1,4 +?.##??.??. 3,1 +????.?????.#?#?? 3,3,1,2 +?.?.??##??#? 1,4,3 +..???.??.. 1,1 +#??#?????.#????????? 6,2,2,3 +????.??????. 2,1,1 +.???.???#?? 1,1,6 +?.??#?##?. 1,6 +??#?##??.? 1,4,1 +?.????##?????? 2,8 +??#??#?.????.# 6,1,1,1 +?#?###?????.???.? 6,1,1,1,1 +?.###???#??#?#.???#. 12,1,1 +???#??#???? 1,5,1 +??#???.??? 3,2 +??.#????????##?????? 2,1,5,5 +.????????#?..?.?.? 1,4,1,1,1,1 +??#???###?#?? 1,5 +#..??.??#??##??? 1,1,8 +?????##.????? 3,2,1 +.??.??#?#?.??#?????# 2,6,9 +###?.?????.? 3,1,1 +.????.?##.#??#??.? 1,1,3,1,4,1 +?.?.????.?#.?.?# 1,1,1,2,2 +??##???.??.#? 3,1,1,1 +?????#??.?????#????? 1,6,1,4,1 +??#?#?????#?. 1,1,1,6 +????????.??.#..# 2,1,2,1,1 +.?#?..??.???????.?#? 2,2,7,1 +???..??.?..?#.??? 1,1,1,2,1 +#?????????#??#?#.? 1,1,6,1,1,1 +??????#???????? 2,1,1,3,1 +????#??#???#???#? 1,6,1,1 +????.?##???# 3,3,1,1 +.??.????.?.?#?? 2,3,1,1 +?#????###?.???#??#.. 2,4,2,1,1 +.??#????#? 2,2 +#??????.???#?#. 2,1,1,1,4 +.?.???#.?##????## 1,1,1,3,4 +???????#????#?????? 1,14 +???##??##?###???#?? 2,11,1,1 +#.#???##???.#?.???? 1,3,3,1,2,1 +??#?.??##??? 2,2 +.?##???#.#??????. 2,2,7 +#??????.??? 7,1 +??#.??#?##.#?#???# 1,1,2,2,3,2 +?#??????#?#??.#??? 3,6,1,1 +????.?#?##????#.?#? 1,6,2,1 +?.????##???#. 1,4,3 +??#????????.??? 5,1,2 +.##???.?###?###?#??? 5,10 +????#???????#.? 1,5,1,1,1 +?????#??##?#. 2,7 +??##???.??.??????. 5,2,2,1 +#??????#?.??.?? 1,6,1,1 +??#??????#?#??????.? 3,12 +.???.#???#?#?#.# 1,1,7,1,1 +?..#?##?##????. 1,4,6 +??#??.?????..?. 1,3,1,1,1 +?#??#???.?##?. 2,1,1,3 +??#??#??##?..???# 9,1,1 +?#??.??#?????#?#?#?. 3,3,5,1 +?#.#??????####??# 1,1,2,8 +#???#?##??????.? 11,1 +??.??.?.#????#?.???? 1,1,1,1,5,1 +???????#???? 1,4,1 +#??##????????###??. 1,5,3,4,1 +#..?#?.??#?.?? 1,2,2,1 +???.#?#????? 1,7 +.??#?????? 1,3 +.??#??##????##. 9,3 +#.??????##?#???? 1,1,6,1 +##??.##??.?. 2,2,1,1 +..??#???##??.? 3,5,1 +?#..?.???..# 2,1,2,1 +?#.???##?#?.. 1,1,5 +??#.?#??..????? 3,4,1 +##??##??#????# 2,5,1,2 +?#?.#???.??. 2,1,1,2 +?##????#????.##? 3,6,2 +??#??????????.? 6,2,1 +?##?.????? 4,1,2 +?.??##??#?#?? 1,3,5 +#??.#??..#?#?##? 1,1,1,1,7 +????????.??????#??# 1,1,1,1,8,1 +???#.#?.#?##??##?# 2,1,4,3,1 +???????????#??. 3,6 +?????????? 3,2,1 +???##?.?????#?.?? 2,3,7,1 +???###??##???#?.#??# 11,2,1,1 +?????##?#.??. 9,2 +???????????????.?? 13,1 +##?????.#.?#??????? 4,1,1,7,1 +.?#??.?#?#??#???? 2,7,1 +.?????.???#?#?? 5,1,1,3 +???#?.#.??.??.??.? 1,2,1,1,2,1 +.???#.??#?... 1,2 +?#???#????. 1,4,2 +?#??..??#?? 2,3 +?.#???????????.?? 6,3,1 +.????????##?..#?# 2,6,1,1 +???##??.#.?.?##?? 1,2,1,1,4 +??????#??##?.??????. 2,3,4,3,1 +??#??#?..?.? 5,1 +????????????#..????? 1,10,2 +..#??#????????##? 2,2,2,6 +?.#?###??? 1,3,1 +???##??.??.?#??#? 4,5 +?#???#????#??.??.?# 2,4,5,1,1 +.???#..#????????#??? 3,4,3,1 +?????.??????? 1,5 +..???????. 1,1,1 +..?#??.?#. 2,1,1 +?#.#????#?.#.? 2,3,1,1 +??????##?????.#.? 1,8,1,1 +??#???#??.#??? 7,2 +????#???.??.???#?#? 6,1,1,4 +?????#??###?#????.? 1,8,4 +.??????.???? 5,1,1 +??.???#???#??.?##?? 1,7,3 +??#?#??#?#.??.??. 6,1,1,1,1 +#????..#??#??#? 3,1,1,3,1 +???#???#??##???? 10,3 +???.???.#??# 2,1,1,1 +##????#?#??#??##?#? 5,12 +??#.?.?#..?.??? 1,1,1,1,2 +?#???.????.?????? 2,1,4,1,1 +?#?.??###?? 1,4 +??#?#???#??. 4,1 +?#?.??##???????#.?. 1,12,1 +??#???.??.#? 3,1,2 +??##???..?#???? 4,4 +?#???#??..?#??.? 7,4,1 +?????????#?#?##??#?. 1,17 +.?.???.??##??.... 2,4 +??.?.?#?#????#..???# 1,8,1,2 +?#??#????#????#.??? 8,1,1,1,3 +??##?????#?????.? 11,1,1 +?#?????#??##??????.? 3,9,1,1 +????#???.?? 1,5 +??????#?????. 9,1 +..??#.????#???##.??. 1,1,2,6,1 +.?#?#..?.?????? 4,1,1,3 +#????#.??.?#?.???. 1,1,1,1,1,3 +??????????. 1,4 +?????#????? 5,1 +#????..????#??# 3,1,1,4 +?????.#?.#??? 4,1,3 +??.?##.???.?? 1,3,1,1 +.##???#??#?????... 11,2 +???????##?#.. 1,8 +?.#..?#????#??????? 1,1,4,1,5 +#?????#???????#??? 1,1,3,6 +.?????#??###????.??. 12,2 +?.??##?????.???????. 1,1,7,1,1,1 +????????.?. 4,1 +#???????.??..?? 1,5,1,1 +??.###??????? 1,3,1,2 +#.???#.???#????#? 1,1,1,9 +????#.???# 1,2,3 +???..#??.???.?#???? 2,3,1,1,5 +?????.?#???????? 5,2,1 +?.??#..?????.?????? 2,1 +?#####?.???????#? 6,1,6 +????..???#.?? 1,4,1 +..???#?.?? 1,2,1 +.?#??????#?.?.? 3,2 +????###..??# 3,1 +???????????.?. 1,4,2 +?#?.?????.????? 1,4,1,1 +??????#?##?#?#??? 1,10 +?????#?????#?? 8,3 +?????##?#?##???????? 5,8 +??#??????? 3,1 +#?.???#???????.## 2,3,1,1,2 +???.????????? 2,5 +????#??#??.?. 2,1,3 +????.?..#??. 2,2 +???#?#.?#?#??#????#? 1,1,1,12 +??#??#?????# 7,3 +.????.???. 2,1,1 +???.??.??. 1,1,1 +?#?.#.????? 2,1,2 +???#???##.. 1,6 +?##?#??#.#????.???? 6,1,1,2,2,1 +?????????? 7,1 +??#?.???#?##???? 3,1,9 +??#???????.? 2,1,2 +????.???#?.??#?? 1,1,3,1,3 +????#??.?#?.? 2,2,3 +?????#.?###???.???#. 5,3,1,2,1 +##?.????#??.? 3,1,3,1 +??##?..?.??????##??? 4,1,7 +.#?.?#..##?# 1,2,2,1 +????#?#???# 3,4,1 +#????#?????#.?? 1,1,8,1 +?.??#???#??#?#???..? 1,5,4,1,2,1 +?????.???????. 2,6 +?#.???##..#? 2,4,2 +????##????# 2,3,3 +??##?????????####? 2,12 +?.????????????.. 1,1,7,2 +?.##?.?.?#.???#???#? 1,2,1,8 +###???.####???. 3,1,4,2 +???..??#??#.???? 1,6,1 +.???#??#.????????? 7,3,3 +?#?????#???#??? 5,8 +?#.??#???? 1,1,2 +?.?#?#???..#.? 1,5,1,1 +.??????#?? 1,1,4 +????#???????? 3,2 +????????#?.?.???#? 7,1,1,1,3 +?#??????.?????#??#? 3,3,1,1,1,2 +?#??.?.??.?? 2,1,1,1 +?????????? 1,3,1 +.???#????# 1,2,3 +?#??.#????#?#?. 1,8 +.?#?#?##??.?#? 1,5,3 +#?.?.??#????#???#? 1,1,4,2,3 +#..##.#?## 1,2,4 +##???#?#???.??.?? 3,7,1,1 +???###?????#???. 5,7 +.#?.?.?#?#..??##.?? 1,1,3,4,1 +?.#.?????. 1,1,1 +???#?#??#?????.? 2,2,6 +?.??????.#.. 1,1,2,1 +???????#?. 1,1,1 +??.?..##???#?? 1,7 +???.?????## 1,3 +..????.?##?.. 3,2 +?#.#.?###???.?#??? 2,1,5,1,4 +#??##.?.?.????? 1,3,1,2 +.????.?#???? 2,4 +.?##??##??.?. 3,4,1 +#???.?#??#? 2,6 +????????#?#????. 4,2,1,2 +??#??.#???? 1,2,1 +??#?????#??.??? 10,1,1 +??????.?#? 1,3,2 +..#?.?????? 1,2,1 +#.????###??.??#???? 1,1,6,1,1,2 +?????#???#?. 2,2 +??.?#???.????. 1,1 +..?...?#?? 1,3 +???.??????#??? 1,1,4,2 +.????.??.???#### 3,1,5 +?????#.??#.#? 5,1,1,1 +.??.????????.?#??? 3,2 +??.?#?.??.??? 1,2,1,1 +??#?..??#. 1,2 +?????.??#?? 3,1,3 +?.#?..?#?###. 1,2,6 +?###?##?.?#..???#?.? 7,1,1,2,1 +???#?????????????? 6,1,3,3 +??.?##??.?? 2,4 +??.?#?###???..#?? 6,2 +#?????????##??? 1,1,8,1 +??????.?.# 2,1,1 +#?.?##?????#?? 2,3,5 +??#??#?.???? 1,1,2,3 +..#?.????#?????#?##? 2,1,6,4 +?????#???#??#???? 1,1,1,4,5 +????..?#??? 1,3 +.#?????????????# 3,1,9 +?##?#????????.?##?? 12,4 +????.?#????.#?.# 1,1,5,2,1 +????????#?##.?#? 3,7,3 +?#?.?##?.?# 2,2,1 +.#???#????.??# 1,6,1 +.???.??????#? 2,6 +??##??????#??#?#.?## 1,6,1,3,2 +?###??????#???##? 5,9 +.?.?.????#??# 1,1,3,1 +.?????..???? 4,3 +?#????#?.????? 1,1,2,3 +?.???????.???.??? 1,2,3,2 +#??#..#####? 4,6 +?..?#????#???#?#? 1,2,3,3 +?????????? 2,1,1 +?.????.#??#??.##?? 1,3,2,1,1,4 +#?????#?.? 2,4,1 +????.??#?#???? 1,6 +???#?##????#?#??. 12,1 +???#??????#?#?#????? 8,4,2,1 +.???#?..???#??.?. 1,4 +??#.#?????.#?##? 1,1,3,1,5 diff --git a/src/day-12/solution.test.ts b/src/day-12/solution.test.ts new file mode 100644 index 0000000..6c1d43a --- /dev/null +++ b/src/day-12/solution.test.ts @@ -0,0 +1,14 @@ +import { test, expect } from 'bun:test'; + +import { solvePart1, solvePart2 } from './solution'; + +const inputFile = Bun.file(import.meta.dir + '/input.txt'); +const input = await inputFile.text(); + +test('part 1', () => { + expect(solvePart1(input)).toEqual(7017); +}); + +test('part 2', () => { + expect(solvePart2(input)).toEqual(527570479489); +}); diff --git a/src/day-12/solution.ts b/src/day-12/solution.ts new file mode 100644 index 0000000..6b8cfe5 --- /dev/null +++ b/src/day-12/solution.ts @@ -0,0 +1,128 @@ +enum SpringStatus { + DAMAGED = '#', + OPERATIONAL = '.', + UNKNOWN = '?', +} + +const cache = new Map(); + +/** + * This function counts all valid conditions and basically IS a solution for both parts. + * It enumerates all possible conditions recursively and count valid ones. + * + * Not optimized, it is extremely slow (1 sec for p1, forever for p2). + * Here are 3 optimizations I've applied to get better times (17ms - p1, 300ms - p2): + * + * 1. Return 0 early: it validates non-completed conditions and exits if it finds invalid paths, + * so we never even finish conditions if we see they are invalid at the beginning. + * + * 2. Cut off validated groups: when >= 1 groups are passed, we don't need to re-check them on every future branch. + * Therefore, we cut off the beginning of the conditions string, and remove corresponding groups from conditionGroups. + * + * 3. Memoization - together (and only together) with optimization 2, we can apply memoization to not re-calculate + * smaller repetitive groups. This has a significant effect. + */ +const countValidConditions = (conditions: string, conditionGroups: number[]): number => { + let validConditions = 0; + + let groupSize = 0; + let groupIndex = 0; + let index = 0; + + for (const status of conditions) { + if (status === SpringStatus.DAMAGED) { + groupSize += 1; + + if (groupSize > conditionGroups[groupIndex]) { + return 0; + } + } else if (status === SpringStatus.OPERATIONAL && groupSize !== 0) { + if (conditionGroups[groupIndex] !== groupSize) { + return 0; + } + + groupSize = 0; + groupIndex += 1; + } else if (status === SpringStatus.UNKNOWN) { + break; + } + + index += 1; + } + + if (conditions[index] === SpringStatus.UNKNOWN) { + // here the recursion happens + // we can replace UNKNOWN with either OPERATIONAL or DAMAGED + + // OPERATIONAL: only makes sense if not in group or groupSize is correct + + if (groupSize === 0 || groupSize === conditionGroups[groupIndex]) { + // cut all processed groups & continue with a remaining conditions + + const cutConditions = conditions.substring(index + 1); + const cutGroups = conditionGroups.slice(groupSize !== 0 ? groupIndex + 1 : groupIndex); + + // get key & check cache + + const key = cutConditions + cutGroups.join('\n'); + + if (cache.has(key)) { + validConditions += cache.get(key); + } else { + const cutValidConditions = countValidConditions(cutConditions, cutGroups); + cache.set(key, cutValidConditions); + validConditions += cutValidConditions; + } + } + + // DAMAGED + + validConditions += countValidConditions( + conditions.substring(0, index) + SpringStatus.DAMAGED + conditions.substring(index + 1), + conditionGroups, + ); + } else { + if (groupSize !== 0 && conditionGroups[groupIndex] !== groupSize) { + return 0; + } else if (groupSize !== 0) { + groupIndex += 1; + } + + return groupIndex === conditionGroups.length ? 1 : 0; + } + + return validConditions; +} + +export const solvePart1 = (input: string): number => { + let totalArrangements = 0; + + const records = input.trim().split('\n'); + + for (const record of records) { + const conditions = record.split(' ')[0]; + const conditionsGroups = record.split(' ')[1].split(',').map(Number); + + totalArrangements += countValidConditions(conditions, conditionsGroups); + } + + return totalArrangements; +} + +export const solvePart2 = (input: string): number => { + let totalArrangements = 0; + + const records = input.trim().split('\n'); + + for (const record of records) { + const conditions = record.split(' ')[0]; + const conditionsGroups = record.split(' ')[1].split(',').map(Number); + + const unfoldedConditions = [conditions, conditions, conditions, conditions, conditions].join(SpringStatus.UNKNOWN); + const unfoldedConditionsGroups = [...conditionsGroups, ...conditionsGroups, ...conditionsGroups, ...conditionsGroups, ...conditionsGroups]; + + totalArrangements += countValidConditions(unfoldedConditions, unfoldedConditionsGroups); + } + + return totalArrangements; +};