this repo has no description
1<!-- livebook:{"persist_outputs":true} -->
2
3# Day 12
4
5```elixir
6Mix.install([:kino_aoc])
7```
8
9## Section
10
11<!-- livebook:{"attrs":{"assign_to":"puzzle_input","day":"12","session_secret":"ADVENT_OF_CODE_SESSION","year":"2023"},"chunks":null,"kind":"Elixir.KinoAOC.HelperCell","livebook_object":"smart_cell"} -->
12
13```elixir
14{:ok, puzzle_input} =
15 KinoAOC.download_puzzle("2023", "12", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION"))
16```
17
18<!-- livebook:{"output":true} -->
19
20```
21{:ok,
22 ".#??..#??.?. 3,1,1,1\n???.##??#??????#???# 1,13,1\n.??#.?#??#????#?? 2,4,1,1,1\n???#??#.???#.?#??#?# 4,2,1,2,1,4\n????#?##???#.??.? 2,2,6,1\n.?????#???.###.##? 7,3,2\n.###?..#??????#???? 4,8,1\n??????????????? 1,1,1,2,1\n???.????????#? 1,3,1,1\n???.#..?#.?#?#??#?. 2,1,1,5,1\n.?..??#.????. 1,3,1,2\n.#?.??#?????##.# 1,2,1,3,1\n?###????.#?? 5,1,2\n?#??.????? 2,4\n?.#????#?????#??#?? 1,6,1,4,1\n#????????#?#?? 1,7,1,1\n?#??.?????? 3,1,1\n?..??#?###?? 1,6\n???.?.??#??##?? 1,1,1,5,1\n#???#.?????? 2,1,3,1\n?###??.??.?#???..? 4,1,2,1,1,1\n?.#???#?.?? 2,1,1\n#??##????##??????#? 7,5,2\n????#????????????# 1,6,1,1,2\n#?.?.##???? 1,1,5\n.?????.?#???????? 1,2,2,2,1\n#??.???#?.????? 2,5,1,1\n?????????.#???. 6,2\n?????????? 1,1,4\n?#??#??#?## 1,7\n????#?##???#? 1,6,1,1\n??#??#.???#?????? 1,1,1,7,1\n?????##?.?#??. 1,2,4\n???##????###????. 4,7\n?.?.?.?#???? 1,1,6\n???..??.????.###??. 2,2,2,5\n????##??#????? 1,7,1,1\n???..????#??? 2,6\n.??.????????. 1,2\n?.#?.????? 1,2\n??????.#???#? 2,5\n?????#.###???#.???# 6,7,1,1\n##.????##..#??#?. 2,6,1,1\n?????.??.?????????. 1,6\n??????..#?# 4,3\n#??????#??..?#? 10,2\n?.?????.?#??? 1,2\n???#??????.. 2,4\n.#?#???####??.?#?##? 12,5\n?.?????##??? 3,4\n?###?###????????# 10,3\n.?????????#? 1,5\n#?##????#???? 1,2,2,1\n.??????.??#???. 1,2,1,1,1\n??#.?#.????# 1,2,1,1\n???????.?#??????.?? 2,1,1,8,1\n???#??.?#???? 5,2,2\n?#??????###???. 2,8\n.??????#???????#? 1,12\n??..???#?#??? 1,6\n?.??????.. 1,1,3\n??#??.?#??#. 1,1,1,1\n?#?????.??????. 1,1,6\n.#?#?????#?#???#?.?? 5,9\n???#???#.#?##????? 5,1,7,1\n?#.??#??#?..?? 1,5,1\n#???#????#?.? 1,1,6,1\n????????.#? 4,1\n????#?#?#??.??.?? 8,1\n???#?????#?#?..#? 4,1,4,1\n??.??????#??.?#??#. 1,3,1,1\n.????????????? 1,2,2,1\n#.?#?#?#?.??? 1,6,1\n?#??#??..?#?? 3,2,3\n..#?.?#??#?# 2,6\n???#?.?..???## 3,1,2\n?????.?#?.???## 3,3,3\n??.?????..????? 3,5\n?.?????##? 1,1,2\n?.??#.#????#???.. 1,3,1,1,4\n??#??#?#?##????.# 3,3,6,1\n?.?.?.?####???.#. 1,8,1\n?##?????#?.?#.. 3,1,1,2,1\n???#???????.#. 2,4,1\n????.??.?#???? 1,3\n.?#?#?#??????##??? 2,11,2\n??.?#?.#?. 2,2,2\n????#...?#???# 4,5\n.??..???#??#?#? 2,1,1,3\n????#.?????? 3,6\n????.?????? 1,1,2\n????#?????.?# 1,2,2,2\n.?#?????.??.? 3,1,1,1\n???#??.?#.??. 1,3,2,2\n?##???????#???????# 2,9,1\n?##?????????.?? 8,1\n.#???????.??#???? 1,4,4\n.?#?.#??.? 1,1,1\n??.?#??????#? 4,3\n??#?#??#??.?? 3,2,1\n.#?.???##? 1,5\n?????.#?.???#? 2,1,1,4\n##????#??? 4,1,1\n?????????# 1,2,3\n??#?#?????##? 4,3\n?#.???##?#????#?##. 1,12\n#.?##???#???..??.?? 1,6,1,2,1\n?#????#??#.#?.##?# 5,1,1,1,4\n?#????#.#??#..? 1,3,1,1,1\n??###?.?.????. 5,2\n.????????#.#? 5,2,1\n.?.#.???..??#.?? 1,1,1,3,1\n#????????.??????. 4,4,2,1,1\n?.??????#? 3,3\n...?#.#.???##? 2,1,1,2\n??????????#.???.?#?? 7,1,1,1\n.????##?#??.???#???? 7,5\n??.#?.???? 1,2,2\n?.#??#??#?? 1,4,2\n????#?????? 1,4,2\n??.???????? 1,1,2\n??#????????#??#???? 3,3,7\n?????????##?.??#?. 1,1,2,1,3,2\n??#????????????.??? 2,11\n??#?.?#???#?##????. 4,3,4,1\n????.???????.?? 1,3\n????#.##?? 1,1,4\n#?????#?????.##?## 2,7,5\n#??.??..?#?#.? 2,1,4\n.??.??.?.?????##? 1,1,1,4\n??.???????#??? 1,7,1\n.#.??.?##???#.? 1,1,3,2,1\n#??.??##??.?#?.#?#?? 3,4,1,4\n???..?????????.# 2,1,3,1,1\n??#.?????#?##.?#.# 2,6,2,1,1\n?#?.?.#??#?? 1,6\n?###????#?.? 6,2\n?.?????????????.?? 1,1,1,1,4,1\n????.?#?##??#??. 1,1,5,2\n???????.????# 1,1,1,3\n##???.????#???# 2,1,1,1,5\n.#?##???####?.??#.?? 4,5,2\n????????#?#?.?#?? 1,1,3,1,3\n?.?????#?. 2,2\n?#???????????#.????? 7,2,1,1,1\n????????#..##. 1,2,2,2\n#?#?##?#??. 3,5\n???#????###????????. 17,1\n.????#???## 1,3,4\n??####??#??#?#?#?#?? 6,6,4\n??????#????.?.?? 1,3,1,1,1\n..?##?.?.?. 3,1\n.???####?????#? 8,1\n.???????#?..??.?# 1,3,1,2,1\n??.?#?????? 1,2,2\n??#???#..?#?????#??? 4,1,5,1,2\n??#?...#?? 4,1\n??????.#?#?##??.?? 2,7\n.???????##???. 1,9\n?..#.????#??#???#?? 1,3,9\n?#??????????#???.#?? 4,3,1,1,3\n.?????#???.??#?.?. 4,1\n??#.?##?#??##??#?#? 1,1,12,1\n?##??#??##???#.?.. 2,9\n#??????#??? 3,4\n##???.?#..#.?# 5,2,1,2\n???.?.???# 2,1,3\n?.?????.?? 2,2\n???.?????#?.?????? 1,2,2\n.#????#????.? 1,6\n????.#.?#??????#???? 1,1,1,1,2,7\n?.???.#.??##???#?? 1,1,1,1,8\n??????.?#? 4,2\n#??..?????#? 2,1,2,1\n?##.#.????##?# 2,1,2,4\n????????#???. 9,1\n??..????.? 1,4\n????#???#?.? 9,1\n#???.??????? 3,1,2,1\n.??????.?##??#. 6,3,1\n#.?.?#????#??#? 1,2,1,2,2\n##??##?.??? 6,1\n?????.????#???? 1,1,6" <> ...}
23```
24
25```elixir
26defmodule Day12 do
27 def parse_pattern(pattern) do
28 pattern
29 |> String.to_charlist()
30 |> Enum.map(&symbol_to_type/1)
31 |> do_chunking()
32 |> Enum.chunk_by(&(elem(&1, 0) == :gap))
33 |> Enum.reject(&match?([{:gap, _}], &1))
34 end
35
36 defp do_chunking([start | rest]), do: do_chunking(start, rest, 1)
37
38 defp do_chunking(curr, [], acc), do: [{curr, acc}]
39 defp do_chunking(curr, [curr | rest], acc), do: do_chunking(curr, rest, acc + 1)
40 defp do_chunking(curr, [next | rest], acc), do: [{curr, acc} | do_chunking(next, rest, 1)]
41
42 defp symbol_to_type(?.), do: :gap
43 defp symbol_to_type(??), do: :wild
44 defp symbol_to_type(?#), do: :lava
45end
46```
47
48<!-- livebook:{"output":true} -->
49
50```
51{:module, Day12, <<70, 79, 82, 49, 0, 0, 10, ...>>, {:symbol_to_type, 1}}
52```
53
54```elixir
55puzzles =
56 puzzle_input
57 |> String.split("\n", trim: true)
58 |> Enum.map(fn line ->
59 [pattern, values] = String.split(line)
60 values = values |> String.split(",") |> Enum.map(&String.to_integer/1)
61
62 {Day12.parse_pattern(pattern), values}
63 end)
64```
65
66<!-- livebook:{"output":true} -->
67
68```
69[
70 {[[lava: 1, wild: 2], [lava: 1, wild: 2], [wild: 1]], [3, 1, 1, 1]},
71 {[[wild: 3], [lava: 2, wild: 2, lava: 1, wild: 6, lava: 1, wild: 3, lava: 1]], [1, 13, 1]},
72 {[[wild: 2, lava: 1], [wild: 1, lava: 1, wild: 2, lava: 1, wild: 4, lava: 1, wild: 2]],
73 [2, 4, 1, 1, 1]},
74 {[
75 [wild: 3, lava: 1, wild: 2, lava: 1],
76 [wild: 3, lava: 1],
77 [wild: 1, lava: 1, wild: 2, lava: 1, wild: 1, lava: 1]
78 ], [4, 2, 1, 2, 1, 4]},
79 {[[wild: 4, lava: 1, wild: 1, lava: 2, wild: 3, lava: 1], [wild: 2], [wild: 1]], [2, 2, 6, 1]},
80 {[[wild: 5, lava: 1, wild: 3], [lava: 3], [lava: 2, wild: 1]], [7, 3, 2]},
81 {[[lava: 3, wild: 1], [lava: 1, wild: 6, lava: 1, wild: 4]], [4, 8, 1]},
82 {[[wild: 15]], [1, 1, 1, 2, 1]},
83 {[[wild: 3], [wild: 8, lava: 1, wild: 1]], [1, 3, 1, 1]},
84 {[
85 [wild: 3],
86 [lava: 1],
87 [wild: 1, lava: 1],
88 [wild: 1, lava: 1, wild: 1, lava: 1, wild: 2, lava: 1, wild: 1]
89 ], [2, 1, 1, 5, 1]},
90 {[[wild: 1], [wild: 2, lava: 1], [wild: 4]], [1, 3, 1, 2]},
91 {[[lava: 1, wild: 1], [wild: 2, lava: 1, wild: 5, lava: 2], [lava: 1]], [1, 2, 1, 3, 1]},
92 {[[wild: 1, lava: 3, wild: 4], [lava: 1, wild: 2]], [5, 1, 2]},
93 {[[wild: 1, lava: 1, wild: 2], [wild: 5]], [2, 4]},
94 {[[wild: 1], [lava: 1, wild: 4, lava: 1, wild: 5, lava: 1, wild: 2, lava: 1, wild: 2]],
95 [1, 6, 1, 4, 1]},
96 {[[lava: 1, wild: 8, lava: 1, wild: 1, lava: 1, wild: 2]], [1, 7, 1, 1]},
97 {[[wild: 1, lava: 1, wild: 2], [wild: 6]], [3, 1, 1]},
98 {[[wild: 1], [wild: 2, lava: 1, wild: 1, lava: 3, wild: 2]], [1, 6]},
99 {[[wild: 3], [wild: 1], [wild: 2, lava: 1, wild: 2, lava: 2, wild: 2]], [1, 1, 1, 5, 1]},
100 {[[lava: 1, wild: 3, lava: 1], [wild: 6]], [2, 1, 3, 1]},
101 {[[wild: 1, lava: 3, wild: 2], [wild: 2], [wild: 1, lava: 1, wild: 3], [wild: 1]],
102 [4, 1, 2, 1, 1, 1]},
103 {[[wild: 1], [lava: 1, wild: 3, lava: 1, wild: 1], [wild: 2]], [2, 1, 1]},
104 {[[lava: 1, wild: 2, lava: 2, wild: 4, lava: 2, wild: 6, lava: 1, wild: 1]], [7, 5, 2]},
105 {[[wild: 4, lava: 1, wild: 12, lava: 1]], [1, 6, 1, 1, 2]},
106 {[[lava: 1, wild: 1], [wild: 1], [lava: 2, wild: 4]], [1, 1, 5]},
107 {[[wild: 5], [wild: 1, lava: 1, wild: 8]], [1, 2, 2, 2, 1]},
108 {[[lava: 1, wild: 2], [wild: 3, lava: 1, wild: 1], [wild: 5]], [2, 5, 1, 1]},
109 {[[wild: 9], [lava: 1, wild: 3]], [6, 2]},
110 {[[wild: 10]], [1, 1, 4]},
111 {[[wild: 1, lava: 1, wild: 2, lava: 1, wild: 2, lava: 1, wild: 1, lava: 2]], [1, 7]},
112 {[[wild: 4, lava: 1, wild: 1, lava: 2, wild: 3, lava: 1, wild: 1]], [1, 6, 1, 1]},
113 {[[wild: 2, lava: 1, wild: 2, lava: 1], [wild: 3, lava: 1, wild: 6]], [1, 1, 1, 7, 1]},
114 {[[wild: 5, lava: 2, wild: 1], [wild: 1, lava: 1, wild: 2]], [1, 2, 4]},
115 {[[wild: 3, lava: 2, wild: 4, lava: 3, wild: 4]], [4, 7]},
116 {[[wild: 1], [wild: 1], [wild: 1], [wild: 1, lava: 1, wild: 4]], [1, 1, 6]},
117 {[[wild: 3], [wild: 2], [wild: 4], [lava: 3, wild: 2]], [2, 2, 2, 5]},
118 {[[wild: 4, lava: 2, wild: 2, lava: 1, wild: 5]], [1, 7, 1, 1]},
119 {[[wild: 3], [wild: 4, lava: 1, wild: 3]], [2, 6]},
120 {[[wild: 2], [wild: 8]], [1, 2]},
121 {[[wild: 1], [lava: 1, wild: 1], [wild: 5]], [1, 2]},
122 {[[wild: 6], [lava: 1, wild: 3, lava: 1, wild: 1]], [2, 5]},
123 {[[wild: 5, lava: 1], [lava: 3, wild: 3, lava: 1], [wild: 3, lava: 1]], [6, 7, 1, 1]},
124 {[[lava: 2], [wild: 4, lava: 2], [lava: 1, wild: 2, lava: 1, ...]], [2, 6, 1, 1]},
125 {[[wild: 5], [wild: 2], [wild: 9]], [1, 6]},
126 {[[wild: 6], [lava: 1, wild: 1, ...]], [4, 3]},
127 {[[lava: 1, wild: 6, ...], [wild: 1, ...]], [10, 2]},
128 {[[wild: 1], [...], ...], [1, ...]},
129 {[[...]], [...]},
130 {[...], ...},
131 {...},
132 ...
133]
134```
135
136## Part 1
137
138```elixir
139defmodule Day12.Part1 do
140 def count_combinations([], []), do: 1
141 def count_combinations([[{:lava, lava} | _] | _], [segment | _]) when lava > segment, do: 0
142 def count_combinations(chunks, segments) when length(chunks) > length(segments), do: 0
143
144 def count_combinations([chunk | rest], [segment | srest]) do
145 chunk_length = chunk_length(chunk)
146
147 cond do
148 chunk_length < segment ->
149 0
150
151 chunk_length == segment ->
152 count_combinations(rest, srest) + 1
153
154 true ->
155 raise "Unimplemented"
156 end
157 end
158
159 defp chunk_length(list), do: Enum.reduce(list, 0, fn {_, val}, acc -> acc + val end)
160
161 defp chunk_splits(remaining, 0), do: {1, [remaining]}
162 defp chunk_splits([], segment) when segment > 0, do: {0, []}
163 defp chunk_splits([{:lava, n} | rest], segment), do: chunk_splits(rest, segment - n)
164end
165```
166
167<!-- livebook:{"output":true} -->
168
169```
170warning: variable "rest" is unused (if the variable is not meant to be used, prefix it with an underscore)
171 2023/day12.livemd#cell:h2soewijh5haeddpkqukqr3fug26rvi6:6: Day12.Part1.count_combinations/2
172
173warning: variable "srest" is unused (if the variable is not meant to be used, prefix it with an underscore)
174 2023/day12.livemd#cell:h2soewijh5haeddpkqukqr3fug26rvi6:6: Day12.Part1.count_combinations/2
175
176```
177
178<!-- livebook:{"output":true} -->
179
180```
181{:module, Day12.Part1, <<70, 79, 82, 49, 0, 0, 9, ...>>, {:chunk_length, 1}}
182```
183
184<!-- livebook:{"offset":10867,"stamp":{"token":"XCP.pErJuFAGcK1hyBg5n9FHQQCOc5uSp_xseil4UKha7AOJ2dF-diuCgS0T9sDTdi3bmDpRyQ3_9AYatfSZ6gVmYo8z2aHjDHdLDSoMb7a-ccykpMXbZIu3HqQdRGPO_mU6Fw","version":2}} -->