this repo has no description
at master 11 kB view raw
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}} -->