From 26450fb769017a9b899b7c1fce14b29d0bd7076e Mon Sep 17 00:00:00 2001 From: Tobias Marschner Date: Sun, 3 Mar 2024 17:14:49 +0100 Subject: [PATCH] Solution for 2022/day16-part1 --- 2022/day16-part1/.~lock.map2.odg# | 1 + 2022/day16-part1/Cargo.toml | 8 ++ 2022/day16-part1/map2.odg | Bin 0 -> 16002 bytes 2022/day16-part1/src/main.rs | 201 ++++++++++++++++++++++++++++++ 4 files changed, 210 insertions(+) create mode 100644 2022/day16-part1/.~lock.map2.odg# create mode 100644 2022/day16-part1/Cargo.toml create mode 100644 2022/day16-part1/map2.odg create mode 100644 2022/day16-part1/src/main.rs diff --git a/2022/day16-part1/.~lock.map2.odg# b/2022/day16-part1/.~lock.map2.odg# new file mode 100644 index 0000000..0ae2637 --- /dev/null +++ b/2022/day16-part1/.~lock.map2.odg# @@ -0,0 +1 @@ +,zen,seahaven,03.03.2024 15:04,file:///home/zen/.config/libreoffice/4; \ No newline at end of file diff --git a/2022/day16-part1/Cargo.toml b/2022/day16-part1/Cargo.toml new file mode 100644 index 0000000..3d9af2a --- /dev/null +++ b/2022/day16-part1/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "day16-part1" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/2022/day16-part1/map2.odg b/2022/day16-part1/map2.odg new file mode 100644 index 0000000000000000000000000000000000000000..e071df05fb38bb6bd7a67c166ea5602aff27c565 GIT binary patch literal 16002 zcmeIZWpG_N*Dh#`ndz8g#$#rTnVFgGn3*wlOfkjG%oH;-Gc(6bF*A?z-s;=k-|c>9 z=EwY-b!wklQmyq!ThdlZ3*@E1A<#iUpg}+a?Tpkj!RdNwKtMo#Kkro_*5=kGPVROl z26lE<=0*li=C(HUE;hz=wg!&oj&!zmCN{>lM$XnIHcoVA4hD9g&5a!8{|5Mu@xKZ0 zofERPF*P@HcK8pJBNM%Wk&%g&$$Qb(f&Sk$3I9RU+}gm*#F1Xm+{xO&&hft}&s)ql|g{DYpUm92r3$$#tWKeguQWZ>lNXlU@?^!}-}-@W|rTK_bpb`G{? z4knKOH|_mXKkaPoobBEx)A|49sQgy>v!Bq=(EnLW@5A@M3HF_HbaJ;cainvzwp!C( zaaiF%_1>tEH@CQrATJIBx*N%v#H1`q(P>HS8DtiGM2+Dfg29B=aPcuDynDNqs>fyb zN0m^h-jXR(CPSG-aLQ~4`Rwm;G2@+pcuGl+maqZe6Q<9R<=(qRs<#I3`*a<~j{EBL zRETBOBu(srU-LP3O4}{pP28LlWUsZA+&yLuo}H(|G*5c?IL)}W6?2M}=Ch6Z4;oEk z{c20jL<`y)(i3iwX%CbUSb#~iqHB`>3@Y^Qxp%Om`)XBAHC|Zire?_2@?FEqNuP^X z*ZuI@b=Lr&+@$9w?h!`Rc5SE!I)st$?tn1z8C~`YA^gCLrf~$`rWfCxNd-}a#ypeL z0eGO;*{3hlhS(Q*$Zb<`vp=?^`aN;c%yo1te>IB~Ccj~F?dsWX06cb8yv=6#4n_w6 zH8Vs3ISdEVUN>#iWoOcNCPzSxu*9ysm2r&*9+WsOp+bq*rnSjMON6nZdZm1Z^XUF) z(xW(1Vsm4t3h^)mIWh&j2bTOIx5HqpY-h6_@Vj}ti};8qvXz~xZy14uZS<6Km0@`? zC(Uevz(Gcn>su*OmnIRi2?5h8W@fEhSH_>XOPnxC?JEO&?W7LCMOV7KK-yzioGbg) zOmDoF)>dSE2U%}fxc)%a{M3+Pfbd#?Yr ziKu2Gy9ouv*Kzf6=+o~HPjPoO`?6M_i46>6Kn2lH&h z7!%MPRNNJ!`m9Pqg^JQO>>%bw+%tBTuqgx9DOn277t?C>eP<$1e^<}tK-s9!D$RtH zKk+lePIaP{_&s`en~}dWi78cva#~ku$D7gl#hgJgiviLm!I|+~Ud18)&=BmshqyWl ze|g-dhSjp%#}1(Vfs3<8qxTo7kH69-(mo~N4BAQ_>BX?*U&yl_Mu7i{qui`VP(@Qu zQ2YRM9i0DsKsT6HPZE=fgH+JjDh*LY_@OHbQOOZ$NR8u(Bjiw$9SDeGvv zF{b$DuS2uqf?X;)HK5CwK92jVE=haLf5_E@zIbTqB>xLXzb@fIUY5z)hcrh#QO6-4jNhIQcDcJKlq%z8Zz zCg815;QhNO0pZ|th)~N7M78<4ArZ$4=lRRK{Z0~W#dM!it&7&jyLbAyLW6=-eeYm7 zE*0reHHR;xx|Yl|Pq@hwl?=D6VX9giR5YrOf$+Okf+`7)dz*KXMgDfg6s0m`EtQzN z(GmJ40+qALy>V2EF_@NyF4KMFQN5xBcRP!fGqTlSa8f0NXrT>1f zd0c5RFsabA0thvI$zcd`iXZqo(6ikmR>&Pr2nf!X;BgYNNbS7``502Y*(I)2+@;hs z!=M}f-MNE5N4=4WPK%@yVr87p(FL5jziBRu_tFHZnad5~Vm_Qg4=_LT(JdB3{WVI4 zDrPspsnfsres(kfAgItig&t_ng((f~6*n`RIGz6;_Ls}Kaovx*S;gp4p=DZ2)Da3a z2|P7!ucd?Hozt}i#u8UP78e|0Q_xq?jqiOoEL6u-ZUZ&i)p6@n$|#;;2v+gEpPUU_ zv~73P=5`H|?@jMF-kw*QvzbG-Lt`kU9O%j54yp+3U|{d9C5CrUw=d3!7=643F-OV2 zjzg%*iNqd8G2J$^@PY+Tk=T8=3~R`e>MsV}d>~@s!xhZFyfO=(+zE#s%ODe+sUc!% zPU4aJN;eTSd9ShM=*;JpVV;qZj*vaXJT`O1Onl9Ani~uy_JPCBNv=)dQWCP2u7yDEwWkE8ZX02)|rv|^KaTlsAGMaB*tT(uS z&_Zy1Lr3t-O^ahD9(B%?rBujzJlqq>MoNdo!9|3l!H+P6O_Urmn@fl zOy5ayE3~ShG=H+(dg7GgV^o_8DNj$4m{YFQ5(NoXkC8jw;b5dPdC_NfvwQZ)z_;#M z6%u~~h;sgE#U6OOaDnj;gS;TB&mAMz7;$WUA|`FI_V*AU_;-uA;chHj(=O3KKe{i-EReWLdZw~EBJ_%E=yDbh&AawxHWq3)K5JL9oJIvTDSOf4XiodcE(kdS z2cjL+u8(q-u)FJCWd81p+_YKdRjIEU_ag*U{NN|Cod1uyv$Kmv$<>u`9(9&)w zi*j{|5|&h2cI-d;R!u-*gvg!L?)~@-MeZC!5hNn_YCPDg2Dx03n1-~W(F|>BFw&O) z$%jB8g5k({-%iNc5VHY5;QlhzZf!R?yN3`_ll1uMv|c|gsZCBew|UGL8R6@Adkgw^l>2CqfJoyf0qT7r1WJT5lpdZcyC|dc>=82nHwEatcoPH&k~af(st9 z>%A25+4zgs%~dBldiwV_3RK1mW!Pcq3mhBPczzM+=#1{_fB{M5K&1O)kJ!!5DKI%C zR!N$3C0epK`b8QoxnG`;2@v(|?Q!qQYClfxV+`n#P8OQp2ueiR-Dt@aa5E{wVgr!o z!dkM>*%UT?TsLmyHMgzCUgBH5KhNeiRHw7}&%m0QLy3q=G<89RG?nn&w|G#>*H(wv zk4aX{y*yH7wxU?3D73*I+=vtN+<(P)W{P(i!C_51;83AWP>-1_ zG8`1U!E!IzIcccLKiK#5YB?iimt*I$Z{}_9nTdw3xIP=g9v|cY5Sp$gI(czY@B#)} z!i{+fyiL=7F^&6`PlV6t^nd1yY8FrlPkahD%yNMDU3#jd>~$xA^&SF;lyRl|L$!2yrXS71RE}>~+8t zN3W8eHuSE$KV6}>Z@hngWVhY1i0?N{9&}3$%jv43#kmjt)LfLqd8Ef<|vb^-b5*z4!7%8L+O(rE+}6>IYaL3AHYbD#4G zn_8I6Oq|rp`q|z5dYy4yeaA~-`JNq#4Q`8AMJegfsgTlu{YhQ=dC;~F^=-!qnGL&) zPX$D1&ft6vc&+S25&3NgU+WvdR(RZAa~6T#&^}I*AOWY7Mq~E|o2PE&kRWaFxy>FQ*Bod`DYZ0U)3Rdppym*u_iD4{2C>7yv5v-jyA+t)ls3^b6Fi^P5km;XwIx{u9y~87AmT#y`Ol9C^QZJq~^unM7p&IYs3&r zk=)A@2DK~pxv889LDEpmSP}j@gPTzvpcM;b;9VCY)r$EhZ&`xxsN6Jz zVZ3)lypduzt`z5eTLUbiD4JB5_WSaSz6{UN+Q8nU@3bdGq}?w1xhZlToT&MV5pM8} zmVl3cyc=O(nmXXF+J@8%ScMM~JD;g0#R@&-5xi~cor<`!CQ;cyGb%S5qc9`VC3}&mkJHxIFyfVp4id<RTUld&l^!*&J5N6dSP!99qD1fUp`NO{eMSgRSx2j@1z# z2j7UxN)BIh#&sTz1PHv1y?({5j zVp!LcBcn6DO-W&kSCX^+PHL7bW~n@#bt+*MmEWg1S@MhB)Qk;e%1eZ|CU#z+y1MNLlynM3yi-e)lUStFJm zfd}0Jw3tT-<^7MCt}Je)x2;%HuMb(5p9jI*PV3c{to^HYkNKT5fGs8=hPmrdXvh}bM@&i)^2+QPLg~+X77Jk`&3$t zJC(T>l3^_t_x+G-uGc?4*F~sx0AEr)eXzQ=?CI52U9EWI)O%rt;{hV2J>WH>eLnS) zv^G<+7JTFmoMgFuR}@L?$+lw3Ct<4HvmSiJ{xD$bb&GX*f@wK>H}+sE`FYKz_rDBRIcTV)4TtubaD}P@hb+oX0eL- zAXZ*K@DcY))v_;mp2{U1 z`U?@BXckR3L3lHfs^VxDI%6;xI;8H`*`$f@6+QuY7)^r|M3;g=MMBC!f^-39ew845 zUf+t~nnA&lCjv+din!oWa(+TIN#ZD?Pr~C7UWUV=5)lt$8iDgbIEkZtfn<~y2h&p! z1_{wePw1<)$q}P^KJte-0!4$RQ7)-ECOKl1ri2WuEK_Bk7fuS(LB8d|Dy;*tl@`?B za$k(_YdkZm!_4%XK$qGwiW2ld0EDC6V_SV98Ui`1nmH-FU9E7ICZ-85h}ll(3qlN` z;2rI)Tm3G3X{;*z_QvBK<`Fw&AI?y{i#{Qj3&sSeD@eP=uMYZhQwQde0a;-bnDMYH z0+Be@bMi~AV)K<0R(Fsw9MTl$8}0C7I*YO3!C|ORj2E`%t5d{$4bEqmyE*KH7w;yv zbI|%QFB9y zm=oEjqoX@zxpdk4(l5#lI6Du8sy zu>juh8K87n%~c+>`Bol|M%|)Kv_i<}=Y z*uys}r7|H|b@xyMsM!n=)B?Elz0^Rs8+JxM3dg|&J15D1=?`Um{$Y1)IbY>PRbW+5 zGi-7D_((C{+apIvhZ)u*0=(6$)2&F{E}T$m;C^!JSt_+{p-%YaQl@_C4ivV~J?13H z=*e=$>j6CE^_Rh$nH8>uF zH4WW~Zi&wilWZ9E%xd9s3`kIo3aY z0^aL>dE!D0w3NVa%&BN$5~R?x+v5-49MV=yNM;EO35C=i4NdAw*S$l~{99T4E5)q$kz;sc( zv;uA_HFd;qetwz_Ld`I|;s>{b&^0Xt0{n@3#+A71woh zD>A>GM-sy)5U|vCSBDd#EUmUa1A+VSwFftt-Rx=yCnOSmHB5~Mn9adiaX6w6melP3 zy=P`njh2OtScioWjHguyQc2!zzPaa>Ktjc;7o(y134M(^x6}SxU@a?& zjWxEo;F+I%=pIMq7GIwF!(AMFzh6~grj9b!#;4Fll^*eX@?}k3bOuv#^kgd3aWMtt zMpOrpaDKv-S}$Mr!O!hJ_Z$ks@+*iT=x@sNjyYL)Tlq%t&$`E6_W*PGOwg2gqh&U*WIJHSRgzR;|@}Xts=W>k@0htT#@>QJg2n zg4CZP5ME>+dt9x@pQWpK%xl%Hu#^_L@0#_wrFonpU%tSG;Nc| zZkG$c?-}(Q;I`1u_cowGE;Th7#tCYJa=J6e{qm1(V7-<1(Q8X= z$H3CIz!Kyd)yMexOJ5e2v%Vz|1cQhi6IYp#hVW?{q&4Y-F;%V_hM*zud>z^7#~87M z9(1O`{>_L~SIsZ zhj1OA%BD#0431oNJ)JA^q_wcQ?JYx-Ng<0tLuf1ZeYKK2-#+JD4G2CG%Ff7u*!@by z<)pn_xm}Nlr-H*|OO-EqKC+zgsmOzF-y+Wm9PKMZ+JgS(tfCVcpq8|Rts7axbro4^ zNLWW^5U#%d)U7wuhAu_6wgFap@q5V+SL(t9TN9752yl-Ft=;;xa@AaHOM2|^Z9v4~ zvM(&|poLcOgntyFT0i<$`42Rg9a0*B5LTS<(R-3gX#j{dTNCmX`1Y10kve}$bN9yn=#z%`K4m^)6bCQdo1bO9-)5E_~GD_UMnaF z2nEC+GyaEj*>MmS{1}u%xU>QQpfmx4 z1Rk?8KAQ$1hXxsoFbSIkIfpbQn-CSJ1QDw|3AZ*4pE4u2Al)Zrpr96upe(njB%inp zqmU}2h!(Si9;cW*zl<(IMky;EWgAunCq_jtUR4J^ zbw@!NMPUUsAw?|_bqgtNV+n05A#G=2T@N9BZwY-DaYGMfGe;#0FIH7Q7WF`GO+QZU z5FY&qUZYqMLw^y|2r8iG06|KLiI7DhWe${me zRdb3_bxl!oOVxCZ({xMF@k$Z1%Mo|TllAx^<54Z;)2QH*t>jUl=2NEOm8;-WXY3uV z?N^}rrBpefNiC#9BcMhjxK%5p)%0t+abS)?P?_nsALgNXmf=GL7lG=45x(yhTqLNpA!bHlLo9(Ml3UCKBp}@rT5uq zjJstF+hmh5_#ZF*K5 zdROjxR~`80j|CM?gcOYj7EOkgPJRC|9a}Y%Qa7L8xRBAb=wE;Gwek3C^L0qaLvHhY zUh7g($I7?PyRz=ps{Zx5!Hv4XpUtD29g{m<6I(sgJ45q(L-PkCi~D0s2QzC&^FMzr zZ=bI3o&VfF-#NNGJiY#PaeH=ke|~v)b#s4v|M>d)`o3=8-rmq91ipZPU@1um3n;rS zpQJ}bk@mUwMH|tK*2qCS}?A)k|QPr6q+C6VCU{Zad2ERq2R7zZ{uBHF3fn4n%*F6;ci*G zn&R!@n*bY0uQzQuQnPKdRZ(km&O(xjK+J*x0SANc^aBBB_}B>o56$pL@gFPSW&R>* zq|H?Fm`9T70Y z{Cb7OtLa{z;d*pAZw4g% z5avMzfq@v@wZNtp6hPz}eX){J4-0tBYRkBJtrkUMSoKMMq0Fua?J*Bgy_K`F0tp&3 zr0zd100o%RSjqO0_}aM^Q}{6gQ%#*P7z#|mW2cty7z#c!FSQ3V%IuS+JmCd#$!uTu zt+xkF;rskBa~i-3bxB`(6EUj2R8mOXG=RrmZcrO`XPdyJwj@DvXj3ik-8=MZUuKv! zpv_fz3Vfh6eIQzJoL$za;h|A^tw;rikIUyel?p?ID)twVhU`Wsw0l~HL*I%ie5rhs zjC29oCKj5y3vgw&daVH`MmOkHZ)go_gWLv|foRl@rcw#mWOJJ`+9qEg3HuHusxr!2 z>lv`9Cm`&B1`n+oSbM|N9VtZNMDRvR=o~eV)f5_oNGsX%Wd-nj-%v$MLYwPCnVu=b zqjyPpa}DCnqAyKIXaI?^P`A|ClGhK(5Br;+%SHngI8cWr)Kh|rDL1#$(quXvBCTIu zs^yuO{Ie+t&YY*PF^Pel2i**;MH7K7`FEig*6(0yITM1M8j&ZDWtU7VlDTOp@Id>h zaVcGJ>gt=_n|;Yks9A|gV0@Osz4qu@2L2R~E;W~T+s88I&ghZvD6yer>+N+_l8piN zj6sj2I+*xUhiGU+Bo2~*3AWExc6dt!1EZm}I^UL=O80@<{xN>bOAthOn)%C=Bu6t~ zCCIG;_?fEeDtUW_f0VICohV}O1}=Fi+PugMSYY5$UyEVNiVJ|D&_F;v3incQv0AlH zlh6xQhM4fY6s&3lkfV)&r=vY*vX7*03AFT6>7lK<%|9>DpJ|#=paDX~60+zo2zhLR z4}QeMVWEzzmPJ(^kIV7DE>;!lQ9-0Dhg9j#JBly&>}>G3{E8Oi^Bs1@C6(Gel4!QbdY6bhI#`V?O~dR^ie3b0w`7)hzCE zSvKSCo`SIP?RDd!eW4Dc81uc-3js*LfB)p-&Q)b^0hX|-(#aO?%lVwIMI^9^$Q(U+dC&1rYz;WbTlD?DkPl7wc#>uGIkT9M&;#$gp@fli6X zXJ<_?`yeqf)}>4uuTj#UQ*?8R#Mb*4p_@KVPCHhBOx;}VxP^u4cw!1R9A}U6X4COF z!v+5-_hkY8OmA(qN|$XbJ0kChh&|tq{}m%Sr@!rX-;*>Ta>3y^hP_~eiA@~YdvxQz z?all8N6s!Ao~vx_7ney34fy5gR_^+@d_MU4`#w3$)_NW^5|+{jh8^}FO^@d??CU7B zOjCe}Ci1~ACSLbnTF%-j23{5!Z~;R;=2Dd&QAU6Xd=8I&AR%TW`=Q}hemeH&$H+6- z5+5V3ges@!NcNZha8RSZ%=|%HJddNgnL<4nnI0qceof?Xj3~Xke4~L#6kjk2<}cCb z-@RA7b!)K08oW`ke@=dC$k z?W#z3`!$JDXdhDC6chjG*z?>7s#lKSJV$S<*-w~ue-v7%SDTxirq({U-1c0o9l7%h z7UQfX_a|Khhe~$*>$R3>hwvH{o!3iLx%iPD;kmzKAUQmg^AOUN-fMZT*x55qp-V-r zW?3;@jG0soB?IrQI4anYBmhE*%*I<2u`y(X45ghsd3YJTET*r{LSDV$s>tx@EO8lxDQQJwt7-l%i1Ac6ep37sNqnsL=zCiM?aIw@ zm1a}O@HJjOOodYvTb=my?X)m9xX9F1SL1*+z;LS;*;9HDnxZ6}rNo_U37LSyx*m2Dhtb(@MhEHu(_qZ2Xe?nR`NJ zBqGD_Uyg4OX-PQ4Q3i^?S>f|1Rj1FiQD&S?Gte$(|@87@5);B@v7O%-0({ zSxrs(_*fZ4ao?AD5Faj9q)e2_HG3V5suA1s{dMO78-+%M#`(6AF?O!;hj4}e@DM^X zm7@$0mTg zr|~fls}4vBj6d9{C0OaaQioYm1cDtDznBO+H^mFGDt9}+egV)EBJDcTRE7hm#&=4m zw6fMSJSn^*GW9Ib5>NuCQr%cp9c|d4H#l0i0cHl+Q$%^(hZX=hr_SWUUou9+v_^~N z5f>GN<|zCDD+${GZ4Rgr=u+Mt&*1x&j`2W5@QjBcnLbXpfoX*@_ui=6O{Wa;Ga7u2ZLHJBzP(o_jt!t!THnTn$fg zoP69<6U2z0P_<{uvzHxfZyeQ%%@r%ygzqTJQ)`xB+`~P0q~0$k_n|2rfQ4HL&uvtV zI<}y{dr*G1USfE#T5p7{yu>Z#;Ff}N4{x?iVcpH-#Pm_C*T%&C@f_ zkeE;u+ra*JEIpVpb06#;!=^xykBSq`$A+yXt?Qr_-cHrzKcGOje0QEuJn zH+R@qZGxpW$Cep9l6&m9n@;32-xd*qk=8_BjDJo)d1zVMCX%B{Fug?!6Th8yY4P7o zO+XHr+~GaYe-|hAczcsdK3h6u<+heNGle$lvlV;oLE@#lQmgP@oamLH!I#+>7qs28 zLdS&nx$esEj{0$*0VTiAjoX?EF6M#?Bh}O^;Y6Nm)0W1}jcxF7WueMYW-NDW0Renn zH}e@EO>R8U+hC^jo-a7OGLZ_$u=PFXhvRSdpo3P>+ptWZ8kEZRQ$?}HG3;MKXkm?p z?rrA|fX$m7h7RJFMYnY?0yOy=>eE$6=$m%?p8TAW!*`pO6S4F-=f(1laG;BGkjX9t zm|&l!StNCF7TVOI(?t*Oh8wKj>QCKnwFlrEV`t-q^{qrb{|vNUy{Ek^pwtd$TrUd| zyk9Si)p!bv=k&CWytfI5lb!$(ox>@xYN)#JJ6_+jI(+D;#S+`mslK)p5LRw|$-cYy z95{pCm55Y=Ya51kKI6#So$s?knwec)nRLjm^nXpw;De{YYJ71pdtIJrb$dL9%Aj^z zAVh#wy7>sa)N0ru%Xr-vLV{BJPTRXOJ87;wv3K>LXfjrvXPPjg_-g&x_&Rk?G++w0 zdgp54v~9DX$M>Xx2J1uH^0<<(_u>6qux;~Z)HsB*cqQ%_!}Fu5n~z@9Ug~wd!;m1W zGa$RRIt~j%QypGr_`?mteg^SUo6EP$zR6YVK@kLCja>NyE_<omgC0}i{!ylv0vc5#F~Ge|osCgFLeY=?{8@i4S?Odi`eIZGeL zop>DxVM2+KZM$T)ip^YZYjSWlxCIU|O()2C} z--Bpe$!aImRi`rEw23DJlz$hw;Z(-M{30PZ;ouM}vy!gJv3|}3B6s6Vdr-<>81jn7 zm&iuELAN01)0iS^X}C4)nzgnpN`FuXWY&EzMqxt2dYvuY=%kq&N$=xulOv5Ya40lc z*0D~tyu7ZTQ-on!x_btZ&Tl7*;Cbwc-}{EyD=9zSz9)$wUxK6-Px*OsJ1Pwsv+Y7N zdLAT~P&S{zUL{}O5yH1d9eyJz7c>ZetDyc{DGJ#$4oQ+76XQ0#MNcA{!bx2(ylKX~?QFP*L*c*7XzI z_fI-3v4$p)nd?=1$`6IU*V@8e0P$q3KzY;Aq;t?TkBb$HQ^*Ei|7YGRcsP7q;VHT3 z>3&(YgGeTL__d1TU8+5f#9Plk8wkmbz_-eSdC zv@bKxUrfTCgPHVuCpD;pZ<8@rjnHL%GT9T=(8pvdNJ$X}IS1W5f=0 zU}StPH`=gQEz(vx1Q9K{jPV*gg;>4am*w)SB47jy=V(UeJHu$7k&edki>~J4#%ECM z&zK@$Ff7i1L#!Q?O^Jm`YXc8=)5LsUp~v7)<-!_hp#Wvr8lr@87-U*aP3iYSL}l2T zrbH_cw#5brX_9pUT#hIt9d;tW-0b&f~*_5k%squVugvvPVb;~$e0 zuCHCRY%TqwM_rR-<_{y5h>uLjzxk8KTcr9$7neOTQ>v8F2r#wsgICXH&A-rgnJDEM zf{3azE^D(aux@wzBLb2sW4L=^k}-yzItM?!zF|#6ybx0{l(gfAcLe| zbjkd)ms?sPCZGKnA!a}>)Cc`MxSn-fvlA(=heV&3gDGzQ>q=W}S|k8f&$)kb zw-h0#676dPxAc-L1s#a!GG72!b{ULOWSH%X#h{t7n{Pi~M1k=J6C!N2bB8qJ$jabt zUHHejD@%%^(R=px5wSKL3Z}edDYHZac_3Gh-?6J2UAS9=!Me zXf72=|0m}0t=I5y`?7>&N`=tf37JzcjLwh_76%EHx=`I_NPrUQ->j8?F<$;@!u(6+ zZ?on91B>S0W&Umu{R`Uv-^Bkn12qZZ2MYQ@|C1jm09ha80|elY;y+ft%ls)>Q}hP4 znZi9c>-!Vw-OvsqAtEdMLr~xU-=kD9-lb$jlm&nivZD0X1~%rVCXWA!S1pf~vFKqy z4!q+GoLX1(WfSQgBA!IcgOcBkX8suQ)ko0bX_#DATQcj*FP6~*Pg{a%4^M}BPC@B| zVxx-ZK-N#ocj7_=?YEgHP%Ad7mW9v=d9?dNN@ohq3HUV8d1^4Rq`M!7%JPvuwJr34 znml;w%1SO+82n7vnVj!2-|H6`|F{izL%nbqhMWc_jHfj$X$x=h9j-gCR)e(x177p< zu^Z0@e3GFxt}>sK^y-Z>9H@t~H6PSL5^Psa27D;Vjn}Xrz1qHz@}?gb<3&hRIz@m` zC>mE=sP9psVC#rV*~kl#s-f0DvG``@!h|K9$enjj#*^G5%quy^)W(E|IAwbUnqaXv;Q^H{kISLPm+E| z`7?|4k0tzv-d|(Ve#gQ8Ni2wei;DlBihqrf_#LwLCv{`~J%H_hYW~&N{yT=^PqKWU zk@wW?|3p;$q4jTm_&>FD2>#tG{|Cw+ulv_M;P;05CoOaQ%l0ZS1^MB(81nm%<~=+> Jfa`bZ{{jgyOT+*G literal 0 HcmV?d00001 diff --git a/2022/day16-part1/src/main.rs b/2022/day16-part1/src/main.rs new file mode 100644 index 0000000..5bcf999 --- /dev/null +++ b/2022/day16-part1/src/main.rs @@ -0,0 +1,201 @@ +use std::collections::{HashMap, VecDeque}; + +type Name = (char, char); + +#[derive(Debug)] +struct Valve { + name: (char, char), + flow_rate: i32, + tunnels: Vec, +} + +impl Valve { + fn print(&self) { + print!("{}{} -- {:3} -- ", self.name.0, self.name.1, self.flow_rate); + for t in &self.tunnels { + print!("{}{}, ", t.0, t.1); + } + println!(); + } +} + +fn main() { + // Use command line arguments to specify the input filename. + let args: Vec = std::env::args().collect(); + if args.len() < 2 { + panic!("Usage: ./main \nNo input file provided. Exiting."); + } + + // Next, read the contents of the input file into a string for easier processing. + let input = std::fs::read_to_string(&args[1]).expect("Error opening file"); + + // --- TASK BEGIN --- + + // Parse the input. + // Collect all nodes by name to a big map. + let mut nodes: HashMap = HashMap::new(); + for line in input.lines() { + // Split word-by-word. + let words = line.split_whitespace().collect::>(); + + // Determine this node's name. + let name = ( + words[1].chars().next().unwrap(), + words[1].chars().nth(1).unwrap(), + ); + + // Grab the list of outgoing nodes for this node and strip the whitespace. + // Returns "DD,II,BB". + let tunnel_nodes = line + .split("valve") + .nth(1) + .unwrap() + .chars() + .filter(|e| *e != ' ' && *e != 's') + .collect::(); + // Next, split by ','. + // Returns ["DD", "II", "BB"]. + let tunnel_nodes = tunnel_nodes.split(',').collect::>(); + // Turn the vector into a vector of names. + // Returns [('D', 'D'), ('I', 'I'), ('B', 'B')]. + let tunnel_nodes: Vec = tunnel_nodes + .iter() + .map(|e| (e.chars().next().unwrap(), e.chars().nth(1).unwrap())) + .collect(); + + // Construct this node. + let node = Valve { + name, + flow_rate: words[4] + .strip_prefix("rate=") + .unwrap() + .strip_suffix(';') + .unwrap() + .parse() + .unwrap(), + tunnels: tunnel_nodes, + }; + // Add this node to the big map. + nodes.insert(name, node); + } + + // In order to properly calculate the optimal path and valve order + // we need to first compute the cost getting from any node A to any + // other node B, i.e. perform pathfinding. + // We will precompute the results for faster lookup times later. + let mut distances: HashMap<(Name, Name), i32> = HashMap::new(); + for an in nodes.keys() { + // Technically we're performing Dijkstra's shortest path algorithm. + // Since the edges all have weight 1 this devolves to simple breadth-first search. + + // Keep track of all nodes in a queue. + let mut q: VecDeque<(Name, i32)> = VecDeque::new(); + // Add the current node to that queue. + q.push_back((*an, 0)); + + loop { + // Queue empty? Then we're done. + if q.is_empty() { + break; + } + + // Grab the next element (n) and its distance (d) from the queue. + let (n, d) = q.pop_front().unwrap(); + + // Since this is Dijkstra's algorithm, nodes are only visited once. + // Therefore, add this node to the proper result. + distances.insert((*an, n), d); + + // Next, look at all of this node's neighbors and add them to the queue. + for neighbor in &nodes[&n].tunnels { + // Only add them if they haven't already been visited. + if distances.get(&(*an, *neighbor)).is_none() { + q.push_back((*neighbor, d + 1)); + } + } + } + } + + // Keep track of all nodes with non-zero flow_rate. + let mut non_zero_nodes: Vec = nodes + .iter() + .filter(|(_, v)| v.flow_rate > 0) + .map(|(k, _)| *k) + .collect(); + + // Now check through all possible permutations of non-zero nodes using a recursive function. + // We assume 'AA' has zero flow_rate (it should). + let mut optimum: i32 = 0; + generate_permutation( + &nodes, + &distances, + &mut non_zero_nodes, + &mut vec![('A', 'A')], + 30, + 0, + &mut optimum, + ); + + println!("Optimal pressure release: {}", optimum); +} + +fn generate_permutation( + nodes: &HashMap, + distances: &HashMap<(Name, Name), i32>, + source: &mut Vec, + dest: &mut Vec, + time: i32, + pressure: i32, + optimum: &mut i32, +) { + // Are we done here? + // If there are only 2 units of time (or less) left we're done here. + // We're obviously also done if the source is empty. + if time <= 2 || source.is_empty() { + // Check if this is better and store the optimal result. + if pressure > *optimum { + *optimum = pressure; + } + // Obviously, return early. + return; + } + // Iterate through all elements remaining in the source. + for i in 0..source.len() { + // Remove the current element from the vector. + let e = source.remove(i); + + // Determine the distance between the last two nodes. + let add_dist = distances[&(*dest.last().unwrap(), e)]; + + // Put the element onto the destination. + dest.push(e); + + // Determine how much time will have passed until this node is ready. + let new_time = time - (1 + add_dist); + // Calculate how much pressure we save. + let add_pressure = new_time * nodes[&e].flow_rate; + + // Finally, call recursively. + generate_permutation( + nodes, + distances, + source, + dest, + new_time, + pressure + add_pressure, + optimum, + ); + + // Remove the element from the destination. + dest.pop(); + // And reinsert the element back into the vector, at the same precise location. + source.insert(i, e); + } +} + +fn print_name_list(list: &Vec) { + for n in list { + print!("{}{}, ", n.0, n.1); + } + println!(); +}