From 6374452e24fb634298699ba94cddeaa0135538db Mon Sep 17 00:00:00 2001 From: LordBaryhobal Date: Sun, 8 Dec 2024 02:26:21 +0100 Subject: [PATCH] added visualization for day 5 puzzle 1 --- src/day5/puzzle1.typ | 77 ++++++++++++++++++++++++++++++++++++++++++- src/main.pdf | Bin 106005 -> 111843 bytes 2 files changed, 76 insertions(+), 1 deletion(-) diff --git a/src/day5/puzzle1.typ b/src/day5/puzzle1.typ index 5a5f9d9..665454c 100644 --- a/src/day5/puzzle1.typ +++ b/src/day5/puzzle1.typ @@ -1,4 +1,5 @@ #import "/src/utils.typ": * +#import "@preview/cetz:0.3.1": canvas, draw #let make-rules-dict(rules) = { let dict = (:) @@ -45,8 +46,82 @@ return total } +#let visualize(input) = { + let (rules, updates) = input.split("\n\n") + rules = rules.split("\n").map(l => l.split("|").map(int)) + updates = updates.split("\n").map(l => l.split(",").map(int)) + + let total = 0 + //let rules-dict = make-rules-dict(rules) + + let diags = () + for update in updates { + let diag = canvas(length: 3em, { + for (x, n) in update.enumerate() { + draw.circle( + (x, 0), + radius: 0.4, + name: str(x) + ) + draw.content( + (x, 0), + str(n) + ) + } + + let flip = false + let c = 1 + for (a, b) in rules { + let i = update.position(n => n == a) + let j = update.position(n => n == b) + if i == none or j == none { + continue + } + let anchor = if flip {".south"} else {".north"} + let pt-i = str(i) + anchor + let pt-j = str(j) + anchor + let col = if j < i {red} else {green} + + draw.arc-through( + pt-i, + ( + rel: (0, if flip {-c / 10} else {c / 10}), + to: (pt-i, 50%, pt-j) + ), + pt-j, + mark: (end: ">", fill: col), + stroke: col + ) + + flip = not flip + c += 1 + } + }) + + diags.push(diag) + + /*if is-update-valid(rules-dict, update) { + total += update.at(calc.div-euclid(update.len(), 2)) + }*/ + } + + diags.last() = grid.cell( + colspan: 2 - calc.rem(diags.len() - 1, 2), + diags.last() + ) + + grid( + columns: 2, + stroke: (paint: black, dash: "dashed"), + align: center + horizon, + inset: 0.4em, + ..diags + ) +} + #show-puzzle( 5, 1, solve, - example: 143 + example: 143, + visualize: visualize ) \ No newline at end of file diff --git a/src/main.pdf b/src/main.pdf index 5c95bab202c94818f14d5feb73c04738e66aa793..9aae509f94d0fa17670fc74ad33c02087b69d4ca 100644 GIT binary patch delta 8847 zcmZ`;cRXC}v(M_igy@8b9_-p;)rcBIh!W9>=-nbjIimLxL>ELaAxeneMUA#PAv!@w zteUv;zVGke`*QF8arSd&XXcst&V1)Q&)I|qyrm7i@`*!ysE~+&kPs{mf}x8$IQ;m( z?<@O{6z}37pm3qM_cv|>+Xg-FZg;!Rt!c+UV^kANitv~WE2qJ-l``Jt<}abv4H)|D zD+dZXpI?)ejdC(-T+5B{?&>3EU5RUR{2Y9 zsl&4F26$~*ue9kD*m`sRqzIk!?~QCH($tJe|4q~bo_mQSZ3?WdgJ zGZgrsCu&*%eDFN5uD7a4UvjH7+*_R|E&-kE8IqO$%0s*-$?jPp^chU?)+|F0oQP0J z4bzKzChIPq1%qE`b8Q*a*^%#=*rRgdUt0+(=bC+O=zw}PB0%u@n|cB>TbK$>>%*E} zhiLxN>6v<_X@P`Vx~N9FHA@I|-!@*%;iPEi{o5@-e(}+2mHBw1(sBEp-*d}tk_ZIa zr*xv^)3ju~Uj4+#fy2kj=PQ_kk{aQ!`IKQEH?s<&*{R#+{~vEan+R1Dd;Gxv=gyvV>ZT)Q zwW-X;D1{XP{|uegN|b;6k9pbniM*P>f;(LOT~Zg9a9E-@=fg&;_$pc^H}YN_tdCCeHDyS5H$0kd40Jc3Q)9#Wm0?%~ZT%R0TqAYm?#wDMG zduPpyyX;~*rcYPwwmyBMb*8*MpN982|HneY)Wng)EP)5Ab_fGKOLC z5lJ!_Oz6V|fNYBqTNz)3A0FTxKeM7;@rXfMVA;TqCwgFTC7xR|wEVFTMrUf7M`!Zd zFBxBMQ(_k~25eq0|L+?HnveWmTSeF>Y1szi2#g}P`N)slP7dy+_%9G_AmpRb)U&oI z=Sf)mHx<7;g4=T21y&{la`~AO$4JlgTX~}Rs$zX?fC9UCJ(xQ!Q1DhS*KKZd;b?jj znFm-E53b*Uam9h}Q;26`=WyR!X3AnTPtavG?t>}upd8)~zrK#R;gH3h-M#efspBfm zdx?OEMhu=Et#VJ&lT|3ojc{8PxFa)}3L3el_TgrFwcs8T8FALStc~Hdt#%E&@OqWCyUZb3Y(-2_6OM`G@e2a<7=q z8kmY&CU>pNJ|;U?)ZjMzHv7ayNuyT2XIU*l)$&k2`YHk7N_eLfGp*@wdfVLjHb zhLP`#WaFiCl!@3Gzu%vHn?MDz7sld<;!o3U1sta~2tfDzHX%odIb`t=8Avbhky7&M zi!=3SLTn5~h4D-NJ!Y;9A^5YF7G)8uU2ztSY{#Z@OGl(x)3%> zy~j7XmGewznpJ^O+>3Vc6R)o+#S<$(vY2s*Fv=GqF(kE=PKcm6#uk&v^9`@uC&P!F z08$@j=1k_gIWXDt-iZb2X^R88nM2E19=d2Qo7k-<-6@^@Al5?e zoch|zmi|=T-ZG>uYR5Gzc-fpIXHS^$;Hmpx__-)`L*#tFT z<7~!kMzb56U)cI!(j0rPo{SF+2}c;WwWteC$`<&s=a@2X)UuCl0K*If>_A?ME!z6C zR?Ux_ba&Z^&4>>cFw<1GY7Uph4_W-}0yHR;Zj%WMh%r@sv=U@WEGci?_wCZWKdXuZ z9^w7UN~o?m?3k)U$SW~1?9p4AN5l|wEpwEB;z{s&kWL`t=a5k3aA?WIuMX6YOcl-` zokb=d;)nMteC^YPw)?2%lna5-BHEwsMy5L*C0^LZQ8InTC1zUXK8_D*IBuKEgnwMj z&dtVKGPgGRd-&l*(SgKcLr1q)S7+scE zfS$Ed^aYV}`v>+UJQNl!2vk2WSbU>DOI>$;ae~`iWAwdyUsQtG|4l4l`uzs^=qTjK zLky4O%g8AIQJf>OwNodl7~aHN#875J>TROa!2BOAp4gP}WSss@L!Dv-9>HDO5r)1V zeCkC5J+vU7F%g1~cQ`F;yvl-Ya!>GZ8Y$W!XReJZ&bQ zqxi(tG*V5ng}++9<+W8jpuXBvhi|osDNw%CB{C_%oi1g17}NzI2_#(Z4ipmbM>WN@ zNGV4>tETjrOgG-C@M4LlF`|A>SnaY)7l=-^WaTT}WebszAV9a{D|=_q80z)QOW^dF zhFr{L%YcBtP-wJrE584A;}%K1f6OZC1;N4ay^sxMe3K?o0$?LBCvNN8O=>lJA(xZR zx1*{pMN_r;5sfnsTT;58`|gA63*lHF9=wegIvj-_RUVRL=pRlVIZA3lX~iwU4z2yT zHOzUWoP|V&+TGp={YdIJU!GqTMWiy{2iIY zm6omc@>(V8zdCHcr_ABj>opx7#!4(FfC!eWJ~bQKua}nl;z&Q=$X*-}^%R{RhK`<+ zznNV*X#Za7UD6@sHkxshswh~F$}yvGjPsV4I1LxzLHLtr^jHpS*bWt-uf2?gJCmt& zt80@W9?Z@AGk_hhTORhfqiDk^V4rfQ2_jMTz|`f|*1@N|9Ie@~dhOVn4J{Y^vRf_z z^KkAz<3{6vw{9-*Qyge~;i9|7Jv5g(CQaEtwZYw7xoJM*kPPDkw_Y><3O)Jy5XWpU zE*)qH#UfDXMJsYkbuK#NK57oHFH=zBo6lib-m(#t>VwI1RT!?ghWMsg!p@dhyQaw_ zpjD29tyKO3d+71UN&_^{??oS4jiQ2f?_6WCqJBR3Df3QJ-pAPL1kyJi)3eAJ;o-fX z@*gYqjc$X-*QIy5Co8JrV!m27sB`!lTfRQNg76;b>F;*zyi_*=#FMw~X}n-h{YpRG%XE zVOw##O55iA^dljn^{>ddavDLH)bX{NNe2F-DR~~Vorl~e^w3!b2a~vfB${J>z3YSw!W= z+C@kulUzaP6tnd-aUBwdzRpplAtwxOwBTV3YsZq`f%GcW26nmpJ%F_F(~G`}D|VJxz@C+V$TK)FV$nb^Q2qqmge)?0#jv z^Y~fP8#0!>merXV@VJ%D-R64a&%urTgK+8E=pIaz_m~nqiro{m0~oO|g^N8g2sr)L zml)f4?NE^Mc%E{GxW-5HaM^id%2T_nmJKLRW<6H!U35&sPsMg>x5S-Ix!G2TdYD*d zMBV0n|HJcd{*Q~Cm?nuG&-WJ^XInReXAN})qP6P&FLy_xK)J_vo;1PIeesS+Kwcti zMn+oUO^Z=pUv@A{7n)#Lf-iq-GuZr|nAQ-XM1(SlT$KlkOiR?8cZeWW72fZ6mMmXzyU9Xx2KuEF`fgi+P~1zt+IzR)!%ZHx9%#Wfl-$~rL$L>1 zvYk&czIrY>uvzQ9I<`{p%T;>2p}@r6ri++Ua2@vSBnZ_;3^JQl=rMht|9(A& zVaP2v%z!hD#TtMh97aehmG~*j%@}gyKbGC>kV@!{g}>CIldy+K61H3L%TQrAJKQ5r zxQ~bXyw<{bb$@NX!IMK=#38hfz5GTkO)Kwn8hO2x^{T?Nn-_sATUF~3^7UO%Q3Bk`d^ zv(4K*Gg1kmd2J*VaW+UA)raF+RPg?_iKv&}zM|c9W$W~ie!}b4ijDk{ zuX#h$P(A0U+`LGtvE#uFn2%h^IVz6`l&e3q@&=$N=hglhU-v8qxg5Pt;oPJG@8zn_ z?Ed>X#PamXGv0En&`oys!F7u$&KB$BA;!X7PhVMcy3kOAPrK|Owp<^rkb{(c(d*jr z#b_O$WYPg`(_c`lm%duD*>7cyHb}PUYs{G5^~zBeH;PIh6Vwbb{JqDmKdlfQ29)%g z=5l1SB8DSkpCg9jX;#&?uib$`TM5NxpFQxzYv!8(6+ec6qwldI*&tszv7XbC@Q{PtrMTf!tax{lXp35)6YJhVnkkq%8VibOr3%OHa=9O4xm7 z-FW(bttUNJ3CLxKn4zyveoPKxV1!sW*b3wozVm%hGl@NNYLc3Lmetl zGCRYWM@NQ|wws1Y$z@(DldQ>$&#wntg-|1SE^)(%U{WotTlHEuD@pKE5-P-7!J{ma z#}#jPvNrlma?pgGENfOScgu+v=&ItQ1%_aFZqS|iNvZ92=xK!>$gfPfJfQ~>6B+GAL_FEWp375(3DCmbj>Q$+3-D5cL_>Gj9DUW+#{5Y ziPIRfy^lZ!sW1NSx1A*+gIAhK4Hkutb>@Wy_iW{=Z9w*(I=m*B%~x-+1dEROkc?4; zyqedkG%fi#3MkZk9=3K+oi$kWiL)6Ww1-E%;v+v5TLJ_z%aqrjXnliBceAio{j&jj zC)tSN)>rX7j|lYaYLl?k2fEsRojqM#rYo?3&3+bS*xBt>`yCN@O4!*pH`*a+Q*g)o z3EEY>qX(iYowN8nJnpTH^lk|XuA5TM^)ATGuuknx4rGFC5&iC0*s`u>MqmMp}==L;E_LN`xCG&P~r?>L6 zd&6h;zBH!M6OvDVeh6Cn6+&4~&XpX_)ktPhqZnpFlxnDbeT&QIS@VW#m58<3{^6r7 zl2gA$Qm#gO1>wNR-D-~X^lQx2^~|$cf_Z?cvf^UvbvMnC9gQedxC-UpWAIJ0#KFg3 zn6Vf0_KWU4V~!0nFheB{hO)ph^qca+VYdsQhbgnIk%qYL->lwxOLi;`Yq$A|dy{>7 zYm*iJiAsu-wytYh@rjDem`0HDPyOgI%buD7yyF18e~u&$^coKdw}dnRG^3uY4(CSb zq;O=g?tP~|Mipgf2`&9QW^Es8PCF6youo(c+TU@Y!6pw$SllTerM>7+NVI-RwN>d$ z4ed=RI(b9tPgt3CkgpKdw#SL4d!zZB@UJ7R=cLy@&;G#Nq32!Hu=k0+%X8Wlfm=<~ z8}r%4KUtQ84MaOqPQm~-AHz}ScJMSRAj z(LgL(8iZSr17*x)G)rJ$`!EcoZV9<88c)zyI3T1!wqYGMI z;EzbY#ae>!#tg@h5I7VOslz!(QMPbNZ&=$?cLna^^n=C(F>S z_G{hivf~z;)xhg98;9M2Vu_bxM%>Nyb)Dl@_#4Drw$pxFwG3H<(9~A8ho$)4teXVy z@J7z8>MSZ>LTD_J=c)UwbToVEE4>axL(zi-zwl zCe<$9cNS=QeIxmH+I4##Fz_PVDj{^CFJGC~7Uv}?gR(MTl8^JF>kkU=bBC4*cR(bn zSG$SDjG`l1i2(t@J+98)>>z@+kluYQrQ=3GlnGx==T_;n9x3zhaME->qs{o7p9}p> zL8Z8P+8(h|^3UqknsdHS2e3-Rn@*MRu?1Q3r&Z-v`rkNEmp^?(pY7$VXQ@d37jf#k zjv{rhCA+_Z2u>p0QNlRW7@c=^i$))GzN$E-%+8w>&M_2PA!L{bjebrO+n?1lx&U7j z_?R;GvP`x)9#`A&H7?SgttBRIZkQf?Set?-Kz7S=X4o8v(IRM|0p|K`$A?u zI$ZPXZVh4%+PhbQYlz0UA>4O{%*$H0C+Cd-eXcY6 zOozB5pY#QG0#3IdR9%{BtzZ!_xrd@wI9tcrf_OE#>X_`5SfWk}55;hH-qDZ#v*F~0v+N5Ts3|D z-x~+lMxYac5^_^~2g!Bu3pyc8b#ei4E0Y zYK|5LWZJJ#BPjVXy*ly7$O_fy;aox1J=J8UyvNfaF$=HRt8miDv;;FxiFmuq6<6}1 z)03DCi#l|tMO~zQWR;GC>D^R-uYgFbnk023e8MPMG7RZ3+eYLq8GF~}_o$tBIq;e= ztE6S-h0o^<$^LJnrO`aZv4rHNn>ukfW+mD*Bs<91*pr?6RWjxo z&a-R1^!x6_#5{`v;cWUbFd1WyKS;F2#VsJ#-3Vl%#U8|^bZ0HSCqU5!U~O07xdRfV zpx2(j8-|_6{TLu_wJ+OtjgcnF>8(yZyG3qDHO0{p+ zj*!`slx;Yde^adk2BX@|m;~x!`gkYkC)`**gas3gZ_So4w|dy1gN`lqWJvWc;=1~j z(^VJuUO9tMPrBkSv5D>;$%k;ycaPjRmUl9WEus@79?u7Vn%^uwczn0KthZ@%Eg{lI zK^u)&y(YM_ufAhc8E<3kp5GrFt^PaENx*Q}+lH@>gTF5W=uJR5?Wylrq=wrx=j!X( z(I2LThohVtU+U}op`4rq-X+F|7dH~VtaNfhyrWHv>?5>M>D}Hr-G45Jbn4EB{gjDy_sE^8hXxmB z`|8Ys0D4cISw#*bUN%rTsOx9YqvU&7gwl-o!Zz>-@=&RZ5)u`%N2nYXx+j)%%sj$G zvPAvt;$l2`hpuZkX4RMuzx{}Lq`@Kmu=K7)j^APFk0w{2VA!tin!(nuV$a~8n40^1 z=>eoH?sLcdBWp{34hzg9i#a6&qYW~mhtZ5mv=lq7nn;jtZ>Rn-Do zRux!-zLOLF^Y0`AR+ISx6o*e^Y7Rxox$)^bNDDuQX+fSNAH&t%?$s#zfsV20M1+wD zR`8z>t34^vpKk~lEChij>IQlRb zIY$IsNcgHAOyn|<2sq*jJ_tAx@$Wx>SF%GOg|7rH z3`Sn5J{Syx0GFV-C_eNu{K7C8^76vMa3ti4LlNYa>LU>s#+TL*fr|+J#}@df#laW0 zS0EHYUR~s(#UNK4iolSUQ4kS;;J68k( zP$8j9O?aUPyBZ)Aewif~dcv?P$UsHF7bU*_Z}{OCSSR|VgPy_u?-4B_!DB!qDM^HK ZF>!WrcQ!L8f`H*LIGBioLrzuxzX0)JhbI64 delta 2950 zcmZuxc|28lAD)xOWNVSq<|RWyZs(r;XKf-x_uTWG=lPxQ_xUa@or>q=idnCQW3y_t zVuyzFrtWv2zIU)v!1*Blo8^!`9rsi?mp?na?~rnF8i3FDhxPQ&vzb+A)N@jN<(qAh z>UtOE22^(c-X*y|Cs}>W~FtT^DX~5}$*`n;S`p~=iFH5w-YG<|i@06!zJ$|Sm5Z|{-IPE6;XV{4)^nW_C zI{2qI+iDU?ejkeDeHR7PwA|KBFV$VwZjbdG6K;+=uP*fa;2-_Mbe+m%RiAAVYO>U3 zRoUahPNgH#y19q#*ID`bOgq_1 z7N@jbH>NC4OpU-*BX&zSJh3*g=jGA17ux5A&w={RMoDAM_o_a7NGL_}a9&BwL`a)W zz1uy7AJ*#DF8Y^`S5chamYVb3arg4Kob^;80<*lweUIJUd+D8zns-FXN~IomNqs3& zlb(m-AnAwX4!*LY(_=P{+{>Y3MbTa1ef_%4>Xr>(4Y?Bb2iCpT(v(PE7?sm}6W z7OUX{HksMRxjlH-mUxL+8?uY+8XWp*;O*m2w2)a z*p8TA9~Y}k6w0c`lT?GQKDcT!qhELkimKC%ik}k#X~>ptgdDzx7RmgAp=49zYrfO)y8V35Tfx?yL%)CPe-(Fb*6fL~O30r->ULCRRRF%5O z)FnT>*Z9Vg;$`QOD)#QKl_qw&Y9@6Od3d#V{>ceHI`fKA_jAP0VWm6mHM+c69;jkG zIASxIG2$c}Dw^D~Eb`8@fUXe>=_q{HNoIL{h0QYa=(IiSTt&k(oJM9pK#IgSBPL&@ z7<~bOtQ;_|QXxz@u>Z8nm&%XI0)s`BU(UXv;wuVQ+l=nGGf(3RZ*Pj`f$gf4rcLAF zY{lGF3uu+>Ul%n_3}q{B?oG~CR7~6%^mAp9Siur6eWDhot!h9v9)!R5?cV5B#yndy z&p8JhS`~H3U3${yOLgJ(F6)I4g+>9dyvcL*&l6)8XI&iit(yWD=j>M?0~*`Z>KGa+ z8c-Cj7m7T@3To*s4rW<=`StRmJ64^vsoBitAsnJ{5Pe_JrQ? zU#Mbe57lVDaAilYZ|}uln+!E2`n?_*hwR*&-*`2=>dv)oN{M|S%}lg#eYbhPwyre& z_RDP(4-1UOZYH@AnOZwG)g~y&e=K**rJo8i4>w&#v@IP*G)r^C)(qde)e)DyLP{IC zRg{!C<|g^`GAH81{`b7&y(@x_;B|GiZ^$8DG2UA7PSHZtY=K3vXBTD{D>t)OR(kn;({TD*mne zhqUs2?$=uIyggH3;&FG^fk)m0pkCdvM zd2PBaK|iWR6|BzN^+v54ZB5jDKiMJZ8yR}$d@W$4=h=zYlJ;R+`lhyQPltI^|KJ8o z>50K+t>=34N6p5bT|D&1pama>{ymFX$Exub(U6Ml`!i7FSM%2fB7vc6{Okel+>Hln;SX7)Ol5_@9aY#lsPj z%fl$PkpxbVTrEX>o(K)Y1Oel0(+C2=IN1>x%EbtrlN~{Qtkz#alQ6}pJ`AIPW?4fb z0A<@xVi?8#Fo{!q&Vhg;*;)!FI6MHu)JJFNPc4oBoc$4i0FH$KMLC%Ol)yf>6@~#y zB5YR~j9|4aJw>FrV!#;!CKNuq#sDKZLj^FdgUm#8XBy`-!^hPBvq5JDm)%?dXHI05 z3E+QYD^n6q#yH~*Tl@e0Mt|He1VXTD2MCnnVmPyxSV0pc%(4{*1ch)hW{