Advent of Code 2024
Mix.install([
{:kino_aoc, "~> 0.1"}
])
Introduction
https://adventofcode.com/2024/day/2
Day 2
{:ok, day2} = KinoAOC.download_puzzle("2024", "2", System.fetch_env!("LB_AOC_SESSION"))
{:ok,
"2 5 6 8 6\n87 89 90 93 96 99 99\n13 14 15 18 19 23\n67 69 71 72 73 76 82\n29 32 30 31 34 35 37\n54 56 54 57 54\n70 73 75 74 77 79 81 81\n53 55 56 59 62 61 65\n90 93 95 92 99\n58 61 61 64 67\n36 37 37 39 42 39\n32 35 38 40 40 40\n17 19 19 21 22 23 25 29\n9 11 12 12 14 20\n20 22 26 27 28 29\n75 78 82 84 87 84\n78 79 83 85 88 91 91\n30 31 32 36 40\n68 69 72 76 79 82 88\n29 31 37 38 40 43 45 46\n23 26 31 34 32\n59 61 62 69 72 72\n39 40 42 49 50 53 55 59\n60 61 63 68 71 78\n27 25 26 27 30 31\n92 89 90 91 92 91\n25 24 26 28 28\n45 44 47 49 52 56\n45 44 47 48 55\n13 11 9 11 14 16 19\n70 69 71 68 70 73 72\n25 24 26 27 29 28 28\n43 41 43 42 43 44 48\n15 13 15 14 16 19 24\n26 23 26 28 28 31\n81 79 79 81 84 85 84\n15 12 15 15 15\n83 82 85 85 87 91\n33 31 32 32 39\n84 82 85 89 90\n67 64 67 71 72 75 78 76\n17 15 19 22 23 25 25\n44 42 43 47 51\n6 3 7 8 9 16\n39 36 38 43 44 45 48 50\n93 92 93 98 99 96\n19 16 19 20 22 25 31 31\n56 53 55 60 61 62 65 69\n19 18 21 23 28 30 35\n84 84 85 86 89\n44 44 45 48 47\n48 48 50 53 53\n84 84 85 86 89 91 94 98\n21 21 23 24 26 33\n38 38 40 37 39\n41 41 43 40 37\n6 6 3 6 9 10 10\n32 32 34 35 36 35 37 41\n54 54 52 53 55 56 61\n86 86 88 88 91 92 95 96\n42 42 42 43 44 46 47 46\n24 24 24 26 27 28 28\n38 38 39 39 43\n21 21 24 27 27 28 33\n52 52 54 57 61 62\n60 60 61 65 64\n45 45 46 47 51 54 57 57\n27 27 31 33 34 37 38 42\n21 21 22 26 27 34\n52 52 58 59 60 63 65 66\n47 47 54 56 57 56\n57 57 60 63 64 65 70 70\n39 39 42 47 50 53 56 60\n22 22 25 27 30 37 40 45\n8 12 15 16 18 19 22\n56 60 62 65 67 68 66\n78 82 83 85 88 89 89\n4 8 10 13 14 18\n80 84 86 88 90 91 96\n31 35 34 36 38 39\n33 37 40 43 44 46 43 40\n48 52 53 55 56 55 57 57\n66 70 67 68 69 72 76\n63 67 70 71 73 74 72 78\n36 40 40 43 45\n1 5 5 7 6\n61 65 67 68 71 74 74 74\n68 72 73 73 74 78\n37 41 42 44 44 47 48 53\n65 69 70 71 75 76\n13 17 18 20 23 27 30 27\n8 12 14 18 21 22 22\n7 11 12 15 19 21 24 28\n24 28 32 35 36 41\n59 63 66 71 72\n15 19 20 26 25\n25 29 34 36 36\n32 36 37 42 43 46 48 52\n8 12 19 20 22 28\n17 24 25 28 29 31 34\n74 81 82 85 83\n67 72 73 76 77 77\n22 27 30 33 34 37 38 42\n13 19 21 24 26 28 33\n50 57 58 57 60 63\n16 21 24 26 27 25 28 27\n84 91 89 91 92 95 95\n50 56 54 57 59 60 64\n4 9 11 13 16 14 19\n14 20 23 24 24 27\n64 70 73 73 72\n40 47 48 48 51 52 55 55\n80 86 86 88 91 93 95 99\n63 70 71 71 78\n20 26 30 31 34 37 39 40\n61 68 69 73 74 77 78 77\n64 71 74 76 79 81 85 85\n14 19 21 24 28 32\n3 10 12 14 16 18 22 29\n7 12 14 17 20 23 29 31\n49 56 62 65 67 65\n68 75 80 83 85 86 89 89\n51 58 59 65 68 70 74\n44 51 54 60 62 63 66 73\n33 32 29 26 29\n53 50 49 46 46\n55 54 53 52 50 49 46 42\n18 15 14 11 8 7 1\n52 50 47 49 47 46 45 42\n11 10 7 6 9 6 4 5\n90 89 88 90 88 88\n86 85 84 81 80 81 77\n26 24 26 25 24 22 17\n34 33 30 28 28 27 24 22\n34 32 29 27 27 30\n5 4 2 1 1 1\n41 38 36 35 35 32 31 27\n90 89 89 87 86 80\n81 80 77 73 72\n60 58 57 53 51 52\n98 96 95 92 88 88\n60 59 55 54 53 51 47\n68 66 62 59 52\n34 33 28 25 22\n37 34 31 26 24 22 20 21\n90 88 87 81 81\n51 49 43 40 38 34\n41 38 37 34 32 30 23 17\n53 56 54 53 52 50 48 45\n36 37 35 34 33 32 31 33\n83 84 83 82 82\n89 90 87 86 82\n72 75 72 69 66 63 58\n19 21 20 19 17 19 16\n91 94 93 96 97\n57 59 57 54 53 55 54 54\n77 80 81 80 78 75 74 70\n81 82 79 77 76 77 71\n83 84 83 83 81 79 76\n59 62 59 57 57 60\n84 87 86 84 84 83 83\n41 43 41 38 38 34\n74 75 73 73 67\n79 82 79 77 76 75 71 69\n46 49 45 44 45\n70 71 70 66 66\n34 36 35 32 28 24\n60 61 57 54 49\n15 17 14 8 7 6 5\n17 18 16 11 14\n91 93 86 83 81 80 80\n40 41 35 33 29\n31 34 32 30 25 24 17\n71 71 70 68 67 66\n65 65 64 61 58 57 60\n37 37 35 33 30 27 26 26\n67 67 66 65 61\n86 86 85 82 81 74\n95 95 92 95 92\n58 58 55 54 56 53 54\n37 37 35 32 33 30 28 28\n56 56 53 51 48 49 45\n33 33 30 29 28 31 26\n37 37 37 35 34 31 29\n26 26 26 25 28\n67 67 67 64 64\n80 80 77 77 73\n47 47 47 44 41 36\n54 54 52 50 46 45 42 41\n52 52 50 46 43 46\n38 38 34 32 31 29 29\n99 99 97 95 91 90 89 85\n26 26 24 20 18 16 14 8\n16 16 14 11 9 4 2\n78 78 75 73 67 69\n37 37 35 28 28\n83 83 80 79 73 69\n59 59 57 55 52 47 40\n57 53 52 51 49\n45 41 40 39 37 39\n99 95 93 92 90 89 86 86\n59 55 53 50 47 43\n59 55 52 49 44\n52 48 50 48 46\n96 92 90 87 90 89 91\n60 56 54 51 52 52\n17 13 11 13 11 10 6\n66 62 61 60 63 56\n72 68 65 65 62\n45 41 38 38 39\n56 52 49 48 48 48\n58 54 51 51 50 46\n69 65 62 " <> ...}
example = "7 6 4 2 1
1 2 7 8 9
9 7 6 2 1
1 3 2 4 5
8 6 4 4 1
1 3 6 7 9"
"7 6 4 2 1\n1 2 7 8 9\n9 7 6 2 1\n1 3 2 4 5\n8 6 4 4 1\n1 3 6 7 9"
defmodule Day2 do
def parse_input(str) do
str |> String.split("\n")
|> Enum.map(fn x -> String.split(x) |> Enum.map(&String.to_integer(&1)) end)
end
def is_safe_diff?([_]) do
true
end
def is_safe_diff?([a, b | rest]) do
diff = abs(a-b)
diff < 4 && diff > 0 && is_safe_diff?([b | rest])
end
def is_valid_report?(levels) do
asc = Enum.sort(levels)
desc = Enum.sort(levels, &(&1 >= &2))
(desc == levels || asc == levels) && Day2.is_safe_diff?(levels)
end
end
{:module, Day2, <<70, 79, 82, 49, 0, 0, 11, ...>>, {:is_valid_report?, 1}}
[report | _] = example |> Day2.parse_input()
[
[7, 6, 4, 2, 1],
[1, 2, 7, 8, 9],
[9, 7, 6, 2, 1],
[1, 3, 2, 4, 5],
[8, 6, 4, 4, 1],
[1, 3, 6, 7, 9]
]
Day2.is_valid_report?(report)
true
Day2.parse_input(day2) |> Enum.count(&Day2.is_valid_report?(&1))
572
Part 2
Day2.parse_input(day2) |> Enum.count(fn report ->
Day2.is_valid_report?(report) || report
|> Enum.with_index()
|> Enum.any?(fn {_, i} ->
List.delete_at(report, i)
|> Day2.is_valid_report?()
end)
end)
612