+102
2021/day14.txt
+102
2021/day14.txt
···
1
+
OFSNKKHCBSNKBKFFCVNB
2
+
3
+
KC -> F
4
+
CO -> S
5
+
FH -> K
6
+
VP -> P
7
+
KF -> S
8
+
SV -> O
9
+
CB -> H
10
+
PN -> F
11
+
NC -> N
12
+
BC -> F
13
+
NP -> O
14
+
SK -> F
15
+
HS -> C
16
+
SN -> V
17
+
OP -> F
18
+
ON -> N
19
+
FK -> N
20
+
SH -> B
21
+
HN -> N
22
+
BO -> V
23
+
VK -> H
24
+
SC -> K
25
+
KP -> O
26
+
VO -> V
27
+
HC -> P
28
+
BK -> B
29
+
VH -> N
30
+
PV -> O
31
+
HB -> H
32
+
VS -> F
33
+
KK -> B
34
+
HH -> B
35
+
CF -> F
36
+
PH -> C
37
+
NS -> V
38
+
SO -> P
39
+
NV -> K
40
+
BP -> N
41
+
SF -> V
42
+
SS -> K
43
+
FP -> N
44
+
PC -> S
45
+
OH -> B
46
+
CH -> H
47
+
VV -> S
48
+
VN -> O
49
+
OB -> K
50
+
PF -> H
51
+
CS -> C
52
+
PP -> O
53
+
NF -> H
54
+
SP -> P
55
+
OS -> V
56
+
BB -> P
57
+
NO -> F
58
+
VB -> V
59
+
HK -> C
60
+
NK -> O
61
+
HP -> B
62
+
HV -> V
63
+
BF -> V
64
+
KO -> F
65
+
BV -> H
66
+
KV -> B
67
+
OF -> V
68
+
NB -> F
69
+
VF -> C
70
+
PB -> B
71
+
FF -> H
72
+
CP -> C
73
+
KH -> H
74
+
NH -> P
75
+
PS -> P
76
+
PK -> P
77
+
CC -> K
78
+
BS -> V
79
+
SB -> K
80
+
OO -> B
81
+
OK -> F
82
+
BH -> B
83
+
CV -> F
84
+
FN -> V
85
+
CN -> P
86
+
KB -> B
87
+
FO -> H
88
+
PO -> S
89
+
HO -> H
90
+
CK -> B
91
+
KN -> C
92
+
FS -> K
93
+
OC -> P
94
+
FV -> N
95
+
OV -> K
96
+
BN -> H
97
+
HF -> V
98
+
VC -> S
99
+
FB -> S
100
+
NN -> P
101
+
FC -> B
102
+
KS -> N
+100
2021/day15.txt
+100
2021/day15.txt
···
1
+
1124751783612228519483416186391693192764152281421133194141163183224351733212394799536339411529842112
2
+
1299938854391228215712461147511117912185733411491416388811646391912138661213722223824151532652174491
3
+
3339197559983134739317425934547716331696227221882122961476799987711635499267472178182145359213635923
4
+
3275111279884782539314241187762113814171394161491634629424134127254634143155261122133724143114517171
5
+
3719252118791433135122231855197812222238914994648147192141951214948299478914959275216261881654181459
6
+
1611117951314292139456114142392662772939225937136486428161234281216234329234315111776511563151948482
7
+
2568826483341639224876553822412669632282339258375519267395999314194775717338955473111882125281113119
8
+
3211535497996954958315977618271374429983722314139733843419727946959246752499319415154271225547899217
9
+
9182381814515842193317619241122295417132515941811977373112934221316141138111911121121111793678163186
10
+
3844189817214722127981149242928145957137126937131386516329118218111198674162815191994371914762733967
11
+
2341991198198671797918854491942998311516141218456591158159195192211227471918835699934872448189793938
12
+
4914562622368117861639397331397217328431182986624263992197435816915439591962133158497224891382954532
13
+
7626651214813838216185911429272999894518636231382989678893369367388711391734813452975811156327428911
14
+
6619547343521975253174481211413831293662121339851815212317311237391545399111182897667911821424149598
15
+
9973191187241313192815214227191649743296915314888729322114168515823743777711899119191553298115729119
16
+
1139287494922611751257731929722771498336139611251121442114394245137973342111145499332316959261235284
17
+
2957197428427162517942347211164151149912112158641321995248419171621811597221619949431227171998811472
18
+
3942647388316719894411111531921126183713231811198382654685441319271454138942281133619242611612293827
19
+
7937119217256311112391437861121498616811956123353462521891125694135126297129995285155114368995531781
20
+
3451961913122271833382989211151286596622992323752134162138122516383189222433812253226845819142198221
21
+
2778119153629891339923532321818124533756116181684147179833125112111826952511175359231299984985971323
22
+
3111241849191534385261731569341927433476113958471723118832747854529179328115274125434719722218912131
23
+
3142339531392581988128137411211196234548128214999949588185228836196627923352221497911291281534111199
24
+
2247331434479875142918842833898559624238445292211715118881294135283574749565172271411631413491566199
25
+
5942278576394177315387294721122691617961774138211922471397191215938266718124567292193989959261637132
26
+
3165937631221963265792414421441393495719931248192344794567976762321141859115829128661211272472736862
27
+
6245216271127518123199222191484234611151315582117171596574729739922992724612599562343116361844622764
28
+
8113544322656226212151951279235114941989556194198115559251582213981835589429635885493383187341531965
29
+
9167334539972119189967382996641594933763662148772253141953186111414742999511119411388291132416516449
30
+
3613823811913288411123382135529243111267199921121439155729919326116169791514491996989971122517181152
31
+
8673611192477161631212112481894911858892968239143914865319658975331149334747126743512225484277694151
32
+
1573562476555619452428261559215411721579288335558515411134313992163812836653437129992833619198146362
33
+
1985275213511588337218921661953495211191671194622531866114745941231929893241192939732541431596251229
34
+
1265136118282217612545222191931962743537199362634214512441818421145212152171522295123221817416511192
35
+
8297798221482948311881157477219864767525628534952929138168821168196211119111519681828383199111919196
36
+
2534111997313111473186996839118152776719511994169115192212165984228917912783244345623614586619121326
37
+
5841498181267192895193154811932281737529524821838531213993721717189699211939288511893237393416182963
38
+
4291365191619323711913413926441339411267931111249294286234263722174939997111633217333235111582923441
39
+
1287162672582123747413148471918114922719181577167138269131143162782619895168443398922587114315692159
40
+
1265925622411611266789112299971891313715613359912627191225939742625214121139321211686759611131173819
41
+
2138953588999163543822384688714958315246965691333881631171314291246656696539111996811849918124146199
42
+
1246641611311144149732152211911939355725818779248359199268117115556131393567479697235189376137881341
43
+
2899323821125691382122622121279464139996512843263627599964991689326381239953514685697311811566519319
44
+
2736949532739218813892326217621918912123391961114292438971239114718244292915281445924621121161621333
45
+
3284227711481113791259114169152546556372395121491214478676766673451539272714243257528999117191132191
46
+
1491645992221246232691159831148693751711539199173418148515113374123227919399121713163369423119344294
47
+
9132112419279766149552388219119879126631964411873291514292382629182256527396923261916197289667422219
48
+
4435263531452645499818123111966429163563711994892138163281911392712947829833494132517185151159797235
49
+
3377999473376535692397871161267942211991447319627223732643859136911321291147933161219919912554143594
50
+
3949323991733462336411199416212721417161994737197381813716349241925143828318311249159179991229329171
51
+
1762136928289612837322111798838212828232194159395467913129898285979511558911359718111211715278482292
52
+
1118257643855683112121972927223668654922187717441698273158822189761169916992651219511457913769191141
53
+
1658133214212128183392871646163111119424394424612113962259435119311183885137744192432918197134375132
54
+
3591713174418138371811543613511348758114531127679321532212958111147949196891591688991927112311822659
55
+
1236514266615278952886111333113128112861958723136379141934411821192618183131222512832888648251713999
56
+
8123213361595969218132551112914729944243931512311795497816271296492513311341682399128274945195119112
57
+
2462825227696446183996491353919233459561152451155132169141431681617413626542619881461141223688519198
58
+
9621989515111471113381577698758628164221411666452251895517161458991756482464135232192737151721333241
59
+
1845633941916891433521922233371928968912324239271162428588753196413672815131973146761647212761387593
60
+
1213191632931181293214711139975148754136566435292974252811697693911887328591189183554433169371667213
61
+
4519131126388191338914531223891121466796183273431621945951424794146112514299112124121572531131372111
62
+
1331344969619935133794416261913442341424183712193444133541852317113515211181326734947129151289182833
63
+
1355758512615534971555911998128211268588155773916181718217932133414645114253821929111112911181223396
64
+
1921812718591189155234925136611421141621741789512111114849236968196293982164297416554297277314296498
65
+
2925818269222199331695127966441449818292484293218699694191219141796929886179788888289778893154112915
66
+
7349332956191336793938825411116431794116518627151175184126599498959181846349128914531693382871224114
67
+
2975711544499872811921879322745419629143299769241363453113298718372441111116129736331374245812629681
68
+
2419398835867978148157517197312837563211153716146118174293922233694112229384117648726494771916746336
69
+
2322473321962284111112435812293374144731592114895311931296931978723998962913118278111921783414789472
70
+
7421933294181593157278951313456166911311561151111468883991937345182554571275781533927232981213941792
71
+
1668835358177241114335636733193482471442299199859434499861711136613117473328576171139593142184617345
72
+
5339642815719926226879311379167325793396941892597215179614941121636812111539912741116971188971946499
73
+
7581333191573246312732795518731212368211299298495989164122116531125184283943222911391615243311251361
74
+
9492966914243222969499792183412424152773224381646928911135496174621299924524112331962952547214129323
75
+
2729194232211462151119459711313211822621531163797412446181172721913949189555142143791213834886518948
76
+
2754215791553781642269915399358262512494443343121198134218639979927842122994421127962456193396136699
77
+
8271611911227341219949383285981988595252121593129637541475392137413899839912239225135459931743267972
78
+
1332131171959982211855642861212718138325111114239233279171544919563891942832117949581464743292494391
79
+
5144166291493181763279457131141327146537961189933599395341461291371919123151359118199368625742376117
80
+
1636191619675379923419873222911119821251129276117414194193998142948136713325351617571519395951914216
81
+
6863238911796142259595658671251783127926389189168272138182549591741951937121824471372228139189226966
82
+
1398611275788896954682838421735924943417195641181143853286733633811931911189111341679192676374118319
83
+
7425912442414194918974222966129621141925526265112323617731363617133673511925955331462169117293471296
84
+
8311915233126172592295451734596934578641991127992454954549337724839691119685881916643781992923996572
85
+
7168461267393883112656311283191232322499117185912521188899182419918914911212513325386275539329721472
86
+
4418929132119621184239621272934448319225211997924183117861911136919317465941177911127948161449124731
87
+
9271153581452542386794695144559617972331134217961265186239771199325391879412411821372724989746391111
88
+
3752522113112162859371199119415298331514424128999524132149996846199915924629121214916277199845231181
89
+
8461129155427192357991128752552628161188794894374724397322312139214838121389889613819783991892292158
90
+
4999141138619713275215481369646529918918936887478711111135124192624311852137911719581517593373711112
91
+
9228956819912994881488113276489314945969876898139152128325918347915249723837311238669717631918756448
92
+
1272313111232619631582529173782417217912411245971957172218911853664936489571219898133821585115925152
93
+
1324983253974657485632276593196749111921819449973115611494598217724911344731933114417612111528118291
94
+
8521515271325847484517496514692991413334913117194153459926716822674627611191634943962214123151399931
95
+
1141639315518932691635973515217951611118329247113938399181114133617465682162932426295992195929458883
96
+
8229351197214731215324515139273121165384915712119675514893281751526119183679227515364941156137548174
97
+
6116894132781317191382191142114151317798773795981911112434921641114411589131331717998932176521898319
98
+
5362677393912312215419378899211815319464811111851912257961211293814411559971191515896993251933358962
99
+
6926527339383986515331739126963132928923957918814875739969162479336291216879152811764569629328261149
100
+
7598541186247351172883789213137911264491891391569216562276119911413437411237411934123311912324427449
+1
2021/day16.txt
+1
2021/day16.txt
···
1
+
620D49005AD2245800D0C9E72BD279CAFB0016B1FA2B1802DC00D0CC611A47FCE2A4ACE1DD144BFABBFACA002FB2C6F33DFF4A0C0119B169B013005F003720004263644384800087C3B8B51C26B449130802D1A0068A5BD7D49DE793A48B5400D8293B1F95C5A3005257B880F5802A00084C788AD0440010F8490F608CACE034401AB4D0F5802726B3392EE2199628CEA007001884005C92015CC8051800130EC0468A01042803B8300D8E200788018C027890088CE0049006028012AB00342A0060801B2EBE400424933980453EFB2ABB36032274C026E4976001237D964FF736AFB56F254CB84CDF136C1007E7EB42298FE713749F973F7283005656F902A004067CD27CC1C00D9CB5FDD4D0014348010C8331C21710021304638C513006E234308B060094BEB76CE3966AA007C6588A5670DC3754395485007A718A7F149CA2DD3B6E7B777800118E7B59C0ECF5AE5D3B6CB1496BAE53B7ADD78C013C00CD2629BF5371D1D4C537EA6E3A3E95A3E180592AC7246B34032CF92804001A1CCF9BA521782ECBD69A98648BC18025800F8C9C37C827CA7BEFB31EADF0AE801BA42B87935B8EF976194EEC426AAF640168CECAF84BC004AE7D1673A6A600B4AB65802D230D35CF81B803D3775683F3A3860087802132FB32F322C92A4C402524F2DE006E8000854378F710C0010D8F30FE224AE428C015E00D40401987F06E3600021D0CE3EC228DA000574E4C3080182931E936E953B200BF656E15400D3496E4A725B92998027C00A84EEEE6B347D30BE60094E537AA73A1D600B880371AA36C3200043235C4C866C018E4963B7E7AA2B379918C639F1550086064BB148BA499EC731004E1AC966BDBC7646600C080370822AC4C1007E38C428BE0008741689D0ECC01197CF216EA16802D3748FE91B25CAF6D5F11C463004E4FD08FAF381F6004D3232CC93E7715B463F780
+802
2021/solutions.livemd
+802
2021/solutions.livemd
···
1159
1159
```
1160
1160
1161
1161
## Day 14
1162
+
1163
+
```elixir
1164
+
[polymer_raw, subs] =
1165
+
File.read!("day14.txt")
1166
+
|> String.split("\n\n")
1167
+
1168
+
<<first, _::binary>> = polymer_raw
1169
+
1170
+
polymer =
1171
+
{first,
1172
+
polymer_raw
1173
+
|> String.to_charlist()
1174
+
|> Enum.chunk_every(2, 1, :discard)
1175
+
|> Enum.frequencies()}
1176
+
1177
+
subs =
1178
+
subs
1179
+
|> String.trim()
1180
+
|> String.split(["\n", " -> "])
1181
+
|> Enum.chunk_every(2)
1182
+
|> Map.new(fn [pair, <<new>>] -> {String.to_charlist(pair), new} end)
1183
+
1184
+
defmodule Day14 do
1185
+
def expand({hd, polymer}, subs) do
1186
+
new =
1187
+
polymer
1188
+
|> Enum.reduce(%{}, fn {[a, b] = pair, count}, acc ->
1189
+
s = Map.fetch!(subs, pair)
1190
+
1191
+
acc
1192
+
|> Map.update([a, s], count, &(&1 + count))
1193
+
|> Map.update([s, b], count, &(&1 + count))
1194
+
end)
1195
+
1196
+
{hd, new}
1197
+
end
1198
+
1199
+
def expand_naive(polymer, subs) do
1200
+
polymer
1201
+
|> to_charlist()
1202
+
|> Enum.chunk_every(2, 1, :discard)
1203
+
|> Enum.flat_map(fn [a, b] = pair ->
1204
+
[a, subs[pair], b]
1205
+
end)
1206
+
|> List.to_string()
1207
+
end
1208
+
1209
+
def frequencies({hd, polymer}) do
1210
+
polymer
1211
+
|> Enum.reduce(%{hd => 1}, fn {[_, b], count}, acc ->
1212
+
Map.update(acc, b, count, &(&1 + count))
1213
+
end)
1214
+
end
1215
+
end
1216
+
```
1217
+
1218
+
```output
1219
+
{:module, Day14, <<70, 79, 82, 49, 0, 0, 13, ...>>, {:frequencies, 1}}
1220
+
```
1221
+
1222
+
```elixir
1223
+
{{_, min}, {_, max}} =
1224
+
1..10
1225
+
|> Enum.reduce(polymer, fn _, acc ->
1226
+
Day14.expand(acc, subs)
1227
+
end)
1228
+
|> Day14.frequencies()
1229
+
|> Enum.min_max_by(&elem(&1, 1))
1230
+
1231
+
# 2768
1232
+
max - min
1233
+
```
1234
+
1235
+
```output
1236
+
2768
1237
+
```
1238
+
1239
+
```elixir
1240
+
{{_, min}, {_, max}} =
1241
+
1..40
1242
+
|> Enum.reduce(polymer, fn _, acc ->
1243
+
Day14.expand(acc, subs)
1244
+
end)
1245
+
|> Day14.frequencies()
1246
+
|> Enum.min_max_by(&elem(&1, 1))
1247
+
1248
+
max - min
1249
+
```
1250
+
1251
+
```output
1252
+
2914365137499
1253
+
```
1254
+
1255
+
## Day 15
1256
+
1257
+
```elixir
1258
+
input =
1259
+
File.read!("day15.txt")
1260
+
|> String.trim()
1261
+
|> String.split("\n")
1262
+
|> Enum.map(&String.to_charlist/1)
1263
+
|> Enum.with_index()
1264
+
|> Enum.flat_map(fn {row, y} ->
1265
+
row
1266
+
|> Enum.with_index()
1267
+
|> Enum.map(fn {v, x} -> {{x, y}, v - ?0} end)
1268
+
end)
1269
+
|> Map.new()
1270
+
1271
+
{width, height} = Enum.max(Map.keys(input))
1272
+
```
1273
+
1274
+
```output
1275
+
{99, 99}
1276
+
```
1277
+
1278
+
```elixir
1279
+
shortest_paths =
1280
+
for y <- height..0//-1,
1281
+
x <- width..0//-1,
1282
+
reduce: %{} do
1283
+
acc ->
1284
+
right = acc[{x + 1, y}]
1285
+
bottom = acc[{x, y + 1}]
1286
+
1287
+
value =
1288
+
case {right, bottom} do
1289
+
{nil, nil} -> input[{x, y}]
1290
+
_ -> input[{x, y}] + min(right, bottom)
1291
+
end
1292
+
1293
+
Map.put(acc, {x, y}, value)
1294
+
end
1295
+
1296
+
shortest_paths[{0, 0}] - input[{0, 0}]
1297
+
```
1298
+
1299
+
```output
1300
+
429
1301
+
```
1302
+
1303
+
```elixir
1304
+
defmodule Day15.Task2 do
1305
+
def expand_grid(board) do
1306
+
{width, height} = Enum.max(Map.keys(board))
1307
+
1308
+
board
1309
+
|> Enum.flat_map(fn {{x, y}, v} ->
1310
+
for rx <- 0..4, ry <- 0..4 do
1311
+
{{x + (width + 1) * rx, y + (height + 1) * ry}, rem(v - 1 + rx + ry, 9) + 1}
1312
+
end
1313
+
end)
1314
+
|> Map.new()
1315
+
end
1316
+
1317
+
def find_path(board, start, finish) do
1318
+
dists = :gb_sets.singleton({0, start})
1319
+
1320
+
find_path(board, finish, dists, MapSet.new())
1321
+
end
1322
+
1323
+
@surround for dx <- -1..1, dy <- -1..1, abs(dx) != abs(dy), do: {dx, dy}
1324
+
1325
+
def find_path(board, finish, dists, visited) do
1326
+
{{dist, {x, y} = curr}, dists} = :gb_sets.take_smallest(dists)
1327
+
1328
+
if curr == finish do
1329
+
dist
1330
+
else
1331
+
visited = MapSet.put(visited, curr)
1332
+
1333
+
dists =
1334
+
for {dx, dy} <- @surround,
1335
+
next = {x + dx, y + dy},
1336
+
next not in visited,
1337
+
is_map_key(board, next),
1338
+
alt = dist + board[next],
1339
+
reduce: dists do
1340
+
acc ->
1341
+
:gb_sets.add_element({alt, next}, acc)
1342
+
end
1343
+
1344
+
find_path(board, finish, dists, visited)
1345
+
end
1346
+
end
1347
+
end
1348
+
```
1349
+
1350
+
```output
1351
+
{:module, Day15.Task2, <<70, 79, 82, 49, 0, 0, 16, ...>>, {:find_path, 4}}
1352
+
```
1353
+
1354
+
```elixir
1355
+
input
1356
+
|> Day15.Task2.expand_grid()
1357
+
|> Day15.Task2.find_path({0, 0}, {499, 499})
1358
+
```
1359
+
1360
+
```output
1361
+
2844
1362
+
```
1363
+
1364
+
## Day 16
1365
+
1366
+
```elixir
1367
+
defmodule Day16 do
1368
+
defmodule Packet do
1369
+
defstruct [:version, :type, :value]
1370
+
end
1371
+
1372
+
def decode(<<version::3, 4::3, rest::bitstring>>) do
1373
+
{value, rest} = literal(rest, 0)
1374
+
1375
+
{%Packet{type: 4, version: version, value: value}, rest}
1376
+
end
1377
+
1378
+
def decode(<<version::3, type::3, 0::1, length::15, rest::bitstring>>) do
1379
+
<<subpackets::bitstring-size(length), rest::bitstring>> = rest
1380
+
1381
+
{%Packet{type: type, version: version, value: decode_all(subpackets)}, rest}
1382
+
end
1383
+
1384
+
def decode(<<version::3, type::3, 1::1, length::11, rest::bitstring>>) do
1385
+
{value, rest} = Enum.map_reduce(1..length, rest, fn _, acc -> decode(acc) end)
1386
+
1387
+
{%Packet{type: type, version: version, value: value}, rest}
1388
+
end
1389
+
1390
+
def decode_all(input) do
1391
+
case decode(input) do
1392
+
{packet, <<>>} -> [packet]
1393
+
{packet, rest} -> [packet | decode_all(rest)]
1394
+
end
1395
+
end
1396
+
1397
+
defp literal(<<1::1, bits::4, rest::bitstring>>, acc) do
1398
+
literal(rest, acc * 0x10 + bits)
1399
+
end
1400
+
1401
+
defp literal(<<0::1, bits::4, rest::bitstring>>, acc) do
1402
+
{acc * 0x10 + bits, rest}
1403
+
end
1404
+
end
1405
+
1406
+
input =
1407
+
File.read!("day16.txt")
1408
+
|> String.trim()
1409
+
|> Base.decode16!()
1410
+
|> Day16.decode()
1411
+
|> elem(0)
1412
+
```
1413
+
1414
+
```output
1415
+
%Day16.Packet{
1416
+
type: 0,
1417
+
value: [
1418
+
%Day16.Packet{
1419
+
type: 1,
1420
+
value: [
1421
+
%Day16.Packet{type: 4, value: 20, version: 6},
1422
+
%Day16.Packet{
1423
+
type: 6,
1424
+
value: [
1425
+
%Day16.Packet{type: 4, value: 14747, version: 1},
1426
+
%Day16.Packet{type: 4, value: 14747, version: 6}
1427
+
],
1428
+
version: 2
1429
+
}
1430
+
],
1431
+
version: 1
1432
+
},
1433
+
%Day16.Packet{
1434
+
type: 3,
1435
+
value: [
1436
+
%Day16.Packet{type: 4, value: 15, version: 5},
1437
+
%Day16.Packet{type: 4, value: 10, version: 6}
1438
+
],
1439
+
version: 7
1440
+
},
1441
+
%Day16.Packet{
1442
+
type: 1,
1443
+
value: [
1444
+
%Day16.Packet{
1445
+
type: 7,
1446
+
value: [
1447
+
%Day16.Packet{type: 4, value: 2184, version: 1},
1448
+
%Day16.Packet{type: 4, value: 130250, version: 6}
1449
+
],
1450
+
version: 6
1451
+
},
1452
+
%Day16.Packet{type: 4, value: 5442981, version: 4}
1453
+
],
1454
+
version: 6
1455
+
},
1456
+
%Day16.Packet{type: 4, value: 8281083, version: 0},
1457
+
%Day16.Packet{
1458
+
type: 2,
1459
+
value: [
1460
+
%Day16.Packet{type: 4, value: 102, version: 5},
1461
+
%Day16.Packet{type: 4, value: 647125, version: 7}
1462
+
],
1463
+
version: 1
1464
+
},
1465
+
%Day16.Packet{
1466
+
type: 1,
1467
+
value: [
1468
+
%Day16.Packet{type: 4, value: 178, version: 1},
1469
+
%Day16.Packet{type: 4, value: 176, version: 6}
1470
+
],
1471
+
version: 0
1472
+
},
1473
+
%Day16.Packet{
1474
+
type: 1,
1475
+
value: [
1476
+
%Day16.Packet{
1477
+
type: 6,
1478
+
value: [
1479
+
%Day16.Packet{
1480
+
type: 0,
1481
+
value: [
1482
+
%Day16.Packet{type: 4, value: 13, version: 1},
1483
+
%Day16.Packet{type: 4, value: 8, version: 4},
1484
+
%Day16.Packet{type: 4, value: 4, version: 3}
1485
+
],
1486
+
version: 2
1487
+
},
1488
+
%Day16.Packet{
1489
+
type: 0,
1490
+
value: [
1491
+
%Day16.Packet{type: 4, value: 7, version: 7},
1492
+
%Day16.Packet{type: 4, value: 11, version: 3},
1493
+
%Day16.Packet{type: 4, value: 14, version: 2}
1494
+
],
1495
+
version: 4
1496
+
}
1497
+
],
1498
+
version: 7
1499
+
},
1500
+
%Day16.Packet{type: 4, value: 2724, version: 0}
1501
+
],
1502
+
version: 1
1503
+
},
1504
+
%Day16.Packet{type: 4, value: 9, version: 4},
1505
+
%Day16.Packet{
1506
+
type: 1,
1507
+
value: [
1508
+
%Day16.Packet{
1509
+
type: 5,
1510
+
value: [
1511
+
%Day16.Packet{type: 4, value: 7240238, version: 2},
1512
+
%Day16.Packet{type: 4, value: 233, version: 7}
1513
+
],
1514
+
version: 1
1515
+
},
1516
+
%Day16.Packet{type: 4, value: 37, version: 6}
1517
+
],
1518
+
version: 4
1519
+
},
1520
+
%Day16.Packet{type: 2, value: [%Day16.Packet{type: 4, value: 2, version: 5}], version: 5},
1521
+
%Day16.Packet{type: 4, value: 53749, version: 4},
1522
+
%Day16.Packet{type: 4, value: 11, version: 3},
1523
+
%Day16.Packet{
1524
+
type: 1,
1525
+
value: [
1526
+
%Day16.Packet{type: 4, value: 382979, version: 4},
1527
+
%Day16.Packet{
1528
+
type: 5,
1529
+
value: [
1530
+
%Day16.Packet{
1531
+
type: 0,
1532
+
value: [
1533
+
%Day16.Packet{type: 4, value: 15, version: 1},
1534
+
%Day16.Packet{type: 4, value: 10, version: 0},
1535
+
%Day16.Packet{type: 4, value: 2, version: 6}
1536
+
],
1537
+
version: 5
1538
+
},
1539
+
%Day16.Packet{
1540
+
type: 0,
1541
+
value: [
1542
+
%Day16.Packet{type: 4, value: 4, version: 7},
1543
+
%Day16.Packet{type: 4, value: 7, version: 4},
1544
+
%Day16.Packet{type: 4, value: 2, version: 5}
1545
+
],
1546
+
version: 1
1547
+
}
1548
+
],
1549
+
version: 6
1550
+
}
1551
+
],
1552
+
version: 2
1553
+
},
1554
+
%Day16.Packet{type: 4, value: 21251, version: 1},
1555
+
%Day16.Packet{
1556
+
type: 1,
1557
+
value: [
1558
+
%Day16.Packet{type: 4, value: 163, version: 6},
1559
+
%Day16.Packet{
1560
+
type: 5,
1561
+
value: [
1562
+
%Day16.Packet{type: 4, value: 59, version: 3},
1563
+
%Day16.Packet{type: 4, value: 836848134220, version: 1}
1564
+
],
1565
+
version: 6
1566
+
}
1567
+
],
1568
+
version: 2
1569
+
},
1570
+
%Day16.Packet{
1571
+
type: 2,
1572
+
value: [
1573
+
%Day16.Packet{
1574
+
type: 0,
1575
+
value: [
1576
+
%Day16.Packet{
1577
+
type: 0,
1578
+
value: [
1579
+
%Day16.Packet{
1580
+
type: 2,
1581
+
value: [
1582
+
%Day16.Packet{
1583
+
type: 2,
1584
+
value: [
1585
+
%Day16.Packet{
1586
+
type: 0,
1587
+
value: [
1588
+
%Day16.Packet{
1589
+
type: 3,
1590
+
value: [
1591
+
%Day16.Packet{
1592
+
type: 2,
1593
+
value: [
1594
+
%Day16.Packet{
1595
+
type: 2,
1596
+
value: [
1597
+
%Day16.Packet{
1598
+
type: 3,
1599
+
value: [%Day16.Packet{type: 0, value: [...], ...}],
1600
+
version: 0
1601
+
}
1602
+
],
1603
+
version: 1
1604
+
}
1605
+
],
1606
+
version: 1
1607
+
}
1608
+
],
1609
+
version: 7
1610
+
}
1611
+
],
1612
+
version: 0
1613
+
}
1614
+
],
1615
+
version: 6
1616
+
}
1617
+
],
1618
+
version: 2
1619
+
}
1620
+
],
1621
+
version: 2
1622
+
}
1623
+
],
1624
+
version: 6
1625
+
}
1626
+
],
1627
+
version: 7
1628
+
},
1629
+
%Day16.Packet{type: 1, value: [%Day16.Packet{type: 4, value: 44, version: 4}], version: 7},
1630
+
%Day16.Packet{
1631
+
type: 1,
1632
+
value: [
1633
+
%Day16.Packet{type: 4, value: 255, version: 2},
1634
+
%Day16.Packet{type: 4, value: 91, version: 5},
1635
+
%Day16.Packet{type: 4, value: 176, version: 5},
1636
+
%Day16.Packet{type: 4, value: 23, version: 1}
1637
+
],
1638
+
version: 7
1639
+
},
1640
+
%Day16.Packet{
1641
+
type: 3,
1642
+
value: [
1643
+
%Day16.Packet{type: 4, value: 11520, version: 4},
1644
+
%Day16.Packet{type: 4, value: 6069, version: 0},
1645
+
%Day16.Packet{type: 4, value: 1089149511401, version: 4},
1646
+
%Day16.Packet{type: 4, value: 158, version: 2},
1647
+
%Day16.Packet{type: 4, value: 620605, version: 0}
1648
+
],
1649
+
version: 2
1650
+
},
1651
+
%Day16.Packet{
1652
+
type: 0,
1653
+
value: [
1654
+
%Day16.Packet{type: 4, value: 62788, version: 7},
1655
+
%Day16.Packet{type: 4, value: 9410622, version: 2},
1656
+
%Day16.Packet{type: 4, value: 15912821, version: 4}
1657
+
],
1658
+
version: 4
1659
+
},
1660
+
%Day16.Packet{
1661
+
type: 1,
1662
+
value: [
1663
+
%Day16.Packet{type: 4, value: 22416, version: 5},
1664
+
%Day16.Packet{
1665
+
type: 5,
1666
+
value: [
1667
+
%Day16.Packet{type: 4, value: 246, version: 1},
1668
+
%Day16.Packet{type: 4, value: 246, version: 4}
1669
+
],
1670
+
version: 2
1671
+
}
1672
+
],
1673
+
version: 0
1674
+
},
1675
+
%Day16.Packet{type: 3, value: [%Day16.Packet{type: 4, value: 13008601, version: 5}], version: 0},
1676
+
%Day16.Packet{
1677
+
type: 0,
1678
+
value: [
1679
+
%Day16.Packet{
1680
+
type: 1,
1681
+
value: [
1682
+
%Day16.Packet{type: 4, value: 3, version: 4},
1683
+
%Day16.Packet{type: 4, value: 14, version: 1},
1684
+
%Day16.Packet{type: 4, value: 5, version: 0}
1685
+
],
1686
+
version: 5
1687
+
},
1688
+
%Day16.Packet{
1689
+
type: 1,
1690
+
value: [
1691
+
%Day16.Packet{type: 4, value: 2, version: 1},
1692
+
%Day16.Packet{type: 4, value: 14, version: 1},
1693
+
%Day16.Packet{type: 4, value: 10, version: 1}
1694
+
],
1695
+
version: 6
1696
+
},
1697
+
%Day16.Packet{
1698
+
type: 1,
1699
+
value: [
1700
+
%Day16.Packet{type: 4, value: 8, version: 3},
1701
+
%Day16.Packet{type: 4, value: 6, version: 6},
1702
+
%Day16.Packet{type: 4, value: 11, version: 0}
1703
+
],
1704
+
version: 1
1705
+
}
1706
+
],
1707
+
version: 5
1708
+
},
1709
+
%Day16.Packet{
1710
+
type: 1,
1711
+
value: [
1712
+
%Day16.Packet{type: 4, value: 32940592237, version: 2},
1713
+
%Day16.Packet{
1714
+
type: 5,
1715
+
value: [
1716
+
%Day16.Packet{type: 4, value: 100, version: 1},
1717
+
%Day16.Packet{type: 4, value: 1393232728, version: 2}
1718
+
],
1719
+
version: 2
1720
+
}
1721
+
],
1722
+
version: 0
1723
+
},
1724
+
%Day16.Packet{type: 4, value: 89, version: 3},
1725
+
%Day16.Packet{
1726
+
type: 2,
1727
+
value: [
1728
+
%Day16.Packet{type: 4, value: 204, version: 6},
1729
+
%Day16.Packet{type: 4, value: 260321821, version: 2},
1730
+
%Day16.Packet{type: 4, value: 225241983, version: 6}
1731
+
],
1732
+
version: 0
1733
+
},
1734
+
%Day16.Packet{
1735
+
type: 0,
1736
+
value: [
1737
+
%Day16.Packet{type: 4, value: 960899, version: 3},
1738
+
%Day16.Packet{type: 4, value: 58997, version: 5},
1739
+
%Day16.Packet{type: 4, value: 54940, version: 6},
1740
+
%Day16.Packet{type: 4, value: 10974, version: 2},
1741
+
%Day16.Packet{type: 4, value: 882043, version: 2}
1742
+
],
1743
+
version: 0
1744
+
},
1745
+
%Day16.Packet{
1746
+
type: 1,
1747
+
value: [
1748
+
%Day16.Packet{
1749
+
type: 6,
1750
+
value: [
1751
+
%Day16.Packet{type: 4, value: 35633017255, version: 4},
1752
+
%Day16.Packet{type: 4, value: 35633017255, version: 2}
1753
+
],
1754
+
version: 3
1755
+
},
1756
+
%Day16.Packet{type: 4, value: 1359, version: 6}
1757
+
],
1758
+
version: 6
1759
+
},
1760
+
%Day16.Packet{
1761
+
type: 1,
1762
+
value: [
1763
+
%Day16.Packet{type: 4, value: 92, version: 4},
1764
+
%Day16.Packet{type: 4, value: 38, version: 3},
1765
+
%Day16.Packet{type: 4, value: 160, version: 5},
1766
+
%Day16.Packet{type: 4, value: 111, version: 1},
1767
+
%Day16.Packet{type: 4, value: 64, version: 4}
1768
+
],
1769
+
version: 4
1770
+
},
1771
+
%Day16.Packet{
1772
+
type: 0,
1773
+
value: [
1774
+
%Day16.Packet{type: 4, value: 2541, version: 3},
1775
+
%Day16.Packet{type: 4, value: 263947, version: 6},
1776
+
%Day16.Packet{type: 4, value: 7686705, version: 5},
1777
+
%Day16.Packet{type: 4, value: 31, version: 4}
1778
+
],
1779
+
version: 2
1780
+
},
1781
+
%Day16.Packet{
1782
+
type: 1,
1783
+
value: [
1784
+
%Day16.Packet{
1785
+
type: 6,
1786
+
value: [
1787
+
%Day16.Packet{type: 4, value: 3193865, version: 1},
1788
+
%Day16.Packet{type: 4, value: 20223, version: 7}
1789
+
],
1790
+
version: 2
1791
+
},
1792
+
%Day16.Packet{type: 4, value: 9328522, version: 5}
1793
+
],
1794
+
version: 0
1795
+
},
1796
+
%Day16.Packet{
1797
+
type: 2,
1798
+
value: [
1799
+
%Day16.Packet{type: 4, value: 5, version: 4},
1800
+
%Day16.Packet{type: 4, value: 7, version: 3},
1801
+
%Day16.Packet{type: 4, value: 179420284, version: 4},
1802
+
%Day16.Packet{type: 4, value: 19890, version: 1},
1803
+
%Day16.Packet{type: 4, value: 2655, version: 0}
1804
+
],
1805
+
version: 7
1806
+
},
1807
+
%Day16.Packet{
1808
+
type: 1,
1809
+
value: [
1810
+
%Day16.Packet{type: 4, value: 862089, version: 1},
1811
+
%Day16.Packet{
1812
+
type: 6,
1813
+
value: [
1814
+
%Day16.Packet{type: 4, value: 248, version: 3},
1815
+
%Day16.Packet{type: 4, value: 3286, version: 5}
1816
+
],
1817
+
version: 3
1818
+
}
1819
+
],
1820
+
version: 3
1821
+
},
1822
+
%Day16.Packet{
1823
+
type: 1,
1824
+
value: [
1825
+
%Day16.Packet{type: 4, value: 93, version: 6},
1826
+
%Day16.Packet{
1827
+
type: 5,
1828
+
value: [
1829
+
%Day16.Packet{type: 4, value: 4269, version: 6},
1830
+
%Day16.Packet{type: 4, value: 240, version: 3}
1831
+
],
1832
+
version: 4
1833
+
}
1834
+
],
1835
+
version: 5
1836
+
},
1837
+
%Day16.Packet{
1838
+
type: 3,
1839
+
value: [
1840
+
%Day16.Packet{type: 4, value: 2938, version: 6},
1841
+
%Day16.Packet{type: 4, value: 3, version: 6},
1842
+
%Day16.Packet{type: 4, value: 211, version: 7}
1843
+
],
1844
+
version: 3
1845
+
},
1846
+
%Day16.Packet{
1847
+
type: 1,
1848
+
value: [
1849
+
%Day16.Packet{
1850
+
type: 7,
1851
+
value: [
1852
+
%Day16.Packet{type: 4, value: 159, version: 0},
1853
+
%Day16.Packet{type: 4, value: 159, version: 5}
1854
+
],
1855
+
version: 0
1856
+
},
1857
+
%Day16.Packet{type: 4, value: 28, version: 1}
1858
+
],
1859
+
version: 4
1860
+
},
1861
+
%Day16.Packet{type: 4, value: 84, version: 4},
1862
+
%Day16.Packet{
1863
+
type: 1,
1864
+
value: [
1865
+
%Day16.Packet{type: 4, value: 235, version: 4},
1866
+
%Day16.Packet{
1867
+
type: 6,
1868
+
value: [
1869
+
%Day16.Packet{type: 0, value: [%Day16.Packet{...}, ...], version: 4},
1870
+
%Day16.Packet{type: 0, value: [...], ...}
1871
+
],
1872
+
version: 3
1873
+
}
1874
+
],
1875
+
version: 6
1876
+
},
1877
+
%Day16.Packet{type: 4, value: 1425, version: 4},
1878
+
%Day16.Packet{
1879
+
type: 1,
1880
+
value: [
1881
+
%Day16.Packet{
1882
+
type: 7,
1883
+
value: [%Day16.Packet{type: 0, value: [...], ...}, %Day16.Packet{type: 0, ...}],
1884
+
version: 5
1885
+
},
1886
+
%Day16.Packet{type: 4, value: 13, version: 2}
1887
+
],
1888
+
version: 2
1889
+
},
1890
+
%Day16.Packet{type: 0, value: [%Day16.Packet{type: 4, value: 3121, version: 6}], version: 5},
1891
+
%Day16.Packet{
1892
+
type: 1,
1893
+
value: [
1894
+
%Day16.Packet{type: 4, value: 51, version: 2},
1895
+
%Day16.Packet{type: 4, value: 61, ...},
1896
+
%Day16.Packet{type: 4, ...}
1897
+
],
1898
+
version: 4
1899
+
},
1900
+
%Day16.Packet{
1901
+
type: 1,
1902
+
value: [%Day16.Packet{type: 4, value: 1393, ...}, %Day16.Packet{type: 5, ...}],
1903
+
version: 3
1904
+
},
1905
+
%Day16.Packet{type: 1, value: [%Day16.Packet{type: 7, ...}, %Day16.Packet{...}], version: 3},
1906
+
%Day16.Packet{type: 1, value: [%Day16.Packet{...}, ...], version: 7},
1907
+
%Day16.Packet{type: 3, value: [...], ...},
1908
+
%Day16.Packet{type: 2, ...},
1909
+
%Day16.Packet{...},
1910
+
...
1911
+
],
1912
+
version: 3
1913
+
}
1914
+
```
1915
+
1916
+
```elixir
1917
+
defmodule Day16.Task1 do
1918
+
alias Day16.Packet
1919
+
1920
+
def sum(%Packet{type: 4, version: version}), do: version
1921
+
1922
+
def sum(%Packet{version: version, value: value}) do
1923
+
Enum.reduce(value, version, &(sum(&1) + &2))
1924
+
end
1925
+
end
1926
+
1927
+
Day16.Task1.sum(input)
1928
+
```
1929
+
1930
+
```output
1931
+
949
1932
+
```
1933
+
1934
+
```elixir
1935
+
defmodule Day16.Task2 do
1936
+
alias Day16.Packet
1937
+
1938
+
def evaluate(%Packet{type: 0} = packet), do: reduce(packet, 0, &+/2)
1939
+
def evaluate(%Packet{type: 1} = packet), do: reduce(packet, 1, &*/2)
1940
+
def evaluate(%Packet{type: 2} = packet), do: reduce(packet, :inf, &min/2)
1941
+
def evaluate(%Packet{type: 3} = packet), do: reduce(packet, 0, &max/2)
1942
+
1943
+
def evaluate(%Packet{type: 4, value: value}), do: value
1944
+
1945
+
def evaluate(%Packet{type: 5} = packet), do: compare(packet, &>/2)
1946
+
def evaluate(%Packet{type: 6} = packet), do: compare(packet, &</2)
1947
+
def evaluate(%Packet{type: 7} = packet), do: compare(packet, &==/2)
1948
+
1949
+
defp reduce(%Packet{value: value}, initial, op) do
1950
+
Enum.reduce(value, initial, &op.(evaluate(&1), &2))
1951
+
end
1952
+
1953
+
defp compare(%Packet{value: [a, b]}, op) do
1954
+
if op.(evaluate(a), evaluate(b)), do: 1, else: 0
1955
+
end
1956
+
end
1957
+
1958
+
Day16.Task2.evaluate(input)
1959
+
```
1960
+
1961
+
```output
1962
+
1114600142730
1963
+
```