this repo has no description

ft: add day 02.2022

Changed files
+128 -62
2022
+11 -62
2022/day01.livemd
··· 35 35 puzzle_input 36 36 |> String.split("\n") 37 37 |> Enum.chunk_while( 38 - [], 38 + 0, 39 39 fn 40 - "", acc -> {:cont, Enum.reverse(acc), []} 41 - val, acc -> {:cont, [String.to_integer(val) | acc]} 40 + "", acc -> {:cont, acc, 0} 41 + val, acc -> {:cont, String.to_integer(val) + acc} 42 42 end, 43 43 fn 44 - [] -> {:cont, []} 45 - acc -> {:cont, Enum.reverse(acc), []} 44 + 0 -> {:cont, 0} 45 + acc -> {:cont, acc, 0} 46 46 end 47 47 ) 48 + |> Enum.sort(:desc) 48 49 ``` 49 50 50 51 <!-- livebook:{"output":true} --> 51 52 52 53 ``` 53 - [ 54 - [5800, 2273, 1315, 5801, 6352, 2649, 4140, 2115, 5298, 4441, 4428, 3773, 1076], 55 - [8063, 10386, 5705, 8397, 1084, 7661], 56 - [3661, 5756, 3231, 5162, 4930, 4675, 1113, 6795, 6415, 1144, 2900, 5147, 2966], 57 - [35187], 58 - [12434, 2038, 12435, 8757, 6976, 4532], 59 - [4642, 4431, 5126, 4672, 1724, 3012], 60 - [3801, 6564, 5401, 3913, 3090, 1484, 6227, 1283, 2501, 4601, 5860, 7036], 61 - [19257, 31867], 62 - [4292, 4518, 1298, 13147, 7463], 63 - [6784, 1065, 4015, 3154, 6429, 5067, 6535, 5731, 1270, 5870, 4934, 2800], 64 - [5227, 6294, 6733, 5177, 2773, 6553, 3219, 1446, 7005, 6036, 6872], 65 - [1721, 4408, 5577, 2799, 2257, 3149, 2389, 3713, 5588, 2324, 4595, 6018, 4926], 66 - [1233, 4799, 3380, 1975, 1924, 1578, 2338, 1546, 3708, 4020, 5872, 2519, 5334, 4416], 67 - [18103, 1692, 10497, 6786], 68 - [4837, 12315, 6510, 9221, 10023, 5698], 69 - [9781, 18818, 19784, 5100], 70 - [7596, 14668, 18708], 71 - [1932, 18024, 6361], 72 - [7302, 5163, 9039, 4774, 8726, 6538, 2054, 7238, 4233], 73 - [3375, 6049, 4925, 7129, 6075, 1262, 3836, 5878, 3292, 1316, 3924, 3530], 74 - [8653, 21172, 18837], 75 - [8052, 1672, 2962, 3270, 8160, 3033, 2004, 7774, 8182, 3047], 76 - [7917, 2458, 1040, 7210, 7742, 4296, 2861, 9324, 5721], 77 - [17851, 11236, 7107], 78 - [6962, 4498, 10042, 4539, 10759, 8378, 5781], 79 - [7156, 10063, 5329, 2449, 4749, 6498, 6493, 1924], 80 - [2161, 1309, 1770, 3195, 1581, 1194, 1455, 1350, 5298, 5290, 1872, 2155, 3060, 1514, 1872], 81 - [9664, 14392, 10201, 12693, 8817], 82 - [4960, 2281, 6321, 4953, 1439, 1372, 5253, 2338, 2516, 6332, 2760, 6702, 2354], 83 - [1341, 1489, 7110, 2267, 6809, 4198, 1137, 2526, 2087, 3885, 4952, 3056], 84 - [6561, 1313, 6624], 85 - [11571, 3452, 15300, 1518, 14811], 86 - [3421, 5270, 1676, 6712, 6231, 6617, 6775, 5428, 3497, 5598, 3723], 87 - [7879, 7984, 2678, 5770, 4217, 5323, 3708, 2799, 5466], 88 - [2895, 3934, 4468, 6864, 4531, 5622, 3281, 6518, 4313, 5273, 3945, 5378, 2585], 89 - [3486, 6101, 1036, 1079, 3380, 4542, 3617, 4279, 2397, 2172, 3711, 6251, 1219, 6320], 90 - [6785, 4840, 4314, 3647, 4660, 5968, 1932, 3144, 2131, 6556, 5107, 2018, 4441], 91 - [2958, 2812, 1812, 4047, 4055, 11311, 7254], 92 - [2563, 1559, 6369, 4595, 3617, 1979, 1988, 1648, 2520, 5216, 6227, ...], 93 - [4417, 5913, 2444, 6808, 4742, 2422, 5153, 6707, 6968, 6663, ...], 94 - [9949, 19801, 14001, 15160], 95 - [1166, 12942, 15632, 3266, 16053], 96 - [7820, 7480, 1377, 4492, 5371, 1411, 2455, ...], 97 - [17669, 8092], 98 - [8706, 7270, 2362, 3278, 7920, ...], 99 - [1300, 5806, 9993, 5891, ...], 100 - [6375, 2494, 2291, ...], 101 - [6224, 1559, ...], 102 - [16526, ...], 103 - [...], 104 - ... 105 - ] 54 + [66616, 66306, 66250, 65758, 65264, 65080, 64911, 64448, 64423, 64338, 63797, 63599, 62203, 61850, 55 + 61072, 60910, 60591, 60292, 60152, 59794, 59607, 59403, 59135, 59074, 58989, 58949, 58911, 58736, 56 + 58665, 58474, 58406, 57457, 57335, 56727, 56537, 56224, 56117, 56096, 55767, 55585, 55543, 55409, 57 + 55193, 55067, 54988, 54977, 54948, 54820, 54813, 54680, ...] 106 58 ``` 107 59 108 60 ## Task 1 109 61 110 62 ```elixir 111 63 elves 112 - |> Enum.map(&Enum.sum/1) 113 - |> Enum.max() 64 + |> List.first() 114 65 ``` 115 66 116 67 <!-- livebook:{"output":true} --> ··· 123 74 124 75 ```elixir 125 76 elves 126 - |> Enum.map(&Enum.sum/1) 127 - |> Enum.sort(:desc) 128 77 |> Enum.take(3) 129 78 |> Enum.sum() 130 79 ```
+117
2022/day02.livemd
··· 1 + <!-- livebook:{"persist_outputs":true} --> 2 + 3 + # Day 02 4 + 5 + ```elixir 6 + Mix.install([ 7 + {:kino_aoc, git: "https://github.com/ljgago/kino_aoc"} 8 + ]) 9 + ``` 10 + 11 + <!-- livebook:{"output":true} --> 12 + 13 + ``` 14 + :ok 15 + ``` 16 + 17 + ## Section 18 + 19 + <!-- livebook:{"attrs":{"day":"2","session_secret":"ADVENT_OF_CODE_SESSION","variable":"puzzle_input","year":"2022"},"kind":"Elixir.KinoAOC.HelperCell","livebook_object":"smart_cell"} --> 20 + 21 + ```elixir 22 + {:ok, puzzle_input} = 23 + KinoAOC.download_puzzle("2022", "2", System.fetch_env!("LB_ADVENT_OF_CODE_SESSION")) 24 + ``` 25 + 26 + <!-- livebook:{"output":true} --> 27 + 28 + ``` 29 + {:ok, 30 + "C Z\nC Y\nB X\nA Z\nC Z\nB X\nC Z\nB Z\nA Z\nA Z\nB Z\nB X\nC Z\nC Z\nA Z\nB Y\nB X\nC Y\nB X\nB X\nA Y\nA Z\nA Z\nA Z\nA Z\nC Z\nA Z\nC Z\nB X\nA X\nA Z\nB Y\nB X\nA Z\nB X\nC Z\nA Z\nC Z\nA Z\nA Z\nB X\nC X\nB X\nA X\nB X\nA Z\nA Z\nB X\nB Y\nB Y\nB Y\nC Z\nA Z\nA Z\nC X\nB X\nC Y\nB X\nC Z\nA Z\nC Z\nB X\nB X\nB Z\nB X\nA Z\nC Z\nA Z\nA Z\nA Z\nA Z\nB X\nC Z\nC Y\nA Z\nA Z\nA Z\nA Z\nC Z\nA X\nA Z\nA Z\nC Z\nC Y\nA Z\nC Y\nA Z\nA Z\nC Y\nC Z\nC Z\nA Z\nB Y\nB X\nB Y\nC Z\nA Z\nA Z\nA Z\nB Z\nC Z\nA Z\nB X\nC Y\nA Z\nB X\nA Z\nB Z\nA Z\nB X\nA Z\nB Y\nA Z\nA Z\nC Y\nA Z\nB Z\nA Z\nA Y\nB Y\nC Z\nA Z\nB X\nC Z\nC Z\nB X\nC Z\nC Z\nA Z\nB X\nC Z\nC Z\nA Z\nC Y\nA Z\nA Z\nB Y\nC Y\nA Z\nB X\nB Y\nB X\nB X\nA Z\nC Y\nA Z\nC Y\nA Z\nB Y\nC Z\nA Z\nA Z\nC Y\nA Z\nA Z\nC Z\nA Z\nA Z\nA Z\nC Y\nA Z\nB X\nC Z\nA Z\nC Z\nB Z\nC Z\nA Z\nC Y\nB X\nC Z\nC Z\nA Z\nC Y\nA Z\nB Y\nB X\nA Z\nC Y\nC Z\nB X\nC X\nB X\nC Y\nB X\nB X\nC Z\nB X\nA Z\nC X\nA Z\nC Z\nB X\nC Y\nA Z\nA Z\nC Z\nC Y\nA Z\nA Z\nA Z\nB X\nA Y\nB X\nC X\nC Z\nB X\nC Z\nC X\nA Z\nC Z\nB Z\nA X\nA Z\nC Y\nA Z\nC Z\nC Z\nB X\nC Z\nA X\nC Y\nC Z\nC Z\nC Z\nB Y\nC X\nB X\nA Z\nB Y\nA Z\nA Z\nC Y\nA Z\nB X\nA Y\nA Y\nC Y\nA Z\nA Z\nC Z\nA Z\nA Z\nA Z\nB Y\nB X\nB X\nA Z\nC X\nC Y\nA Z\nC Z\nA Z\nA Z\nA Z\nA Z\nA X\nA Z\nC Z\nA Z\nB Y\nA Y\nA Y\nC Y\nC Y\nB X\nB Y\nA Z\nA Z\nC X\nA Z\nB X\nC Y\nA Y\nA Y\nA Z\nC Y\nC Z\nB X\nA Z\nC Y\nB X\nC Z\nA Z\nB X\nA Z\nC Y\nB X\nC Z\nA Z\nA Z\nA Y\nA Z\nA Z\nC Y\nC Z\nA Z\nB X\nC Z\nC Y\nA Z\nA Z\nC Y\nA Z\nC Z\nB X\nA Z\nC Z\nA Z\nA Z\nA Z\nC Y\nC Y\nB X\nB Z\nB X\nA Z\nB Y\nB Y\nA Z\nA Z\nA Z\nB Y\nB Y\nC Y\nA Y\nA Z\nC X\nB X\nA Y\nB Y\nC Y\nA Z\nB Z\nC Y\nC Z\nB X\nA Z\nA X\nB X\nC Y\nB Z\nA Z\nB Y\nA Z\nB X\nA Z\nB X\nA Z\nC X\nC Y\nC Z\nB X\nC Z\nC Y\nA Z\nC X\nC Z\nA Z\nC Y\nA Y\nC Y\nC Y\nB Y\nA Z\nA Z\nA Y\nA Z\nC Z\nB X\nA Y\nB X\nB Y\nB X\nA Z\nC Z\nC Z\nC Y\nB X\nC Z\nA X\nA Z\nA Z\nA Y\nA Z\nA Z\nA Z\nA Z\nB Z\nB X\nB X\nC Y\nC Z\nC Z\nA Y\nB X\nC Z\nC X\nC Z\nB Y\nA Z\nB X\nB Y\nB X\nA Z\nB X\nB X\nA Z\nA Z\nC X\nB X\nC Z\nC X\nA Z\nA X\nC Z\nA Z\nA Z\nC Z\nB Z\nC Z\nB X\nA Z\nA Z\nC Z\nA Y\nA Z\nA Z\nC Y\nA Z\nB X\nB Y\nA Z\nA Y\nA X\nB X\nA Z\nA Z\nC Y\nC Y\nA Z\nC X\nA Z\nA Y\nA Z\nB Y\nA Z\nA Y\nB X\nC Z\nA Z\nB X\nA Z\nA Z\nB X\nA Z\nA Z\nB X\nA Z\nC Y\nA Z\nC Z\nC Y\nB Y\nB X\nA Z\nB Y\nA Z\nA Z\nB X\nA Z\nA Z\nB X\nC Z\nA Z\nC Z\nB X\nB X\nB Y\nA Y\nC Y\nB X\nA Z\nC Z\nA Z\nA Z\nA Z\nB X\nA Z\nB X\nA Z\nA Z\nA Z\nC Z\nA X\nB X\nB Z\nA Z\nA Z\nC Z\nA Z\nA Z\nA Z\nB Y\nA Y\nC Z\nB X\nB X\nC Y\nA Y\nA Z\nC X\nB Z\nA Z\nA Z\nC Z\nA Z\nA Y\nB Y\nC Z\nB X\nA Z\nA Z\nA Z\nC Z\nA Z\nA Y\nB X\nC Y\nA Z\nA Z\nA Z\nC X\nB X\nA Z\nA Z\nC Z\nB X\nA Z\nA Z\nA Z\nA Z\nA Z\nA Z\nC Y\nA Z\nB X\nA Y\nC Y\nA Z\nA Z\nB X\nA Z\nB Y\nA Y\nB X\nA X\nA Z\nC Z\nC Z\nC Y\nA Z\nB Y\nA Z\nC X\nA Z\nA Z\nB X\nA Z\nA Z\nB Y\nA Y\nA Z\nA Z\nB X\nC Y\nB X\nB Y\nC Y\nC X\nA Z\nA Z\nB Y\nA Z\nB Y\nC Y\nC Y\nA Z\nC Y\nA Z\nC Z\nA Z\nB X\nA Z\nA Z\nA X\nA Z\nA Z\nA Z\nA Z\nB Z\nC X\nB Y\nA Z\nC Z\nA Z\nA Z\nA Z\nC Z\nB X\nA Z\nB X\nC Y\nC Z\nA Z\nA Z\nC Z\nB X\nB X\nA Z\nA Z\nB X\nA Z\nA Z\nC Z\nA Z\nA Z\nA X\nC Z\nC Y\nA Z\nA Z\nA Z\nA Z\nC Z\nA Z\nA Z\nB Z\nA Z\nC Y\nA Z\nA Z\nB Y\nA Z\nA Z\nB X\nA Z\nB X\nA Z\nA Z\nC Y\nA Y\nC Y\nB Z\nB X\nB Y\nA Z\nA Z\nC Y\nA Z\nA Y\nB Z\nA Z\nC Y\nA Z\nA Z\nA X\nA Z\nB Y\nB Y\nA Z\nA Z\nA Z\nC Z\nC Z\nA Y\nC Y\nB X\nA Y\nB X\nB Y\nC X\nC Y\nC Y\nA Z\nC Z\nA Z\nA Z\nA Z\nB X\nA Z\nA Z\nA Z\nA Z\nA Y\nB X\nA Z\nA Z\nB X\nA Z\nA Z\nA Z\nA Z\nA X\nC Y\nB X\nA Z\nA Y\nC Y\nC Y\nA X\nA Z\nC X\nC Z\nA Z\nC X\nA Z\nA Z\nB Y\nA Z\nA Z\nA Z\nB X\nA Z\nA Z\nB X\nB X\nA Z\nA Z\nC Z\nC Z\nA Z\nC Z\nB X\nA Z\nA Z\nB X\nC Z\nC Z\nC Y\nC Z\nA Z\nB X\nA X\nC Z\nA X\nC Z\nA Z\nA Z\nA Z\nA Z\nA Z\nB X\nA Z\nB X\nC Y\nA Z\nA Z\nA Z\nC Z\nA Y\nA Y\nB Y\nA Z\nA Z\nC Y\nC Z\nB X\nB X\nA X\nC Z\nB X\nA Z\nA Z\nA Z\nB Z\nA Z\nC Y\nB X\nA Z\nA Z\nA Y\nB Y\nC Z\nC Z\nA Z\nA Z\nA Z\nB Y\nA Z\nC Y\nB X\nB Z\nC X\nB X\nC Y\nA X\nC Z\nA Z\nB X\nC X\nA Y\nC X\nA Z\nB X\nB X\nA Z\nA Z\nC Z\nB X\nB Z\nC Y\nC Z\nA Z\nB Y\nA Z\nA Z\nB X\nC Y\nA Z\nC Z\nA Z\nB Z\nC Z\nC Z\nA Z\nC Y\nA Z\nA Z\nA Z\nC Z\nC X\nB Y\nC Y\nA Z\nC Y\nC Y\nC X\nC Y\nA Z\nC Y\nC Y\nC X\nC X\nA Z\nB X\nA Z\nC Y\nA Z\nB X\nB X\nB X\nB X\nB X\nB Y\nA Z\nA Z\nC Z\nA Z\nA Z\nA Z\nC Z\nC Z\nC Z\nA Z\nA Z\nA Y\nA Z\nA Z\nA Y\nA X\nC Z\nA Z\nA Z\nC Z\nB X\nC Z\nB Y\nC Z\nA Y\nA Z\nC Y\nB X\nA Z\nC Y\nA Z\nC Z\nC Y\nB X\nA Z\nA Z\nA Z\nA Z\nA Z\nC X\nC Z\nA Z\nA Z\nA Z\nC Z\nA Z\nB X\nA Z\nA X\nA Z\nB X\nA Z\nC Z\nA Z\nA Y\nB X\nB Z\nA Z\nB X\nA Z\nA Z\nB Y\nA Z\nA Z\nC Y\nB Y\nC X\nA Z\nA Z\nA Z\nC Z\nA Z\nA Z\nA Z\nC Z\nA Z\nC Y\nB X\nA Z\nA Z\nC X\nA Z\nC Z\nA Z\nB Y\nA Z\nA Y\nC Z\nC Z\nA Y\nA Y\nA Z\nA X\nA Z\nA Z\nB X\nA Z\nA Z\nB X\nC Z\nA Z\nA Y\nB X\nA Z\nA Z\nC Z\nA Z\nA Z\nB X\nB Z\nA Z\nA X\nB Y\nA Z\nB X\nA Z\nC Z\nB X\nC Y\nA Z\nB X\nA Z\nA Z\nA Z\nB Z\nA Z\nC Z\nA Z\nC Z\nB X\nA Z\nB Z\nA Z\nC Z\nC Z\nB Y\nC Z\nA Z\nA Z\nC Y\nA Z\nA Z\nB X\nB Y\nC Z\nA Z\nC Z\nA Z\nC Z\nA Z\nB X\nA X\nB Y\nA Z\nC Z\nA Z\nC Z\nC Y\nB X\nC Z\nC Z\nB Y\nB X\nC Z\nB X\nC Y\nA Z\nC Y\nC Y\n" <> ...} 31 + ``` 32 + 33 + ```elixir 34 + translate = %{"A" => :rock, "B" => :paper, "C" => :scissors} 35 + points = %{rock: 1, paper: 2, scissors: 3} 36 + 37 + defmodule Day02 do 38 + @wins %{paper: :rock, rock: :scissors, scissors: :paper} 39 + 40 + def score(a, a), do: 3 41 + def score(a, b) when :erlang.map_get(a, @wins) == b, do: 6 42 + def score(_, _), do: 0 43 + 44 + for {a, b} <- @wins do 45 + def wins_with(unquote(a)), do: unquote(b) 46 + def loses_to(unquote(b)), do: unquote(a) 47 + end 48 + end 49 + 50 + freqs = 51 + puzzle_input 52 + |> String.split("\n", trim: true) 53 + |> Enum.map(fn <<a, ?\s, b>> -> {translate[<<a>>], <<b>>} end) 54 + |> Enum.frequencies() 55 + ``` 56 + 57 + <!-- livebook:{"output":true} --> 58 + 59 + ``` 60 + %{ 61 + {:paper, "X"} => 395, 62 + {:paper, "Y"} => 146, 63 + {:paper, "Z"} => 65, 64 + {:rock, "X"} => 77, 65 + {:rock, "Y"} => 113, 66 + {:rock, "Z"} => 1011, 67 + {:scissors, "X"} => 96, 68 + {:scissors, "Y"} => 242, 69 + {:scissors, "Z"} => 355 70 + } 71 + ``` 72 + 73 + ## Task 1 74 + 75 + I really dislike this task, because description of the task suggested that the goal is to find best strategy that do not win all rounds. Instead it is supposed to play strategy using **exact** steps defined in the example. 76 + 77 + Very poor wording. 78 + 79 + ```elixir 80 + strategy = %{"Y" => :paper, "X" => :rock, "Z" => :scissors} 81 + 82 + freqs 83 + |> Enum.reduce(0, fn {{b, c}, v}, acc -> 84 + choice = strategy[c] 85 + result = Day02.score(choice, b) 86 + acc + v * (points[choice] + result) 87 + end) 88 + ``` 89 + 90 + <!-- livebook:{"output":true} --> 91 + 92 + ``` 93 + 9241 94 + ``` 95 + 96 + ## Task 2 97 + 98 + ```elixir 99 + freqs 100 + |> Enum.reduce(0, fn {{b, strategy}, v}, acc -> 101 + choice = 102 + case strategy do 103 + "X" -> Day02.wins_with(b) 104 + "Y" -> b 105 + "Z" -> Day02.loses_to(b) 106 + end 107 + 108 + result = Day02.score(choice, b) 109 + acc + v * (points[choice] + result) 110 + end) 111 + ``` 112 + 113 + <!-- livebook:{"output":true} --> 114 + 115 + ``` 116 + 14610 117 + ```