this repo has no description

ft: add day 14, 15, and 16

+102
2021/day14.txt
···
+
OFSNKKHCBSNKBKFFCVNB
+
+
KC -> F
+
CO -> S
+
FH -> K
+
VP -> P
+
KF -> S
+
SV -> O
+
CB -> H
+
PN -> F
+
NC -> N
+
BC -> F
+
NP -> O
+
SK -> F
+
HS -> C
+
SN -> V
+
OP -> F
+
ON -> N
+
FK -> N
+
SH -> B
+
HN -> N
+
BO -> V
+
VK -> H
+
SC -> K
+
KP -> O
+
VO -> V
+
HC -> P
+
BK -> B
+
VH -> N
+
PV -> O
+
HB -> H
+
VS -> F
+
KK -> B
+
HH -> B
+
CF -> F
+
PH -> C
+
NS -> V
+
SO -> P
+
NV -> K
+
BP -> N
+
SF -> V
+
SS -> K
+
FP -> N
+
PC -> S
+
OH -> B
+
CH -> H
+
VV -> S
+
VN -> O
+
OB -> K
+
PF -> H
+
CS -> C
+
PP -> O
+
NF -> H
+
SP -> P
+
OS -> V
+
BB -> P
+
NO -> F
+
VB -> V
+
HK -> C
+
NK -> O
+
HP -> B
+
HV -> V
+
BF -> V
+
KO -> F
+
BV -> H
+
KV -> B
+
OF -> V
+
NB -> F
+
VF -> C
+
PB -> B
+
FF -> H
+
CP -> C
+
KH -> H
+
NH -> P
+
PS -> P
+
PK -> P
+
CC -> K
+
BS -> V
+
SB -> K
+
OO -> B
+
OK -> F
+
BH -> B
+
CV -> F
+
FN -> V
+
CN -> P
+
KB -> B
+
FO -> H
+
PO -> S
+
HO -> H
+
CK -> B
+
KN -> C
+
FS -> K
+
OC -> P
+
FV -> N
+
OV -> K
+
BN -> H
+
HF -> V
+
VC -> S
+
FB -> S
+
NN -> P
+
FC -> B
+
KS -> N
+100
2021/day15.txt
···
+
1124751783612228519483416186391693192764152281421133194141163183224351733212394799536339411529842112
+
1299938854391228215712461147511117912185733411491416388811646391912138661213722223824151532652174491
+
3339197559983134739317425934547716331696227221882122961476799987711635499267472178182145359213635923
+
3275111279884782539314241187762113814171394161491634629424134127254634143155261122133724143114517171
+
3719252118791433135122231855197812222238914994648147192141951214948299478914959275216261881654181459
+
1611117951314292139456114142392662772939225937136486428161234281216234329234315111776511563151948482
+
2568826483341639224876553822412669632282339258375519267395999314194775717338955473111882125281113119
+
3211535497996954958315977618271374429983722314139733843419727946959246752499319415154271225547899217
+
9182381814515842193317619241122295417132515941811977373112934221316141138111911121121111793678163186
+
3844189817214722127981149242928145957137126937131386516329118218111198674162815191994371914762733967
+
2341991198198671797918854491942998311516141218456591158159195192211227471918835699934872448189793938
+
4914562622368117861639397331397217328431182986624263992197435816915439591962133158497224891382954532
+
7626651214813838216185911429272999894518636231382989678893369367388711391734813452975811156327428911
+
6619547343521975253174481211413831293662121339851815212317311237391545399111182897667911821424149598
+
9973191187241313192815214227191649743296915314888729322114168515823743777711899119191553298115729119
+
1139287494922611751257731929722771498336139611251121442114394245137973342111145499332316959261235284
+
2957197428427162517942347211164151149912112158641321995248419171621811597221619949431227171998811472
+
3942647388316719894411111531921126183713231811198382654685441319271454138942281133619242611612293827
+
7937119217256311112391437861121498616811956123353462521891125694135126297129995285155114368995531781
+
3451961913122271833382989211151286596622992323752134162138122516383189222433812253226845819142198221
+
2778119153629891339923532321818124533756116181684147179833125112111826952511175359231299984985971323
+
3111241849191534385261731569341927433476113958471723118832747854529179328115274125434719722218912131
+
3142339531392581988128137411211196234548128214999949588185228836196627923352221497911291281534111199
+
2247331434479875142918842833898559624238445292211715118881294135283574749565172271411631413491566199
+
5942278576394177315387294721122691617961774138211922471397191215938266718124567292193989959261637132
+
3165937631221963265792414421441393495719931248192344794567976762321141859115829128661211272472736862
+
6245216271127518123199222191484234611151315582117171596574729739922992724612599562343116361844622764
+
8113544322656226212151951279235114941989556194198115559251582213981835589429635885493383187341531965
+
9167334539972119189967382996641594933763662148772253141953186111414742999511119411388291132416516449
+
3613823811913288411123382135529243111267199921121439155729919326116169791514491996989971122517181152
+
8673611192477161631212112481894911858892968239143914865319658975331149334747126743512225484277694151
+
1573562476555619452428261559215411721579288335558515411134313992163812836653437129992833619198146362
+
1985275213511588337218921661953495211191671194622531866114745941231929893241192939732541431596251229
+
1265136118282217612545222191931962743537199362634214512441818421145212152171522295123221817416511192
+
8297798221482948311881157477219864767525628534952929138168821168196211119111519681828383199111919196
+
2534111997313111473186996839118152776719511994169115192212165984228917912783244345623614586619121326
+
5841498181267192895193154811932281737529524821838531213993721717189699211939288511893237393416182963
+
4291365191619323711913413926441339411267931111249294286234263722174939997111633217333235111582923441
+
1287162672582123747413148471918114922719181577167138269131143162782619895168443398922587114315692159
+
1265925622411611266789112299971891313715613359912627191225939742625214121139321211686759611131173819
+
2138953588999163543822384688714958315246965691333881631171314291246656696539111996811849918124146199
+
1246641611311144149732152211911939355725818779248359199268117115556131393567479697235189376137881341
+
2899323821125691382122622121279464139996512843263627599964991689326381239953514685697311811566519319
+
2736949532739218813892326217621918912123391961114292438971239114718244292915281445924621121161621333
+
3284227711481113791259114169152546556372395121491214478676766673451539272714243257528999117191132191
+
1491645992221246232691159831148693751711539199173418148515113374123227919399121713163369423119344294
+
9132112419279766149552388219119879126631964411873291514292382629182256527396923261916197289667422219
+
4435263531452645499818123111966429163563711994892138163281911392712947829833494132517185151159797235
+
3377999473376535692397871161267942211991447319627223732643859136911321291147933161219919912554143594
+
3949323991733462336411199416212721417161994737197381813716349241925143828318311249159179991229329171
+
1762136928289612837322111798838212828232194159395467913129898285979511558911359718111211715278482292
+
1118257643855683112121972927223668654922187717441698273158822189761169916992651219511457913769191141
+
1658133214212128183392871646163111119424394424612113962259435119311183885137744192432918197134375132
+
3591713174418138371811543613511348758114531127679321532212958111147949196891591688991927112311822659
+
1236514266615278952886111333113128112861958723136379141934411821192618183131222512832888648251713999
+
8123213361595969218132551112914729944243931512311795497816271296492513311341682399128274945195119112
+
2462825227696446183996491353919233459561152451155132169141431681617413626542619881461141223688519198
+
9621989515111471113381577698758628164221411666452251895517161458991756482464135232192737151721333241
+
1845633941916891433521922233371928968912324239271162428588753196413672815131973146761647212761387593
+
1213191632931181293214711139975148754136566435292974252811697693911887328591189183554433169371667213
+
4519131126388191338914531223891121466796183273431621945951424794146112514299112124121572531131372111
+
1331344969619935133794416261913442341424183712193444133541852317113515211181326734947129151289182833
+
1355758512615534971555911998128211268588155773916181718217932133414645114253821929111112911181223396
+
1921812718591189155234925136611421141621741789512111114849236968196293982164297416554297277314296498
+
2925818269222199331695127966441449818292484293218699694191219141796929886179788888289778893154112915
+
7349332956191336793938825411116431794116518627151175184126599498959181846349128914531693382871224114
+
2975711544499872811921879322745419629143299769241363453113298718372441111116129736331374245812629681
+
2419398835867978148157517197312837563211153716146118174293922233694112229384117648726494771916746336
+
2322473321962284111112435812293374144731592114895311931296931978723998962913118278111921783414789472
+
7421933294181593157278951313456166911311561151111468883991937345182554571275781533927232981213941792
+
1668835358177241114335636733193482471442299199859434499861711136613117473328576171139593142184617345
+
5339642815719926226879311379167325793396941892597215179614941121636812111539912741116971188971946499
+
7581333191573246312732795518731212368211299298495989164122116531125184283943222911391615243311251361
+
9492966914243222969499792183412424152773224381646928911135496174621299924524112331962952547214129323
+
2729194232211462151119459711313211822621531163797412446181172721913949189555142143791213834886518948
+
2754215791553781642269915399358262512494443343121198134218639979927842122994421127962456193396136699
+
8271611911227341219949383285981988595252121593129637541475392137413899839912239225135459931743267972
+
1332131171959982211855642861212718138325111114239233279171544919563891942832117949581464743292494391
+
5144166291493181763279457131141327146537961189933599395341461291371919123151359118199368625742376117
+
1636191619675379923419873222911119821251129276117414194193998142948136713325351617571519395951914216
+
6863238911796142259595658671251783127926389189168272138182549591741951937121824471372228139189226966
+
1398611275788896954682838421735924943417195641181143853286733633811931911189111341679192676374118319
+
7425912442414194918974222966129621141925526265112323617731363617133673511925955331462169117293471296
+
8311915233126172592295451734596934578641991127992454954549337724839691119685881916643781992923996572
+
7168461267393883112656311283191232322499117185912521188899182419918914911212513325386275539329721472
+
4418929132119621184239621272934448319225211997924183117861911136919317465941177911127948161449124731
+
9271153581452542386794695144559617972331134217961265186239771199325391879412411821372724989746391111
+
3752522113112162859371199119415298331514424128999524132149996846199915924629121214916277199845231181
+
8461129155427192357991128752552628161188794894374724397322312139214838121389889613819783991892292158
+
4999141138619713275215481369646529918918936887478711111135124192624311852137911719581517593373711112
+
9228956819912994881488113276489314945969876898139152128325918347915249723837311238669717631918756448
+
1272313111232619631582529173782417217912411245971957172218911853664936489571219898133821585115925152
+
1324983253974657485632276593196749111921819449973115611494598217724911344731933114417612111528118291
+
8521515271325847484517496514692991413334913117194153459926716822674627611191634943962214123151399931
+
1141639315518932691635973515217951611118329247113938399181114133617465682162932426295992195929458883
+
8229351197214731215324515139273121165384915712119675514893281751526119183679227515364941156137548174
+
6116894132781317191382191142114151317798773795981911112434921641114411589131331717998932176521898319
+
5362677393912312215419378899211815319464811111851912257961211293814411559971191515896993251933358962
+
6926527339383986515331739126963132928923957918814875739969162479336291216879152811764569629328261149
+
7598541186247351172883789213137911264491891391569216562276119911413437411237411934123311912324427449
+1
2021/day16.txt
···
+
620D49005AD2245800D0C9E72BD279CAFB0016B1FA2B1802DC00D0CC611A47FCE2A4ACE1DD144BFABBFACA002FB2C6F33DFF4A0C0119B169B013005F003720004263644384800087C3B8B51C26B449130802D1A0068A5BD7D49DE793A48B5400D8293B1F95C5A3005257B880F5802A00084C788AD0440010F8490F608CACE034401AB4D0F5802726B3392EE2199628CEA007001884005C92015CC8051800130EC0468A01042803B8300D8E200788018C027890088CE0049006028012AB00342A0060801B2EBE400424933980453EFB2ABB36032274C026E4976001237D964FF736AFB56F254CB84CDF136C1007E7EB42298FE713749F973F7283005656F902A004067CD27CC1C00D9CB5FDD4D0014348010C8331C21710021304638C513006E234308B060094BEB76CE3966AA007C6588A5670DC3754395485007A718A7F149CA2DD3B6E7B777800118E7B59C0ECF5AE5D3B6CB1496BAE53B7ADD78C013C00CD2629BF5371D1D4C537EA6E3A3E95A3E180592AC7246B34032CF92804001A1CCF9BA521782ECBD69A98648BC18025800F8C9C37C827CA7BEFB31EADF0AE801BA42B87935B8EF976194EEC426AAF640168CECAF84BC004AE7D1673A6A600B4AB65802D230D35CF81B803D3775683F3A3860087802132FB32F322C92A4C402524F2DE006E8000854378F710C0010D8F30FE224AE428C015E00D40401987F06E3600021D0CE3EC228DA000574E4C3080182931E936E953B200BF656E15400D3496E4A725B92998027C00A84EEEE6B347D30BE60094E537AA73A1D600B880371AA36C3200043235C4C866C018E4963B7E7AA2B379918C639F1550086064BB148BA499EC731004E1AC966BDBC7646600C080370822AC4C1007E38C428BE0008741689D0ECC01197CF216EA16802D3748FE91B25CAF6D5F11C463004E4FD08FAF381F6004D3232CC93E7715B463F780
+802
2021/solutions.livemd
···
```
## Day 14
+
+
```elixir
+
[polymer_raw, subs] =
+
File.read!("day14.txt")
+
|> String.split("\n\n")
+
+
<<first, _::binary>> = polymer_raw
+
+
polymer =
+
{first,
+
polymer_raw
+
|> String.to_charlist()
+
|> Enum.chunk_every(2, 1, :discard)
+
|> Enum.frequencies()}
+
+
subs =
+
subs
+
|> String.trim()
+
|> String.split(["\n", " -> "])
+
|> Enum.chunk_every(2)
+
|> Map.new(fn [pair, <<new>>] -> {String.to_charlist(pair), new} end)
+
+
defmodule Day14 do
+
def expand({hd, polymer}, subs) do
+
new =
+
polymer
+
|> Enum.reduce(%{}, fn {[a, b] = pair, count}, acc ->
+
s = Map.fetch!(subs, pair)
+
+
acc
+
|> Map.update([a, s], count, &(&1 + count))
+
|> Map.update([s, b], count, &(&1 + count))
+
end)
+
+
{hd, new}
+
end
+
+
def expand_naive(polymer, subs) do
+
polymer
+
|> to_charlist()
+
|> Enum.chunk_every(2, 1, :discard)
+
|> Enum.flat_map(fn [a, b] = pair ->
+
[a, subs[pair], b]
+
end)
+
|> List.to_string()
+
end
+
+
def frequencies({hd, polymer}) do
+
polymer
+
|> Enum.reduce(%{hd => 1}, fn {[_, b], count}, acc ->
+
Map.update(acc, b, count, &(&1 + count))
+
end)
+
end
+
end
+
```
+
+
```output
+
{:module, Day14, <<70, 79, 82, 49, 0, 0, 13, ...>>, {:frequencies, 1}}
+
```
+
+
```elixir
+
{{_, min}, {_, max}} =
+
1..10
+
|> Enum.reduce(polymer, fn _, acc ->
+
Day14.expand(acc, subs)
+
end)
+
|> Day14.frequencies()
+
|> Enum.min_max_by(&elem(&1, 1))
+
+
# 2768
+
max - min
+
```
+
+
```output
+
2768
+
```
+
+
```elixir
+
{{_, min}, {_, max}} =
+
1..40
+
|> Enum.reduce(polymer, fn _, acc ->
+
Day14.expand(acc, subs)
+
end)
+
|> Day14.frequencies()
+
|> Enum.min_max_by(&elem(&1, 1))
+
+
max - min
+
```
+
+
```output
+
2914365137499
+
```
+
+
## Day 15
+
+
```elixir
+
input =
+
File.read!("day15.txt")
+
|> String.trim()
+
|> String.split("\n")
+
|> Enum.map(&String.to_charlist/1)
+
|> Enum.with_index()
+
|> Enum.flat_map(fn {row, y} ->
+
row
+
|> Enum.with_index()
+
|> Enum.map(fn {v, x} -> {{x, y}, v - ?0} end)
+
end)
+
|> Map.new()
+
+
{width, height} = Enum.max(Map.keys(input))
+
```
+
+
```output
+
{99, 99}
+
```
+
+
```elixir
+
shortest_paths =
+
for y <- height..0//-1,
+
x <- width..0//-1,
+
reduce: %{} do
+
acc ->
+
right = acc[{x + 1, y}]
+
bottom = acc[{x, y + 1}]
+
+
value =
+
case {right, bottom} do
+
{nil, nil} -> input[{x, y}]
+
_ -> input[{x, y}] + min(right, bottom)
+
end
+
+
Map.put(acc, {x, y}, value)
+
end
+
+
shortest_paths[{0, 0}] - input[{0, 0}]
+
```
+
+
```output
+
429
+
```
+
+
```elixir
+
defmodule Day15.Task2 do
+
def expand_grid(board) do
+
{width, height} = Enum.max(Map.keys(board))
+
+
board
+
|> Enum.flat_map(fn {{x, y}, v} ->
+
for rx <- 0..4, ry <- 0..4 do
+
{{x + (width + 1) * rx, y + (height + 1) * ry}, rem(v - 1 + rx + ry, 9) + 1}
+
end
+
end)
+
|> Map.new()
+
end
+
+
def find_path(board, start, finish) do
+
dists = :gb_sets.singleton({0, start})
+
+
find_path(board, finish, dists, MapSet.new())
+
end
+
+
@surround for dx <- -1..1, dy <- -1..1, abs(dx) != abs(dy), do: {dx, dy}
+
+
def find_path(board, finish, dists, visited) do
+
{{dist, {x, y} = curr}, dists} = :gb_sets.take_smallest(dists)
+
+
if curr == finish do
+
dist
+
else
+
visited = MapSet.put(visited, curr)
+
+
dists =
+
for {dx, dy} <- @surround,
+
next = {x + dx, y + dy},
+
next not in visited,
+
is_map_key(board, next),
+
alt = dist + board[next],
+
reduce: dists do
+
acc ->
+
:gb_sets.add_element({alt, next}, acc)
+
end
+
+
find_path(board, finish, dists, visited)
+
end
+
end
+
end
+
```
+
+
```output
+
{:module, Day15.Task2, <<70, 79, 82, 49, 0, 0, 16, ...>>, {:find_path, 4}}
+
```
+
+
```elixir
+
input
+
|> Day15.Task2.expand_grid()
+
|> Day15.Task2.find_path({0, 0}, {499, 499})
+
```
+
+
```output
+
2844
+
```
+
+
## Day 16
+
+
```elixir
+
defmodule Day16 do
+
defmodule Packet do
+
defstruct [:version, :type, :value]
+
end
+
+
def decode(<<version::3, 4::3, rest::bitstring>>) do
+
{value, rest} = literal(rest, 0)
+
+
{%Packet{type: 4, version: version, value: value}, rest}
+
end
+
+
def decode(<<version::3, type::3, 0::1, length::15, rest::bitstring>>) do
+
<<subpackets::bitstring-size(length), rest::bitstring>> = rest
+
+
{%Packet{type: type, version: version, value: decode_all(subpackets)}, rest}
+
end
+
+
def decode(<<version::3, type::3, 1::1, length::11, rest::bitstring>>) do
+
{value, rest} = Enum.map_reduce(1..length, rest, fn _, acc -> decode(acc) end)
+
+
{%Packet{type: type, version: version, value: value}, rest}
+
end
+
+
def decode_all(input) do
+
case decode(input) do
+
{packet, <<>>} -> [packet]
+
{packet, rest} -> [packet | decode_all(rest)]
+
end
+
end
+
+
defp literal(<<1::1, bits::4, rest::bitstring>>, acc) do
+
literal(rest, acc * 0x10 + bits)
+
end
+
+
defp literal(<<0::1, bits::4, rest::bitstring>>, acc) do
+
{acc * 0x10 + bits, rest}
+
end
+
end
+
+
input =
+
File.read!("day16.txt")
+
|> String.trim()
+
|> Base.decode16!()
+
|> Day16.decode()
+
|> elem(0)
+
```
+
+
```output
+
%Day16.Packet{
+
type: 0,
+
value: [
+
%Day16.Packet{
+
type: 1,
+
value: [
+
%Day16.Packet{type: 4, value: 20, version: 6},
+
%Day16.Packet{
+
type: 6,
+
value: [
+
%Day16.Packet{type: 4, value: 14747, version: 1},
+
%Day16.Packet{type: 4, value: 14747, version: 6}
+
],
+
version: 2
+
}
+
],
+
version: 1
+
},
+
%Day16.Packet{
+
type: 3,
+
value: [
+
%Day16.Packet{type: 4, value: 15, version: 5},
+
%Day16.Packet{type: 4, value: 10, version: 6}
+
],
+
version: 7
+
},
+
%Day16.Packet{
+
type: 1,
+
value: [
+
%Day16.Packet{
+
type: 7,
+
value: [
+
%Day16.Packet{type: 4, value: 2184, version: 1},
+
%Day16.Packet{type: 4, value: 130250, version: 6}
+
],
+
version: 6
+
},
+
%Day16.Packet{type: 4, value: 5442981, version: 4}
+
],
+
version: 6
+
},
+
%Day16.Packet{type: 4, value: 8281083, version: 0},
+
%Day16.Packet{
+
type: 2,
+
value: [
+
%Day16.Packet{type: 4, value: 102, version: 5},
+
%Day16.Packet{type: 4, value: 647125, version: 7}
+
],
+
version: 1
+
},
+
%Day16.Packet{
+
type: 1,
+
value: [
+
%Day16.Packet{type: 4, value: 178, version: 1},
+
%Day16.Packet{type: 4, value: 176, version: 6}
+
],
+
version: 0
+
},
+
%Day16.Packet{
+
type: 1,
+
value: [
+
%Day16.Packet{
+
type: 6,
+
value: [
+
%Day16.Packet{
+
type: 0,
+
value: [
+
%Day16.Packet{type: 4, value: 13, version: 1},
+
%Day16.Packet{type: 4, value: 8, version: 4},
+
%Day16.Packet{type: 4, value: 4, version: 3}
+
],
+
version: 2
+
},
+
%Day16.Packet{
+
type: 0,
+
value: [
+
%Day16.Packet{type: 4, value: 7, version: 7},
+
%Day16.Packet{type: 4, value: 11, version: 3},
+
%Day16.Packet{type: 4, value: 14, version: 2}
+
],
+
version: 4
+
}
+
],
+
version: 7
+
},
+
%Day16.Packet{type: 4, value: 2724, version: 0}
+
],
+
version: 1
+
},
+
%Day16.Packet{type: 4, value: 9, version: 4},
+
%Day16.Packet{
+
type: 1,
+
value: [
+
%Day16.Packet{
+
type: 5,
+
value: [
+
%Day16.Packet{type: 4, value: 7240238, version: 2},
+
%Day16.Packet{type: 4, value: 233, version: 7}
+
],
+
version: 1
+
},
+
%Day16.Packet{type: 4, value: 37, version: 6}
+
],
+
version: 4
+
},
+
%Day16.Packet{type: 2, value: [%Day16.Packet{type: 4, value: 2, version: 5}], version: 5},
+
%Day16.Packet{type: 4, value: 53749, version: 4},
+
%Day16.Packet{type: 4, value: 11, version: 3},
+
%Day16.Packet{
+
type: 1,
+
value: [
+
%Day16.Packet{type: 4, value: 382979, version: 4},
+
%Day16.Packet{
+
type: 5,
+
value: [
+
%Day16.Packet{
+
type: 0,
+
value: [
+
%Day16.Packet{type: 4, value: 15, version: 1},
+
%Day16.Packet{type: 4, value: 10, version: 0},
+
%Day16.Packet{type: 4, value: 2, version: 6}
+
],
+
version: 5
+
},
+
%Day16.Packet{
+
type: 0,
+
value: [
+
%Day16.Packet{type: 4, value: 4, version: 7},
+
%Day16.Packet{type: 4, value: 7, version: 4},
+
%Day16.Packet{type: 4, value: 2, version: 5}
+
],
+
version: 1
+
}
+
],
+
version: 6
+
}
+
],
+
version: 2
+
},
+
%Day16.Packet{type: 4, value: 21251, version: 1},
+
%Day16.Packet{
+
type: 1,
+
value: [
+
%Day16.Packet{type: 4, value: 163, version: 6},
+
%Day16.Packet{
+
type: 5,
+
value: [
+
%Day16.Packet{type: 4, value: 59, version: 3},
+
%Day16.Packet{type: 4, value: 836848134220, version: 1}
+
],
+
version: 6
+
}
+
],
+
version: 2
+
},
+
%Day16.Packet{
+
type: 2,
+
value: [
+
%Day16.Packet{
+
type: 0,
+
value: [
+
%Day16.Packet{
+
type: 0,
+
value: [
+
%Day16.Packet{
+
type: 2,
+
value: [
+
%Day16.Packet{
+
type: 2,
+
value: [
+
%Day16.Packet{
+
type: 0,
+
value: [
+
%Day16.Packet{
+
type: 3,
+
value: [
+
%Day16.Packet{
+
type: 2,
+
value: [
+
%Day16.Packet{
+
type: 2,
+
value: [
+
%Day16.Packet{
+
type: 3,
+
value: [%Day16.Packet{type: 0, value: [...], ...}],
+
version: 0
+
}
+
],
+
version: 1
+
}
+
],
+
version: 1
+
}
+
],
+
version: 7
+
}
+
],
+
version: 0
+
}
+
],
+
version: 6
+
}
+
],
+
version: 2
+
}
+
],
+
version: 2
+
}
+
],
+
version: 6
+
}
+
],
+
version: 7
+
},
+
%Day16.Packet{type: 1, value: [%Day16.Packet{type: 4, value: 44, version: 4}], version: 7},
+
%Day16.Packet{
+
type: 1,
+
value: [
+
%Day16.Packet{type: 4, value: 255, version: 2},
+
%Day16.Packet{type: 4, value: 91, version: 5},
+
%Day16.Packet{type: 4, value: 176, version: 5},
+
%Day16.Packet{type: 4, value: 23, version: 1}
+
],
+
version: 7
+
},
+
%Day16.Packet{
+
type: 3,
+
value: [
+
%Day16.Packet{type: 4, value: 11520, version: 4},
+
%Day16.Packet{type: 4, value: 6069, version: 0},
+
%Day16.Packet{type: 4, value: 1089149511401, version: 4},
+
%Day16.Packet{type: 4, value: 158, version: 2},
+
%Day16.Packet{type: 4, value: 620605, version: 0}
+
],
+
version: 2
+
},
+
%Day16.Packet{
+
type: 0,
+
value: [
+
%Day16.Packet{type: 4, value: 62788, version: 7},
+
%Day16.Packet{type: 4, value: 9410622, version: 2},
+
%Day16.Packet{type: 4, value: 15912821, version: 4}
+
],
+
version: 4
+
},
+
%Day16.Packet{
+
type: 1,
+
value: [
+
%Day16.Packet{type: 4, value: 22416, version: 5},
+
%Day16.Packet{
+
type: 5,
+
value: [
+
%Day16.Packet{type: 4, value: 246, version: 1},
+
%Day16.Packet{type: 4, value: 246, version: 4}
+
],
+
version: 2
+
}
+
],
+
version: 0
+
},
+
%Day16.Packet{type: 3, value: [%Day16.Packet{type: 4, value: 13008601, version: 5}], version: 0},
+
%Day16.Packet{
+
type: 0,
+
value: [
+
%Day16.Packet{
+
type: 1,
+
value: [
+
%Day16.Packet{type: 4, value: 3, version: 4},
+
%Day16.Packet{type: 4, value: 14, version: 1},
+
%Day16.Packet{type: 4, value: 5, version: 0}
+
],
+
version: 5
+
},
+
%Day16.Packet{
+
type: 1,
+
value: [
+
%Day16.Packet{type: 4, value: 2, version: 1},
+
%Day16.Packet{type: 4, value: 14, version: 1},
+
%Day16.Packet{type: 4, value: 10, version: 1}
+
],
+
version: 6
+
},
+
%Day16.Packet{
+
type: 1,
+
value: [
+
%Day16.Packet{type: 4, value: 8, version: 3},
+
%Day16.Packet{type: 4, value: 6, version: 6},
+
%Day16.Packet{type: 4, value: 11, version: 0}
+
],
+
version: 1
+
}
+
],
+
version: 5
+
},
+
%Day16.Packet{
+
type: 1,
+
value: [
+
%Day16.Packet{type: 4, value: 32940592237, version: 2},
+
%Day16.Packet{
+
type: 5,
+
value: [
+
%Day16.Packet{type: 4, value: 100, version: 1},
+
%Day16.Packet{type: 4, value: 1393232728, version: 2}
+
],
+
version: 2
+
}
+
],
+
version: 0
+
},
+
%Day16.Packet{type: 4, value: 89, version: 3},
+
%Day16.Packet{
+
type: 2,
+
value: [
+
%Day16.Packet{type: 4, value: 204, version: 6},
+
%Day16.Packet{type: 4, value: 260321821, version: 2},
+
%Day16.Packet{type: 4, value: 225241983, version: 6}
+
],
+
version: 0
+
},
+
%Day16.Packet{
+
type: 0,
+
value: [
+
%Day16.Packet{type: 4, value: 960899, version: 3},
+
%Day16.Packet{type: 4, value: 58997, version: 5},
+
%Day16.Packet{type: 4, value: 54940, version: 6},
+
%Day16.Packet{type: 4, value: 10974, version: 2},
+
%Day16.Packet{type: 4, value: 882043, version: 2}
+
],
+
version: 0
+
},
+
%Day16.Packet{
+
type: 1,
+
value: [
+
%Day16.Packet{
+
type: 6,
+
value: [
+
%Day16.Packet{type: 4, value: 35633017255, version: 4},
+
%Day16.Packet{type: 4, value: 35633017255, version: 2}
+
],
+
version: 3
+
},
+
%Day16.Packet{type: 4, value: 1359, version: 6}
+
],
+
version: 6
+
},
+
%Day16.Packet{
+
type: 1,
+
value: [
+
%Day16.Packet{type: 4, value: 92, version: 4},
+
%Day16.Packet{type: 4, value: 38, version: 3},
+
%Day16.Packet{type: 4, value: 160, version: 5},
+
%Day16.Packet{type: 4, value: 111, version: 1},
+
%Day16.Packet{type: 4, value: 64, version: 4}
+
],
+
version: 4
+
},
+
%Day16.Packet{
+
type: 0,
+
value: [
+
%Day16.Packet{type: 4, value: 2541, version: 3},
+
%Day16.Packet{type: 4, value: 263947, version: 6},
+
%Day16.Packet{type: 4, value: 7686705, version: 5},
+
%Day16.Packet{type: 4, value: 31, version: 4}
+
],
+
version: 2
+
},
+
%Day16.Packet{
+
type: 1,
+
value: [
+
%Day16.Packet{
+
type: 6,
+
value: [
+
%Day16.Packet{type: 4, value: 3193865, version: 1},
+
%Day16.Packet{type: 4, value: 20223, version: 7}
+
],
+
version: 2
+
},
+
%Day16.Packet{type: 4, value: 9328522, version: 5}
+
],
+
version: 0
+
},
+
%Day16.Packet{
+
type: 2,
+
value: [
+
%Day16.Packet{type: 4, value: 5, version: 4},
+
%Day16.Packet{type: 4, value: 7, version: 3},
+
%Day16.Packet{type: 4, value: 179420284, version: 4},
+
%Day16.Packet{type: 4, value: 19890, version: 1},
+
%Day16.Packet{type: 4, value: 2655, version: 0}
+
],
+
version: 7
+
},
+
%Day16.Packet{
+
type: 1,
+
value: [
+
%Day16.Packet{type: 4, value: 862089, version: 1},
+
%Day16.Packet{
+
type: 6,
+
value: [
+
%Day16.Packet{type: 4, value: 248, version: 3},
+
%Day16.Packet{type: 4, value: 3286, version: 5}
+
],
+
version: 3
+
}
+
],
+
version: 3
+
},
+
%Day16.Packet{
+
type: 1,
+
value: [
+
%Day16.Packet{type: 4, value: 93, version: 6},
+
%Day16.Packet{
+
type: 5,
+
value: [
+
%Day16.Packet{type: 4, value: 4269, version: 6},
+
%Day16.Packet{type: 4, value: 240, version: 3}
+
],
+
version: 4
+
}
+
],
+
version: 5
+
},
+
%Day16.Packet{
+
type: 3,
+
value: [
+
%Day16.Packet{type: 4, value: 2938, version: 6},
+
%Day16.Packet{type: 4, value: 3, version: 6},
+
%Day16.Packet{type: 4, value: 211, version: 7}
+
],
+
version: 3
+
},
+
%Day16.Packet{
+
type: 1,
+
value: [
+
%Day16.Packet{
+
type: 7,
+
value: [
+
%Day16.Packet{type: 4, value: 159, version: 0},
+
%Day16.Packet{type: 4, value: 159, version: 5}
+
],
+
version: 0
+
},
+
%Day16.Packet{type: 4, value: 28, version: 1}
+
],
+
version: 4
+
},
+
%Day16.Packet{type: 4, value: 84, version: 4},
+
%Day16.Packet{
+
type: 1,
+
value: [
+
%Day16.Packet{type: 4, value: 235, version: 4},
+
%Day16.Packet{
+
type: 6,
+
value: [
+
%Day16.Packet{type: 0, value: [%Day16.Packet{...}, ...], version: 4},
+
%Day16.Packet{type: 0, value: [...], ...}
+
],
+
version: 3
+
}
+
],
+
version: 6
+
},
+
%Day16.Packet{type: 4, value: 1425, version: 4},
+
%Day16.Packet{
+
type: 1,
+
value: [
+
%Day16.Packet{
+
type: 7,
+
value: [%Day16.Packet{type: 0, value: [...], ...}, %Day16.Packet{type: 0, ...}],
+
version: 5
+
},
+
%Day16.Packet{type: 4, value: 13, version: 2}
+
],
+
version: 2
+
},
+
%Day16.Packet{type: 0, value: [%Day16.Packet{type: 4, value: 3121, version: 6}], version: 5},
+
%Day16.Packet{
+
type: 1,
+
value: [
+
%Day16.Packet{type: 4, value: 51, version: 2},
+
%Day16.Packet{type: 4, value: 61, ...},
+
%Day16.Packet{type: 4, ...}
+
],
+
version: 4
+
},
+
%Day16.Packet{
+
type: 1,
+
value: [%Day16.Packet{type: 4, value: 1393, ...}, %Day16.Packet{type: 5, ...}],
+
version: 3
+
},
+
%Day16.Packet{type: 1, value: [%Day16.Packet{type: 7, ...}, %Day16.Packet{...}], version: 3},
+
%Day16.Packet{type: 1, value: [%Day16.Packet{...}, ...], version: 7},
+
%Day16.Packet{type: 3, value: [...], ...},
+
%Day16.Packet{type: 2, ...},
+
%Day16.Packet{...},
+
...
+
],
+
version: 3
+
}
+
```
+
+
```elixir
+
defmodule Day16.Task1 do
+
alias Day16.Packet
+
+
def sum(%Packet{type: 4, version: version}), do: version
+
+
def sum(%Packet{version: version, value: value}) do
+
Enum.reduce(value, version, &(sum(&1) + &2))
+
end
+
end
+
+
Day16.Task1.sum(input)
+
```
+
+
```output
+
949
+
```
+
+
```elixir
+
defmodule Day16.Task2 do
+
alias Day16.Packet
+
+
def evaluate(%Packet{type: 0} = packet), do: reduce(packet, 0, &+/2)
+
def evaluate(%Packet{type: 1} = packet), do: reduce(packet, 1, &*/2)
+
def evaluate(%Packet{type: 2} = packet), do: reduce(packet, :inf, &min/2)
+
def evaluate(%Packet{type: 3} = packet), do: reduce(packet, 0, &max/2)
+
+
def evaluate(%Packet{type: 4, value: value}), do: value
+
+
def evaluate(%Packet{type: 5} = packet), do: compare(packet, &>/2)
+
def evaluate(%Packet{type: 6} = packet), do: compare(packet, &</2)
+
def evaluate(%Packet{type: 7} = packet), do: compare(packet, &==/2)
+
+
defp reduce(%Packet{value: value}, initial, op) do
+
Enum.reduce(value, initial, &op.(evaluate(&1), &2))
+
end
+
+
defp compare(%Packet{value: [a, b]}, op) do
+
if op.(evaluate(a), evaluate(b)), do: 1, else: 0
+
end
+
end
+
+
Day16.Task2.evaluate(input)
+
```
+
+
```output
+
1114600142730
+
```