this repo has no description

ft: add day 14, 15, and 16

+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
··· 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 + 620D49005AD2245800D0C9E72BD279CAFB0016B1FA2B1802DC00D0CC611A47FCE2A4ACE1DD144BFABBFACA002FB2C6F33DFF4A0C0119B169B013005F003720004263644384800087C3B8B51C26B449130802D1A0068A5BD7D49DE793A48B5400D8293B1F95C5A3005257B880F5802A00084C788AD0440010F8490F608CACE034401AB4D0F5802726B3392EE2199628CEA007001884005C92015CC8051800130EC0468A01042803B8300D8E200788018C027890088CE0049006028012AB00342A0060801B2EBE400424933980453EFB2ABB36032274C026E4976001237D964FF736AFB56F254CB84CDF136C1007E7EB42298FE713749F973F7283005656F902A004067CD27CC1C00D9CB5FDD4D0014348010C8331C21710021304638C513006E234308B060094BEB76CE3966AA007C6588A5670DC3754395485007A718A7F149CA2DD3B6E7B777800118E7B59C0ECF5AE5D3B6CB1496BAE53B7ADD78C013C00CD2629BF5371D1D4C537EA6E3A3E95A3E180592AC7246B34032CF92804001A1CCF9BA521782ECBD69A98648BC18025800F8C9C37C827CA7BEFB31EADF0AE801BA42B87935B8EF976194EEC426AAF640168CECAF84BC004AE7D1673A6A600B4AB65802D230D35CF81B803D3775683F3A3860087802132FB32F322C92A4C402524F2DE006E8000854378F710C0010D8F30FE224AE428C015E00D40401987F06E3600021D0CE3EC228DA000574E4C3080182931E936E953B200BF656E15400D3496E4A725B92998027C00A84EEEE6B347D30BE60094E537AA73A1D600B880371AA36C3200043235C4C866C018E4963B7E7AA2B379918C639F1550086064BB148BA499EC731004E1AC966BDBC7646600C080370822AC4C1007E38C428BE0008741689D0ECC01197CF216EA16802D3748FE91B25CAF6D5F11C463004E4FD08FAF381F6004D3232CC93E7715B463F780
+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 + ```