this repo has no description
at master 4.5 kB view raw
1<!-- vim:ft=markdown --> 2 3<!-- livebook:{"persist_outputs":true} --> 4 5# Day 18 6 7## Input 8 9```elixir 10input = 11 File.stream!("day18.txt") 12 |> Enum.map(&elem(Code.eval_string(&1), 0)) 13``` 14 15<!-- livebook:{"output":true} --> 16 17``` 18[ 19 [[[6, [8, 3]], [2, 0]], [[[9, 5], [9, 1]], 3]], 20 [[[9, [2, 2]], [5, 4]], [[[2, 2], [9, 6]], '\a\a']], 21 [[[0, [3, 2]], 1], [[0, [2, 8]], [2, [0, 4]]]], 22 [[4, 4], [[[7, 0], 5], [3, 1]]], 23 [[5, 4], 1], 24 [[[[7, 6], 4], 9], [[9, 1], 9]], 25 [[[1, '\a\b'], ['\a\a', [1, 6]]], [1, [6, [7, 1]]]], 26 [[[[6, 8], [5, 6]], [[1, 1], 8]], [[[2, 0], [3, 1]], [2, [2, 6]]]], 27 [[[6, 3], [3, [7, 1]]], 8], 28 [[[9, 4], [3, [0, 6]]], [[2, [3, 6]], ['\t\b', [1, 6]]]], 29 [9, [0, [[0, 7], 2]]], 30 [[[[8, 4], 7], [[9, 2], [0, 9]]], ['\a\t', [8, [0, 9]]]], 31 [[1, 1], [[5, [3, 8]], [3, [4, 7]]]], 32 [[[9, [2, 9]], [2, [2, 9]]], [[[3, 5], 5], [[3, 3], 2]]], 33 [[[[5, 4], 9], 0], [[[5, 7], 2], [[5, 2], 9]]], 34 [[2, [[1, 0], [6, 2]]], 0], 35 [[[3, 7], [7, 6]], [[[2, 8], 5], [3, '\t\a']]], 36 [[2, [2, '\b\b']], [['\t\t', [1, 1]], [[8, 6], [0, 3]]]], 37 [[8, 1], [3, 5]], 38 [[7, [[7, 6], [2, 0]]], 4], 39 [[5, 4], [[1, 3], [5, [2, 8]]]], 40 '\a\t', 41 [[[[6, 9], 0], [1, [5, 0]]], [[[6, 4], 3], 7]], 42 [[[[3, 7], 3], [2, 6]], [[0, 4], '\t\t']], 43 [[[[1, 5], [5, 0]], [9, 4]], [[[8, 3], 3], [8, [3, 6]]]], 44 [[[[3, 7], 5], [[8, 5], [1, 5]]], [[0, 6], [3, 4]]], 45 [[[[4, 0], 2], [7, [8, 4]]], [0, [5, '\a\b']]], 46 [[[[0, 8], [0, 4]], [9, 3]], [[[5, 4], [4, 8]], [[1, 6], [5, 4]]]], 47 [[0, [0, 3]], [[3, [1, 5]], [[9, 6], [0, 6]]]], 48 [[9, [8, 4]], [7, 1]], 49 [[[[1, 9], '\a\a'], 9], [[6, [4, 5]], [8, [3, 2]]]], 50 [5, [[2, [9, 5]], [3, [4, 0]]]], 51 [[[6, 2], [[1, 8], 5]], 6], 52 [[8, [6, [6, 4]]], [0, ['\t\b', 7]]], 53 [[[[6, 3], [8, 0]], [8, [2, 7]]], 8], 54 [[[6, [3, 6]], [[4, 0], [4, 7]]], [0, [[4, 0], [4, 5]]]], 55 [[[3, [8, 1]], 1], [2, 3]], 56 [[[6, [7, 0]], [[3, 5], [3, 4]]], 7], 57 [[[[8, 0], 3], 8], [[[1, 6], 3], [[0, 5], 2]]], 58 [[[3, 7], ['\t\b', 8]], [[[8, 4], 7], [3, [1, 7]]]], 59 [[[0, 5], [[5, 5], '\a\b']], [9, [5, [2, 2]]]], 60 [[2, 9], [[[7, 4], 4], [[8, 0], [6, 9]]]], 61 [[['\a\b', '\b\b'], 0], 9], 62 [[[4, [0, 6]], [[5, 9], [0, ...]]], [3, [6, 7]]], 63 [[[7, [6, ...]], [5, [...]]], [[[3, ...], 6], [[...], ...]]], 64 [3, [[[...], ...], [...]]], 65 [[[3, ...], [...]], [[...], ...]], 66 [['\t\a', ...], [...]], 67 [[...], ...], 68 [...], 69 ... 70] 71``` 72 73```elixir 74defmodule Day18 do 75 def add(a, b) do 76 sum = reduce([a, b]) 77 78 # IO.puts(""" 79 # #{inspect(a, charlists: :as_list)} 80 # + #{inspect(b, charlists: :as_list)} 81 # = #{inspect(sum, charlists: :as_list)} 82 # """) 83 84 sum 85 end 86 87 defp reduce(list) do 88 # First try to explode 89 # If that returned list in the same form, then try to split it 90 # If all above returned input list, then we have reached fixed point 91 with ^list <- explode(list), 92 ^list <- split(list) do 93 list 94 else 95 new_list -> reduce(new_list) 96 end 97 end 98 99 defp explode(list) do 100 {_, _, exploded} = explode(list, 0) 101 102 exploded 103 end 104 105 defp explode(num, _) when is_number(num), do: {0, 0, num} 106 107 defp explode([a, b], 4), do: {a, b, 0} 108 109 defp explode([a, b], n) do 110 {la, ra, na} = explode(a, n + 1) 111 {lb, rb, nb} = explode(explode_add(ra, b), n + 1) 112 113 {la, rb, [explode_add(na, lb), nb]} 114 end 115 116 defp explode_add([a, b], v), do: [a, explode_add(b, v)] 117 defp explode_add(v, [a, b]), do: [explode_add(v, a), b] 118 defp explode_add(a, b), do: a + b 119 120 defp split(n) when n in 0..9, do: n 121 defp split(n) when is_integer(n), do: [div(n, 2), div(n + 1, 2)] 122 123 defp split([a, b]) do 124 with {:a, ^a} <- {:a, split(a)}, 125 {:b, ^b} <- {:b, split(b)} do 126 [a, b] 127 else 128 {:a, mod} -> [mod, b] 129 {:b, mod} -> [a, mod] 130 end 131 end 132 133 def magnitude(n) when is_number(n), do: n 134 def magnitude([a, b]), do: 3 * magnitude(a) + 2 * magnitude(b) 135end 136``` 137 138<!-- livebook:{"output":true} --> 139 140``` 141{:module, Day18, <<70, 79, 82, 49, 0, 0, 12, ...>>, {:magnitude, 1}} 142``` 143 144## Task 1 145 146```elixir 147flip = fn f -> &f.(&2, &1) end 148 149input 150|> Enum.reduce(flip.(&Day18.add/2)) 151|> IO.inspect(charlists: :as_list) 152|> Day18.magnitude() 153``` 154 155<!-- livebook:{"output":true} --> 156 157``` 158[[[[7, 7], [7, 8]], [[8, 7], [0, 7]]], [[[6, 6], [6, 7]], 6]] 159``` 160 161<!-- livebook:{"output":true} --> 162 163``` 1643411 165``` 166 167## Task 2 168 169```elixir 170for a <- input, 171 b <- input, 172 a != b, 173 m1 = Day18.magnitude(Day18.add(a, b)), 174 m2 = Day18.magnitude(Day18.add(b, a)), 175 reduce: 0 do 176 acc -> max(acc, max(m1, m2)) 177end 178``` 179 180<!-- livebook:{"output":true} --> 181 182``` 1834680 184```