# Day 18 ```elixir Mix.install([ {:kino_aoc, git: "https://github.com/ljgago/kino_aoc"} ]) ``` ``` :ok ``` ## Section ```elixir {:ok, puzzle_input} = KinoAOC.download_puzzle("2022", "18", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION")) ``` ``` {:ok, "9,2,13\n12,12,4\n3,8,14\n9,3,4\n15,5,7\n9,5,4\n7,3,10\n12,8,2\n8,12,16\n12,16,12\n5,15,8\n16,7,12\n4,5,6\n11,7,2\n10,14,16\n9,3,15\n6,7,3\n14,10,15\n7,12,3\n13,8,3\n9,1,12\n7,15,5\n8,6,16\n17,9,12\n3,13,6\n7,2,10\n9,14,3\n16,12,6\n13,4,15\n17,14,11\n14,4,5\n15,4,14\n3,4,9\n13,12,17\n15,11,3\n12,14,3\n12,5,4\n16,5,12\n14,16,6\n4,3,11\n9,16,13\n10,6,3\n17,9,7\n5,5,14\n14,13,15\n16,12,8\n7,11,2\n14,9,4\n12,11,15\n13,7,4\n4,15,13\n9,13,2\n7,16,9\n17,13,6\n11,0,11\n15,4,11\n4,12,8\n13,3,13\n5,12,17\n16,14,9\n6,5,4\n9,17,8\n6,10,2\n3,10,7\n1,9,7\n5,14,12\n7,12,5\n3,5,10\n5,15,14\n6,3,11\n15,13,13\n7,4,5\n11,7,4\n11,16,12\n2,11,8\n7,15,4\n9,5,17\n12,14,4\n14,4,6\n7,8,2\n11,3,7\n15,13,7\n12,11,2\n11,6,16\n18,10,10\n4,12,5\n11,10,2\n7,17,9\n3,14,9\n7,17,5\n10,8,17\n10,1,11\n11,11,1\n16,8,14\n2,7,10\n7,9,17\n12,12,2\n11,17,11\n15,10,16\n9,1,8\n1,10,12\n6,2,11\n17,11,8\n9,2,11\n13,5,4\n2,9,11\n4,5,9\n8,3,5\n3,14,11\n3,13,12\n10,8,16\n12,14,16\n15,12,13\n5,3,12\n16,9,12\n1,10,10\n17,6,10\n10,18,8\n8,13,17\n13,7,2\n3,12,13\n2,12,5\n6,9,16\n3,6,9\n6,16,6\n0,9,9\n6,17,10\n15,10,14\n2,8,12\n13,3,8\n11,12,17\n9,17,11\n4,6,8\n15,11,2\n4,6,15\n11,4,12\n11,8,1\n7,1,10\n12,11,3\n18,11,12\n8,16,12\n1,9,11\n16,14,14\n15,8,5\n15,5,5\n6,10,17\n13,4,16\n8,12,2\n10,5,15\n4,11,16\n4,10,4\n12,10,3\n10,5,2\n5,15,7\n14,15,7\n16,10,5\n6,3,3\n12,17,10\n4,7,14\n6,4,12\n13,5,11\n7,15,6\n1,8,9\n4,11,15\n14,4,4\n2,13,8\n5,4,5\n4,13,13\n4,14,8\n17,12,11\n7,16,15\n16,13,11\n11,3,12\n17,9,8\n11,6,15\n11,15,16\n6,17,9\n17,6,8\n13,15,15\n10,17,8\n3,5,5\n3,9,14\n17,10,13\n16,9,13\n13,8,16\n12,5,3\n12,15,15\n5,10,14\n16,15,11\n7,2,9\n9,16,12\n2,14,9\n14,17,8\n13,16,8\n7,3,5\n5,3,10\n11,5,16\n17,10,10\n6,7,16\n1,12,10\n6,14,2\n7,2,12\n12,17,9\n17,6,12\n2,13,13\n8,4,3\n16,8,13\n3,15,7\n16,5,13\n16,13,12\n16,12,5\n16,5,9\n4,13,8\n9,13,17\n13,10,15\n4,6,4\n10,11,17\n13,14,5\n9,14,14\n11,2,7\n12,10,2\n12,18,10\n12,6,16\n17,11,6\n8,14,16\n10,15,3\n3,6,5\n7,10,17\n15,5,12\n16,11,14\n8,12,18\n15,13,9\n6,8,3\n15,12,2\n14,13,6\n15,4,10\n11,1,8\n10,1,6\n5,7,16\n9,7,2\n13,3,6\n8,2,7\n14,14,5\n9,3,13\n6,3,8\n8,5,4\n7,4,4\n10,14,15\n10,16,5\n16,11,10\n3,8,11\n4,13,15\n8,13,5\n10,4,5\n15,14,14\n13,12,16\n11,14,3\n11,17,8\n6,5,2\n15,15,13\n5,5,5\n14,9,2\n5,5,9\n3,7,13\n2,15,9\n15,15,7\n7,17,8\n11,8,2\n16,5,7\n9,16,7\n11,4,4\n7,5,15\n10,12,1\n7,4,14\n9,16,6\n15,10,9\n14,7,16\n7,15,15\n15,11,5\n8,4,14\n13,14,10\n10,12,2\n11,15,14\n13,13,3\n4,13,4\n8,8,17\n9,4,3\n13,5,3\n2,10,8\n6,16,9\n4,8,14\n7,2,11\n14,1,10\n17,8,7\n14,9,13\n14,6,6\n5,6,16\n4,13,10\n8,13,16\n16,9,15\n5,8,3\n18,9,10\n13,14,15\n14,4,13\n17,12,10\n17,7,7\n10,17,6\n16,10,14\n6,11,2\n16,10,10\n12,8,16\n12,13,18\n12,2,8\n17,8,9\n12,6,4\n13,17,10\n17,6,6\n15,8,15\n7,17,13\n4,15,11\n10,12,17\n2,7,11\n17,13,10\n5,12,4\n11,3,13\n5,11,4\n14,3,10\n11,4,14\n10,1,13\n5,6,6\n2,10,12\n5,8,15\n13,7,3\n12,7,4\n15,14,7\n5,7,13\n8,6,3\n9,6,16\n16,5,11\n15,13,15\n9,14,17\n15,14,13\n14,5,6\n2,7,6\n13,15,5\n4,11,5\n8,4,6\n14,14,15\n17,5,10\n5,9,3\n11,5,4\n5,9,13\n16,8,15\n11,11,17\n10,3,4\n14,5,16\n6,9,15\n9,14,16\n9,5,5\n5,15,13\n9,11,3\n7,6,4\n12,13,3\n2,13,7\n10,13,17\n10,17,10\n13,3,9\n14,4,8\n18,8,8\n4,12,7\n6,17,12\n9,9,1\n16,8,12\n12,3,6\n6,5,14\n4,14,12\n15,11,13\n5,4,15\n4,15,12\n5,14,5\n10,4,16\n12,6,2\n15,13,4\n8,15,4\n14,5,14\n16,10,12\n6,17,11\n17,15,10\n16,13,10\n16,12,14\n10,14,3\n11,12,1\n4,10,14\n10,2,15\n16,13,14\n6,14,5\n2,9,7\n12,9,2\n8,18,11\n13,12,2\n7,9,3\n8,16,15\n12,3,15\n9,16,11\n16,9,7\n6,15,7\n12,2,13\n5,12,16\n6,12,17\n12,1,10\n11,13,14\n9,8,18\n15,10,17\n7,13,16\n11,2,11\n10,11,2\n13,16,14\n8,15,14\n8,4,13\n7,7,2\n13,10,1\n7,3,12\n12,2,10\n10,17,11\n3,13,9\n5,10,13\n10,10,16\n6,14,6\n7,6,2\n13,12,4\n15,3,13\n4,3,12\n7,10,18\n4,14,7\n15,9,4\n7,16,4\n11,3,6\n5,11,2\n2,9,13\n14,7,4\n14,15,10\n4,8,4\n7,6,16\n15,12,14\n17,7,10\n13,15,4\n16,4,8\n13,3,5\n6,16,8\n3,6,12\n6,16,7\n15,9,15\n4,6,10\n12,12,16\n2,8,10\n3,13,11\n8,5,6\n14,4,12\n10,9,18\n9,6,2\n6,9,3\n12,14,15\n10,5,12\n17,7,12\n7,11,17\n14,12,15\n18,9,8\n10,5,16\n14,9,16\n4,5,11\n5,13,8\n3,4,6\n2,6,11\n6,15,15\n9,5,2\n11,15,15\n7,16,13\n2,9,12\n1,9,10\n9,7,16\n9,11,17\n16,11,6\n14,16,8\n9,3,12\n8,14,4\n17,8,10\n17,5,9\n4,11,12\n3,5,13\n7,15,14\n11,8,17\n13,2,9\n10,17,12\n8,5,2\n16,16,12\n10,6,16\n16,6,7\n9,10,1\n9,16,15\n7,11,18\n4,9,16\n8,2,11\n7,16,11\n8,7,2\n7,9,2\n2,11,5\n6,3,7\n10,7,17\n6,5,16\n4,4,8\n11,9,4\n5,13,13\n14,6,14\n2,8,7\n14,5,5\n13,14,3\n15,14,8\n9,5,3\n16,4,11\n3,7,15\n7,16,12\n14,14,14\n4,9,5\n4,4,10\n2,14,12\n15,2,9\n9,15,4\n16,13,6\n7,7,3\n4,11,6\n1,12,9\n12,10,17\n5,12,14\n16,12,12\n6,6,5\n15,11,11\n11,4,5\n11,13,5\n18,13,9\n17,6,13\n12,4,12\n5,16,9\n10,9,17\n3,14" <> ...} ``` ```elixir cubes = puzzle_input |> String.split("\n", trim: true) |> Enum.map(fn line -> line |> String.split(",") |> Enum.map(&String.to_integer/1) |> List.to_tuple() end) |> MapSet.new() ``` ``` MapSet.new([ {12, 9, 18}, {11, 4, 5}, {2, 10, 6}, {12, 2, 8}, {14, 15, 15}, {5, 14, 12}, {10, 6, 18}, {6, 4, 6}, {11, 4, 3}, {6, 14, 3}, {4, 8, 4}, {17, 7, 9}, {7, 12, 16}, {14, 13, 3}, {12, 3, 16}, {13, 6, 2}, {5, 6, 5}, {17, 10, 11}, {4, 16, 9}, {17, 9, 9}, {6, 2, 10}, {13, 17, 13}, {12, 13, 3}, {3, 13, 7}, {13, 7, 4}, {17, 12, 7}, {7, 3, 13}, {12, 15, 15}, {15, 6, 4}, {17, 10, 8}, {9, 14, 13}, {3, 9, 4}, {14, 13, 9}, {15, 13, 4}, {13, 4, 15}, {7, 7, 15}, {6, 14, 8}, {11, 2, 16}, {7, 2, 8}, {3, 14, 13}, {4, 5, 6}, {3, 9, 14}, {4, 16, 12}, {14, 12, 12}, {14, 5, 15}, {17, 9, 12}, {15, 10, 15}, {8, 17, ...}, {2, ...}, {...}, ... ]) ``` ## Task 1 ```elixir sides = for {x, y, z} <- cubes, {place, {dx, dy, dz}} <- [ x: {-1, 0, 0}, y: {0, -1, 0}, z: {0, 0, -1}, x: {0, 0, 0}, y: {0, 0, 0}, z: {0, 0, 0} ], reduce: MapSet.new() do set -> side = {place, {x + dx, y + dy, z + dz}} if side in set do MapSet.delete(set, side) else MapSet.put(set, side) end end MapSet.size(sides) ``` ``` 3636 ``` ## Task 2 ```elixir max = Enum.reduce(cubes, {0, 0, 0}, fn {x, y, z}, {mx, my, mz} -> {max(x, mx), max(y, my), max(z, mz)} end) ``` ``` {19, 19, 19} ``` ```elixir defmodule Cave do def bfs([], _sides, outer, _visited), do: outer def bfs([{x, y, z} = p | queue], sides, outer, visited) do {min, max} = Enum.min_max([x, y, z]) if p in visited or max > 25 or min < -5 do bfs(queue, sides, outer, visited) else visited = MapSet.put(visited, p) {outer, xs1} = check(:x, p, {x + 1, y, z}, sides, outer, visited) {outer, xs2} = check(:x, {x - 1, y, z}, {x - 1, y, z}, sides, outer, visited) {outer, ys1} = check(:y, p, {x, y + 1, z}, sides, outer, visited) {outer, ys2} = check(:y, {x, y - 1, z}, {x, y - 1, z}, sides, outer, visited) {outer, zs1} = check(:z, p, {x, y, z + 1}, sides, outer, visited) {outer, zs2} = check(:z, {x, y, z - 1}, {x, y, z - 1}, sides, outer, visited) bfs(queue ++ xs1 ++ xs2 ++ ys1 ++ ys2 ++ zs1 ++ zs2, sides, outer, visited) end end defp check(axis, curr, next, sides, outer, visited) do cond do {axis, curr} in sides -> {MapSet.put(outer, {axis, curr}), []} next in visited -> {outer, []} true -> {outer, [next]} end end end ``` ``` {:module, Cave, <<70, 79, 82, 49, 0, 0, 14, ...>>, {:check, 6}} ``` ```elixir outer = Cave.bfs([{-5, -5, -5}], sides, MapSet.new(), MapSet.new()) ``` ``` MapSet.new([ x: {10, 19, 11}, z: {15, 16, 12}, z: {2, 16, 10}, z: {5, 13, 2}, y: {4, 3, 15}, x: {0, 13, 10}, x: {17, 12, 6}, z: {10, 11, 0}, z: {10, 5, 17}, z: {4, 7, 2}, x: {15, 16, 9}, x: {2, 7, 4}, z: {2, 8, 5}, y: {16, 13, 5}, x: {2, 6, 14}, x: {18, 12, 11}, y: {13, 17, 7}, z: {3, 9, 14}, y: {11, 3, 16}, x: {4, 10, 17}, y: {11, 2, 15}, z: {13, 4, 3}, x: {10, 17, 5}, y: {3, 12, 4}, y: {11, 18, 10}, z: {5, 17, 8}, y: {15, 16, 6}, y: {3, 3, 7}, z: {7, 1, 5}, x: {14, 2, 9}, y: {18, 5, 8}, x: {10, 1, 13}, x: {9, 16, 3}, x: {2, 15, 8}, y: {7, 4, 2}, x: {17, 6, 12}, x: {0, 9, 7}, x: {12, 8, 1}, x: {0, 11, 10}, z: {10, 16, 3}, x: {16, 5, 6}, z: {5, 10, 1}, z: {7, 4, 15}, z: {12, 11, 18}, y: {11, 17, 12}, z: {3, 5, 4}, z: {6, 1, 9}, x: {16, 8, ...}, z: {14, ...}, z: {...}, ... ]) ``` ```elixir MapSet.size(outer) ``` ``` 2102 ```