+11
-62
2022/day01.livemd
+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
+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
+
```