# Day 12 ```elixir Mix.install([:kino_aoc]) ``` ## Section ```elixir {:ok, puzzle_input} = KinoAOC.download_puzzle("2023", "12", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION")) ``` ``` {:ok, ".#??..#??.?. 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" <> ...} ``` ```elixir defmodule Day12 do def parse_pattern(pattern) do pattern |> String.to_charlist() |> Enum.map(&symbol_to_type/1) |> do_chunking() |> Enum.chunk_by(&(elem(&1, 0) == :gap)) |> Enum.reject(&match?([{:gap, _}], &1)) end defp do_chunking([start | rest]), do: do_chunking(start, rest, 1) defp do_chunking(curr, [], acc), do: [{curr, acc}] defp do_chunking(curr, [curr | rest], acc), do: do_chunking(curr, rest, acc + 1) defp do_chunking(curr, [next | rest], acc), do: [{curr, acc} | do_chunking(next, rest, 1)] defp symbol_to_type(?.), do: :gap defp symbol_to_type(??), do: :wild defp symbol_to_type(?#), do: :lava end ``` ``` {:module, Day12, <<70, 79, 82, 49, 0, 0, 10, ...>>, {:symbol_to_type, 1}} ``` ```elixir puzzles = puzzle_input |> String.split("\n", trim: true) |> Enum.map(fn line -> [pattern, values] = String.split(line) values = values |> String.split(",") |> Enum.map(&String.to_integer/1) {Day12.parse_pattern(pattern), values} end) ``` ``` [ {[[lava: 1, wild: 2], [lava: 1, wild: 2], [wild: 1]], [3, 1, 1, 1]}, {[[wild: 3], [lava: 2, wild: 2, lava: 1, wild: 6, lava: 1, wild: 3, lava: 1]], [1, 13, 1]}, {[[wild: 2, lava: 1], [wild: 1, lava: 1, wild: 2, lava: 1, wild: 4, lava: 1, wild: 2]], [2, 4, 1, 1, 1]}, {[ [wild: 3, lava: 1, wild: 2, lava: 1], [wild: 3, lava: 1], [wild: 1, lava: 1, wild: 2, lava: 1, wild: 1, lava: 1] ], [4, 2, 1, 2, 1, 4]}, {[[wild: 4, lava: 1, wild: 1, lava: 2, wild: 3, lava: 1], [wild: 2], [wild: 1]], [2, 2, 6, 1]}, {[[wild: 5, lava: 1, wild: 3], [lava: 3], [lava: 2, wild: 1]], [7, 3, 2]}, {[[lava: 3, wild: 1], [lava: 1, wild: 6, lava: 1, wild: 4]], [4, 8, 1]}, {[[wild: 15]], [1, 1, 1, 2, 1]}, {[[wild: 3], [wild: 8, lava: 1, wild: 1]], [1, 3, 1, 1]}, {[ [wild: 3], [lava: 1], [wild: 1, lava: 1], [wild: 1, lava: 1, wild: 1, lava: 1, wild: 2, lava: 1, wild: 1] ], [2, 1, 1, 5, 1]}, {[[wild: 1], [wild: 2, lava: 1], [wild: 4]], [1, 3, 1, 2]}, {[[lava: 1, wild: 1], [wild: 2, lava: 1, wild: 5, lava: 2], [lava: 1]], [1, 2, 1, 3, 1]}, {[[wild: 1, lava: 3, wild: 4], [lava: 1, wild: 2]], [5, 1, 2]}, {[[wild: 1, lava: 1, wild: 2], [wild: 5]], [2, 4]}, {[[wild: 1], [lava: 1, wild: 4, lava: 1, wild: 5, lava: 1, wild: 2, lava: 1, wild: 2]], [1, 6, 1, 4, 1]}, {[[lava: 1, wild: 8, lava: 1, wild: 1, lava: 1, wild: 2]], [1, 7, 1, 1]}, {[[wild: 1, lava: 1, wild: 2], [wild: 6]], [3, 1, 1]}, {[[wild: 1], [wild: 2, lava: 1, wild: 1, lava: 3, wild: 2]], [1, 6]}, {[[wild: 3], [wild: 1], [wild: 2, lava: 1, wild: 2, lava: 2, wild: 2]], [1, 1, 1, 5, 1]}, {[[lava: 1, wild: 3, lava: 1], [wild: 6]], [2, 1, 3, 1]}, {[[wild: 1, lava: 3, wild: 2], [wild: 2], [wild: 1, lava: 1, wild: 3], [wild: 1]], [4, 1, 2, 1, 1, 1]}, {[[wild: 1], [lava: 1, wild: 3, lava: 1, wild: 1], [wild: 2]], [2, 1, 1]}, {[[lava: 1, wild: 2, lava: 2, wild: 4, lava: 2, wild: 6, lava: 1, wild: 1]], [7, 5, 2]}, {[[wild: 4, lava: 1, wild: 12, lava: 1]], [1, 6, 1, 1, 2]}, {[[lava: 1, wild: 1], [wild: 1], [lava: 2, wild: 4]], [1, 1, 5]}, {[[wild: 5], [wild: 1, lava: 1, wild: 8]], [1, 2, 2, 2, 1]}, {[[lava: 1, wild: 2], [wild: 3, lava: 1, wild: 1], [wild: 5]], [2, 5, 1, 1]}, {[[wild: 9], [lava: 1, wild: 3]], [6, 2]}, {[[wild: 10]], [1, 1, 4]}, {[[wild: 1, lava: 1, wild: 2, lava: 1, wild: 2, lava: 1, wild: 1, lava: 2]], [1, 7]}, {[[wild: 4, lava: 1, wild: 1, lava: 2, wild: 3, lava: 1, wild: 1]], [1, 6, 1, 1]}, {[[wild: 2, lava: 1, wild: 2, lava: 1], [wild: 3, lava: 1, wild: 6]], [1, 1, 1, 7, 1]}, {[[wild: 5, lava: 2, wild: 1], [wild: 1, lava: 1, wild: 2]], [1, 2, 4]}, {[[wild: 3, lava: 2, wild: 4, lava: 3, wild: 4]], [4, 7]}, {[[wild: 1], [wild: 1], [wild: 1], [wild: 1, lava: 1, wild: 4]], [1, 1, 6]}, {[[wild: 3], [wild: 2], [wild: 4], [lava: 3, wild: 2]], [2, 2, 2, 5]}, {[[wild: 4, lava: 2, wild: 2, lava: 1, wild: 5]], [1, 7, 1, 1]}, {[[wild: 3], [wild: 4, lava: 1, wild: 3]], [2, 6]}, {[[wild: 2], [wild: 8]], [1, 2]}, {[[wild: 1], [lava: 1, wild: 1], [wild: 5]], [1, 2]}, {[[wild: 6], [lava: 1, wild: 3, lava: 1, wild: 1]], [2, 5]}, {[[wild: 5, lava: 1], [lava: 3, wild: 3, lava: 1], [wild: 3, lava: 1]], [6, 7, 1, 1]}, {[[lava: 2], [wild: 4, lava: 2], [lava: 1, wild: 2, lava: 1, ...]], [2, 6, 1, 1]}, {[[wild: 5], [wild: 2], [wild: 9]], [1, 6]}, {[[wild: 6], [lava: 1, wild: 1, ...]], [4, 3]}, {[[lava: 1, wild: 6, ...], [wild: 1, ...]], [10, 2]}, {[[wild: 1], [...], ...], [1, ...]}, {[[...]], [...]}, {[...], ...}, {...}, ... ] ``` ## Part 1 ```elixir defmodule Day12.Part1 do def count_combinations([], []), do: 1 def count_combinations([[{:lava, lava} | _] | _], [segment | _]) when lava > segment, do: 0 def count_combinations(chunks, segments) when length(chunks) > length(segments), do: 0 def count_combinations([chunk | rest], [segment | srest]) do chunk_length = chunk_length(chunk) cond do chunk_length < segment -> 0 chunk_length == segment -> count_combinations(rest, srest) + 1 true -> raise "Unimplemented" end end defp chunk_length(list), do: Enum.reduce(list, 0, fn {_, val}, acc -> acc + val end) defp chunk_splits(remaining, 0), do: {1, [remaining]} defp chunk_splits([], segment) when segment > 0, do: {0, []} defp chunk_splits([{:lava, n} | rest], segment), do: chunk_splits(rest, segment - n) end ``` ``` warning: variable "rest" is unused (if the variable is not meant to be used, prefix it with an underscore) 2023/day12.livemd#cell:h2soewijh5haeddpkqukqr3fug26rvi6:6: Day12.Part1.count_combinations/2 warning: variable "srest" is unused (if the variable is not meant to be used, prefix it with an underscore) 2023/day12.livemd#cell:h2soewijh5haeddpkqukqr3fug26rvi6:6: Day12.Part1.count_combinations/2 ``` ``` {:module, Day12.Part1, <<70, 79, 82, 49, 0, 0, 9, ...>>, {:chunk_length, 1}} ```