From 1f6b2f7be54661450a0cacc9e5d8fb3879bc2ff4 Mon Sep 17 00:00:00 2001 From: Alexandre Date: Thu, 6 Jun 2024 21:32:41 +0200 Subject: [PATCH] Reworked tree display --- a.out | Bin 347456 -> 273471 bytes trees.cmi | Bin 4660 -> 6214 bytes trees.cmo | Bin 10252 -> 13986 bytes trees.ml | 169 ++++++++++++++++++++++++++++++++++++++++++++---------- 4 files changed, 140 insertions(+), 29 deletions(-) diff --git a/a.out b/a.out index 3abcd31da64c057e9865ca3f3bbf43ef290ec976..0b6f420666b5ffd1e9d32a39808c95f4abcbabe0 100755 GIT binary patch delta 14164 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 P3~G9xK7GceU6J;m`E_y_ delta 70546 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 ovdP(KzBUH5aOX?=2Gn9GyWp$FyRM8Hv zsO~DQ9i&&ko*Bf{p@3|39pO%SD;G6; z*{@Z)X}3*%FSSE#vblDf8qpyHoMqVZR^}-4&NlUt$~9wti*VhuU5(D}=*{6iLF#!? zj72)APNwi96^d?qUrkR{or#>Gx|oYTQga~c+ibd;F@HlIb~8Wx8&aw}$M8O{Rp026eQJ0hwI77dH@jx&yoWaHt(H16`on-8tU&gmRJ}+I zh!(biz16_zz_$8QmC7e{?M=6Iofq8})W<6vSUacd|5d6unw_El7*HkV<1Bq{+EJKC zM}%<#)dgm4wjPbcFoufE?rf|Z;#@m#EDSYR+28!QgC3!VMYnX&PboFrtj^I9HNvP| zJzR}6BXjl9>KL;mSLdaU0_h{{ijg5T+T5B8S;s_Q$<_T+bH`E@@Z|d!;-6zpX1>l> zrOva-=;(aCMyWEhr7QZzvB6oSD?)C(d!5k@*AtxUG@c0Qy@{rz8)hG8rgqaNZ3lY5 z1_zJqbMs7~JI+WuqMf_z{z^|$_DL6abW}RtR21m^>=Q7P!NMa4Nu3zIvVgXo9DO3J zr=_YXCbPHxr@5uCo??dd)2qzOee`tm>wZ9|A1UaLBlVQ2T)o(%M)t&)#Njn@_|iCh znc${&ygu6HbsuL7Qhbj@3QQsIVX8bs)l9mZ$CVaL8m;>b{*BB77ABc-$edz}A`aN*(e=(Druh z{56$2tm>khDv@uh&UBlHaH}&T=jmx^(2FzlJRM9WtDqS(Pfy0=&*tf4RoXgqQSMAr zz8t&3^aXmYvd!BI;NIzHqvm$1*2QVpVG{YTGv(Df5914~5w3Rhx@u%v+V!!~*=Oma z(@YG#@hp9Ty20cw(iddjD7|QLbMiQ<*v3Wr$6DPK9a*C*xy9VNR4>iE8RI2{Wndded#W zF38>x*L}MwFU02sc#~JXTvuh^fpI!U3c;P`?d5uS+Fj^&`E^^Nr)AzPC|b)d#3xj6 zFJZ1(p|_^}REEs#m3mIvJu&pzmHG;GuPHwpR>VE|*?K1K$+w@ai_|*v+1dIGb)P9e z$HC4%2iPw>Ec)3wdOY6XGb7K_Gt+(d|squG9*F38*@v(Q@hrf7k^ zEIZW{p0E3){Yr*R`T2TO+5>(x&)j#u9?|zf^pPk{Pzj*kHv0G~1n`9a5OA~XM>@xZ zzpt-R4@WnBUtg_oZ(nwyzD@l)y6Zx^_YpJkVie#<%=s7Vh<-$wpZo|}k`>W&vmc2g z_^4SO(a)>L4Dtg{I#wZYIVEVe&$e*mwhBf5@#rI~U?25_d3!aY_{nIuOSr{6747!} zZ8VO`TYji*9F?P|T&n+MWj>AN5>)q?vMcl#na`k0BIf~f!dm_F)UD_`!em|vrde0& zU#n+L;Z?|^=M0D;Gp^D-?TtGE>UpQzZ2J%zqjLm~&N3lr?z~D@;ruKeouWgo);m?| z7LeBVmMim2ah-lay%ha-o&KGM+^<{<4(jFThu7()8t3ZMZ_t;fs;AAaTcO@7(bS*l zX+ia>LvP&+xcSS-Fsts?_vqJ@{p3|$%;ryYFgoR@y0kM+-q>dIqIYiALv)OQ`SNMR z)+?s`8U29TZc?|xSidzBw_->9UG$=@x&UYJ=&ireze`0ysC`Wj4rH@N~>K7u{}WH$W`zSwEdn`d{r2RGr*2F$Ea@Jwj*ZWO|d-Fj~3E*OU~ z|1R20yKH2hde7AD2A}uM+q)s@pNZw00c%x`x#kl+08ja>pjrGe*wsbv{aD|u)Bb{` z-9aK~cJ0=Ea4Uge4@G~xN1v>6Kfst2Dokbam@_$hKO?IW2JedIHJMOxb5V))ek&@FAZ;1AVWS0AB1HY&qobB2`{P=Akp znPo-N)E;wD7b}vzS0&S8IV% zpPIVvm|WW3>Z(3-uUGQ=U%WmVH!&QJzSZ5jQ>o9*>acYz?qs%vt$f_WydAcNr+py= zag;*V7Z+NKOZG{hCs7}mfe$lS)4xQY^B4@*a#;Gxyn=$BwqKT+j|;7WG!DD<+d-9} z(J?)&3zXJ6`e>2$7mW>RLvQO0G+*|%cpFpK#|ojjtB=#E`dXLvu&~x&a|3aBsy3gD z*IlAp`&w0&Zlj||4zO^4(pH;ac2OOpdj?tot%KV9Yp~Trr)krr7;U(cO*! zHST1E00vzKa6aK8j$4hZR9^JcqpZ^cI#ZjIhFibY?X>AJ!g@NbJtp$u=sHt2!m^{Q zMq0Zwbe4|R9A{mubT)*VWZk4YXmk1T)<-(zwAY)A6RiO{N1J0#gp9f7!xOD@QK2g) z!(Dmiy2(}n?miwuliC^N^KF$AN~IZhn7xy&!7xnW6l*wcMoyn%U4fgCKTpBBuBKud z#=4ohY1Slj%~UG~cOqjyn{m z6Q4wizEN&v@SyPL8P*-DD0yJu3Zswf=Rz1y)r&zzky~>hPt?#Jp-jLD1clU|@ z{yWxd3im8`oo-Fis-OAz3~QP?(u|pfnCov&pJf&04#1*?P>Bz4dH`tjfu?Sj)n5%V zPs~D$4mMxTvihVJV`5j6JqsaRI@_AUTb9-H5vA)ZtTpN==h|L%S66fL_pG_NXW^KG zzfXL~0eoep^|=~qmQ-0^sA25xZ?2t(DY$pxb$C9mNAUU?+`!Z>0Eg2SSeET;F{A3T` z?BS<)INzNZ3jQgldL6&^CVa=kAN26kJba^vpYGxJdH8od{2mWK!^7|N@L3+d-os~m z_$|Plo3b;#jvKrQb3FW751;Gd*LZk^hp+YU?|Jx-J-pJx*LZl9hp+PRc^-Zt{m-D7 z?{%E#O<3UJD?Pm0!fvX5_-Oi{0-WP@jPUStJ$#6VpXcGl z9)7-u5Ag8sdw5?Dzre$LdiaGN9`^8yJbYwVuj68`qmze6JUqw4S9y4rhp#rTEV1&_ zEpLdA%*s-0qqzP7Htgs_ z%dI~ip{_J_7h8GyN^Qn2&@-a@F19kVa0{MxHMa4qqqkmd6$I2Z<_Q}+T3z&Q+rrJt zI(PF1r0X3&+muP3;ZVD3fEX(aM-|gMH%$v%z3HxiN~7=W!3q z-oer8o2@r=_RWyE6q1S+ZZYLQu|ny$9#FLAC)QZJEBuR}K#|+bZ_spGk5TUR+_o#A z>Zxca0vJFWjJnObU)>(vbem-YnRj3+gZGSa_|L95C#3Jhj^0goF&po)j<zzdnHgmrJY$lU5B!1 z4!<;(seM|91~PIvi^o!4^F^xU98W1TF(vI#8Y7e_qfp`pK53or184?*9)&O7E)r-h z9zD}d*>oI@@GPmggdZH31y}%}#i^56pGxcn(9-Om18DDksy@qvZQSi_EW^98pWoOi zbuz|g+3MY*$PiuuD9vI(6@ZEI3KXZVG`Q$mfNRHUzCPN5ef~J0#i;=$;sU1^ipPZ@Au}h0{ZQ=(bvzCK>OjoFyiFRTew<^ z4(@KuqYp5HIP*ZN6t5*)`R**kp83FewO-5qAfT}|bZ-4M$Vw7oax#2b8b$*a0!XZ# z*>DCv=fP?c20%4FA4-1~cx6av36H!S6vvi2$@eri^K^;0J?2R@?kx}?7NGcgjGxP$`H2nZa z0@z1CQEA77X5cTaKI#s$1>Yo78K(R?73wAtP=iU_Bau3+;q9X>R?J;g%1IMJ9Wn4xMl&E~&J%!jvZN4IpzCdjg|#B0%O!J05*m z&6^|3F-PY{1+-V!g}Sk5Ff;c9#5i;SjgzzyB8~C@l~Mp-+{VaFb`@rg71zhys{}CL z2#r}_0>;D|kUrvU`*LKU$r!a{$Vy-4;jE2fZpIk}=nhB+ECMi`Sa8_Kc;I?6Vj+?~ zx{l^&pO~wVQAB$&fQ7+)-vnyGfTNE|h{BO+wW;l=LXl*Y6#g_&yiCkYk%^HO22eMI zay^4{Z51HSxRID8&%_`VBm=pIb?X`TSm1u+j`HwijmvqYPlZ^ZGx^CVk^X>1lQ$?e z7K1KK-k{7czZ}ULktLAlO|Fdq=&sq<2Peyd|Ak`bEGA;;*dr&l}bx7GmcapCNhW*Hh>qk z%$`gjzddEX#nw_CR5ga;?k;50r9WlN3hk7{bha3v&@wvHey9!xLse5TpH$qKEzHoz~XccZ^5 z0gPONh=&q^dy2hN@Cyj+x(vVrUlD-Q9BueL_Uyj^n*|^dT73e0Bd>bBtnQSW^QB@@ zpk)C1b2(rQfG>s(=f40*C=U8bhuV|YnE)z=QsVUSN!Q%~(1;|(lm}`urRa+R!nmFd z(BB+W8mGRZ@cDRjCeoBv(GR3<4?fpjPa?>{7YrJZn~&waMXJ0H2_?u|hb zXIQhJgm|11f=vm`YLRFi*C$$+#*MtjUOhi=iMWD~>F5gT7_VOy`dX-;`#{8}UQf`_ zrtn28RGvs8dW@!Txh9?>k>(U>3+mhm=mfD9l@jODk@EnpRJ2`vN1DzrTKV6Qrp;+J zzx7(hlyck$IUC8FcMUWqh_k5qN2l@(=pI!RKQMs@MrW{O_4vj1`Q_7caPCt}6GI_0%h{()(<@_IY8w0vJM;|Bt)EJd|HM#qRfV861+RY z$<&*>6V48oHga~L`kYb<;EOmVmlBpJ4-%anXsU?-IWtH*;Xq%*v%`1{(ky&bUkYGi z$y0Qxi`0XD^ZS8)yy43Lkik*_`-oF#(q*5Rmj{HRl%riI3j=O1GC}NLfWGbk+Mf)n zO+^P7j`7rtat?nQfrlx-OvGt0k%_Fr02-FyH#X;00sLtQnytG_7Q-F`g2@_|I#YNt zuxrdoiL9BNG4nx8jJYs*W73c!2d|SgAXyP4Fr>Ir4=jyNkf>tQCXf5UBE z^dgSMx*{d>ulevz&fxy&Ju7*Glf6HBMWm*pw;4k_PD7GK4%*Os=F^&Jrc&umJfdgG zZ>}2n19(x(?8#Cp)qwWoHDktK0mO#vmtdtIr2HlbX!jjYUqm~xBjxg7gPK_=*Eki*VN3FFoEfBLZu2YjYG7X%lUbob+^ljYv)cqANhBpm! zu*PmayyK0HaIXbpF|yR`rC#454{uLV?s(*xZkBYwbNWMd0*QA>oUvo2gr(7E>xi>C zOhl)g>!hVY<$5u${TpO!Biqp%v<}#Mnu{>HTT?&cBfG5=*(W4x)OKJig`9qGP{`f; zkbmJ91D*R2{q{c7WsB9NGe2HL-mG<%04l}|bC34-;%XK^MtJw<9PLxD;fTrHhz~>G zVM_3hKpI!k92rK9Y2>g^De2z!rf`P}osj7Mk!i{)@it8K9J9q78+;s!+QxI_c3R}u z%=ua8BhgEK?VS&ol{5Ae#TwmD+mkRq|BO8WaG@cex+P$V{yS;o@H7X{#T5ujdJ0Vh)mLiLoU($YEp_#;FIp$5=`|+v!fqJhIaCeutd<)X9D&D$becyqgWZ4!#>9k zAI1Ez-DKPNwNozN51?@+h-q-@un@rUzgqPTOfki(3u?fc)I6oA(V(I7ZMs{>L;3rDXrlboY%tdOx|8o+lv6ybPb@X z1&*fvN)Vx;y8y&4-EmD(y8#lVICHiJ5I>*m63r(a&X>TU9~n4a^@}*3mivKkT9|wu z|0#{%^R&hR1H1MW0Shq3sGy+KjFw`UvSlAzj{0snf7xH!=w662y+ z$;34yheSjWjwM>l^3Syrx-y?_!nd}>$EBFS7Z!+v2d;NYxN{+K&u^?Rz%kl%%54yUY>L^``4!-=#4FcYTa`klU?#&h5Qj^z>wTAlm zbxc;5nVv2WCHB*C$vUc@Ecv=Mf7ol2)lI(Z`*3r98Vth8`iVir zx#Fj`Ez^x|_Q#;;Mv{!Zrs8fV#u<0fhQ2zkUfh*nQnLCKdUL5yb<1>#&nM9(3{uol z{KWpI^tv14)a%!-UNaiar-7K1tX`~M;-`hl>(x{)HK)fiPmf0$`iJfr7t5vA`sb|V z^+=RQjn%v6^kN;Se;#elKLb3QH&V>&)d+vRThubW;&Vv!YA%Q5j*4+9dkxnxRIo9g zukAviSSP z0I%eqA3Gz__AmSyMzT&ph3oK{}4+ z;AELVJzN<}a&dVkfM=)pmNLlw%MWo~1#ruEw~h&>&p{tO)B^1(SUP~t<~5~RBX@CMi5`!0lcOv5>*le4AiP`L7=)a zCLO4>3OC?kfMWl8}TuaS^2%y=?$R;YaE>5>Tk6+bdoSx8JoF*HS^S=c#>B^XNOiB%P z&&*B6q)Yj~DJGNIOyjoo^aBCTecg%0Q(78}$?$bHapT0`?)f^Su&Mppi9fUbMjaX{ zTXwRg@>o=e1%N>7L-R;1mlK1WIa_%S?a}BtlqNeM=g?%&qL*SBxA+5(=L(xTj~?J~ zkYQSuOh`0YI-LqUCYeZyi_ioC+AA4pY8;NelHur!&6l578T}ZWN!3UvMx8$i%$pU7 zz0_|>?74C#9eb;NvFAQMZ8r8=V2Om=w&w@#cgeWCkpOJtZr+C|0tbqu$w<`VAao9s ztq8(iQYZtkRa-zcK>8#w+k8s`)0H#n!1NbI_gQ$ef!P8}h`Z(R6@UN36GJO+)Y~1X zZ6LDf5Cy1nJM2FqejS0DO|#Uy9XA^Ws?eBZN@ru?+4fr!p01opho`@8x^HJR8=ft& z#Mc;}r`8WoI9!+|v#B<@jmK`!TarDJfsE~BByhI%toT4R+itgVoF5Ks>~Rqfd*s1Z z0eIj#1#mk4_Gcy9?*jS)a?OS(RLD6kcLF*L@ED%PjzHVgFQt(Lm-FDp*E&ERfKRMg zz4`pv{TnCv16%<+qeIZV)g2$f*?fWycJ7Zs3-B>Y4jEkr;DR3f>+E*8b1*Ui7)N$M z^i+-js10ZFsWS0)9+aZxi(~8?56A};0VoO+{7k@406gI^b7>J~xrp1le!uymtJN#B zo)Bis1pKIdcoKemkbl;#Gr3TbLI5S>R&_DpRJ*QSs8Aw;y~2ljP$u#oZ))+wkyA;8 ziz&9B8*db-A{^noAtZYsPxO@l&Zp?aIgcbK*k$AKx2rbb?{v>i52Vooln z>LP%n9@_XdbdO_hlikNEaQ^xor;yDAd;1LhvA{urh%jR>ugQc96ZLb<-_ISw?|;%@ zAA$4ets($l%VsmR)3Vz+4)843!E{PXSR>B@|`#> z>cM5fR3`2* zX7%X^aQc`jPucGH|L|w=%4h{zO4`}Dj{O!Nu4!oI+(dxPk(Lg|U(ms?12*{9Zg&g? z05zs|o62i^*q;4#zS+E91v)d3nMsmO{PeCS| z0Igxl9Ime@vbZr#nRYx=h^7a_cuE7t9$!|GcoSRb6K$!bFn01wJdXYhKvO0jjPd%~ zHdOX&`Kb;1-0!L;6zG^(1Lw1~Gv%|jg`-gYNRaNJTc{N?M=a9SY}$xl=k`8{&Y85$ z;orA#KXt^Yml$Kq*a`xe){GyJQB1r7-PTH(GxUKY7hUu zgChX! zUOD}-rZU92cg62btijyR{#$>8Y6xVT4`5nK>QWcp7qaEP8?O`lsWaDb-|&x9*IK|L z0Qa2wG)K8aN!-6kf|$(O0a!=;;||ep^tY>yf&}x;Cj4xe+4!sqB>aL!>rBup3$$@! zsFo&Zu*>kg=}%fFD{q+S8L>V+B}sjdr-ClAN*o_L_%#)NI>zrfaqNGIshTs3Bmx6h zf;`E?Qp_q&~EcU&MykIkb9$*-_JcC+{nEEa3p|7N%!x?Tz`fN zOii>2v5rd(<}Sdp#Jo#XLuqBQ$ z^>B_oW6{C9;!6Zz{`CMnkMDp6{!ZIUe0PNbL@K1{k9zrj6E&6x_T)SXAQEss-=U!u zNkjb0n`&VztdnlDTe-evbM@w)1I|SB2pxs z;|+=hXiSlwl9QRl10#C^fbl>&e8S3>z&XnRj8(SmV@wg3_1Qf7NRAK(i$xO7qv4l3`ZJ`E7n93K8Pz{j#46yM#Ob*r>HTRcn0`B+EW1x6%wbH+27vz22VuRN=x37n$!VyaYB0$ zTFNiWDF^M&mJUp$F9U}dEg7;NVF40-$!RPR$6#P}RfO+}nRxmOagc~ci^ta#FOp+=<3w)i> z)!dcnYM9A9^OBX_q?5@o-pPl^xnj}dV(&>v#585nCY?KvPD)n1gL0~U-s&uKT8Yj$ z7?0Ah1nR^rknEv{CF_~t^8iVDy-O_Z8)Ue>>AjHiJ(DIK&ZLQVIOS4+WG&kcbE!{* z1VrE0oYgH6^PmF2Ta7*`Uc`FDVc61e(2I{#U3e@x5d77m^S#hh3rXAadzBj|9V)KnSMKdQ>)pcEDq%U zBI(NXm2~B}%xNs8c_!rHG5|>6=s^wKMMC1bglQe|JFGc}e+?Pl#W^rBpK1aA!+<&n z$CtI*@esnXNU{N7I=yIhIz$l=26K9sTWkXF#vCaQP2k)}>{#a8t6hyil=0h~kE<|; zVaVGKaYypi8%J?U)kyi4eLLk~eCs52vJ&|Vwac{Wq;@vvuB^|8CaD832HjZ=kVKax z=1pJ{ZjLw>6`waqVvm8pq8y5p=1JZ)^5la)iysoV$5Q%$WX%iKQuliYZs&(8-7-*i zyUK6Aw#U0T46iVg+X9ksag!eQ5;;uv{j*je3nCfh6DKY%KvPq6Z%-3y8`IfTIXY@4Sw{Llv%pyX_@Xk2yy-*^K5^4 zXHfX3Q+;yf-A55Xq~M++PnZgD-4j4*m>$BS)e@C8B~d;&gaK5jGl2f5l>Ub?s=1Hf zZhsBW5u4&t3W|I&RQ%PRTw#uSePQ600H!v9-k1mwr%OwF$TbRo_Xf{hNLW%j1K(f3 zkBiEDY5f7T2Gd!VD3kb!yy>e%e)5y=jyc@1*m8X%wm8O#8Ahkb#RaU7%`9x>4--)Y ziFJn1nE?M0MnZ~eaXelv-V$-XUz#S=h{VL?BHG`tr@!#U6HP|NcA&>JN<_01{V6H- z<@4M15*_$Bk*@LEK$6=s>JdBlDBrg*1K@fO82+MqIss<2n(=GpBiJ zicXsv?-PH>U5rI73OOec8~p7q%Fn2y2U;Cmr!-~QRtJ|OaHFMxM*9ZB$oHv~XEYg3 zYrv&N;bg1#LuS@>D)?;*shH5;y0BtZ$~Re$Sb-(}z-lUpnA%dMTMs2M^Xw=~DGB$-D82fq(P)xp|{(Z%NE~8l+Eke#WiyC~|Lga3A z%c4HXl^QoDil4$~_qa7N7PtvYL18(Ug3?^U;ch7D--@D>9(y`+py=RRxNUXwQPcXu z(|AajO>I&59{-QdXnf8$5H<}y=On&wGHl=pjz`R<|KN@J#v<>Kg%3(f&>lTLIIpSj zDe%IBXR%g1oTf)i2#l;@W09rX-G$TmCl|ZxxU5K1 zkwACwtm;1lOYz|G|6rnnH~gS|;DL-BNO|aH?liXpwYZjmrc_JPckf>i?9{Tc%){^0 zBv)M;d@@ze_+-`UQ*lC(6G}X&Ww%`4NWBT!Js-cy<=k2rV{}El%Oik zv&wJem=j9lsh4sbWlH|8LiU=}oWtLJXKXiiYsiz}A^7flH@$C!owlJ>eaf~;|bTH;5WQu;_dHAdEuC4jhkv0zk z{MD6qVl*)@{#(CR*Bi3=cUtPfU6w8Niq}W&Fc z@gWZhvv4hTpNMOzLeg^gmTTrU%zpT*?{3;T;duC~@3HWyN%##+Ze855Bx#wz5{L{u z7JPX+(28J;Jt61`Iw&fKzxwXhe(nQ_>gM6EzSru(sc*_xuMU6p-8pndoWmmbRQV3U z5X8@X0QU_^UB(mNOlRBpe(SE`zTw}GSuCBqKD12p`ZPzmL`mGgNP?Km+5uQc{NoN$ zR-Gks)RZ@91DMHkuT&atc~tkqmDSU#1hJh95(_F zfAu~7NEx$IeA#h-AE3eWZ&o1QDKMRztu%+f`X2eFOu(|sJ3D{rrLW|!z7^&7@K@gt z+<-CElc+DUxgP%NI}Z>%B*;O6PfLimcW&DbfAyVDc4=^EI=io9bkg<8?CQ;y{vt00n}Fn zrXmuX%W=I1z?am@7jVrQN|2+i^V}Rb>F_3+w4@l!@%s48_-+7rMv`JmE0ZZjUknh& zEoDmQ)>jkjbfI0D549f7Q02LpV^rTi z#++m>^Bm{z-w)hLJzwjc3yyP6HboeqeFfyuAjf1bX2p?yIZW{2z+&zk9CD{(x*Xjl zB%I^>&>`N4oRFyiXHdyRL6d=ge8TT`e8i~u!a#O|DQ3&F_;wJf_@jdA$43gKqm=$A z;kt6 z#Jq*Lrb}45g#LWrxNCl#^a{{P?Z}V}s!c@){4gqMH>V)y&=6Swzf4rnaVc8L#9PQP zfV%OHh;tVJ$Wr8$aG>$AKH?}xWyP}6`jw&LvH?*T3c{8GG;lcjC@j}d0RMOma3%*0 zP8t#ZzL``fAT(>@<`{O?pm09P*Hf1gJx|ikdQ&m1(KtW7e`$j zr4j~`QDYkUHDJn+T+AGF$oRgZ*5D(fbelhBXj+1}P11m(`r~RI@K(fC{inPMDp#uu z7t?|knqu1gr?{^%M5 zqRB>=Y}piuK|o;`owQK$0RqIi$h!iZ}40k6wJ#2--yQ?HhS7KJ-dui~R?R5EvmZgf?7f=Rt-0K6vg=VYGyg*ix_Jh{@b&704ffWIR;1vr zdL)3-v@^A{@T*abv$#WOZ0F_}N%D*WhI6nc{lKBldDnKO zylWdd1DRflNhH83A|JST8VL1o@&gwb?+c)hxsK;i>dbY#>8HJV060z?b_Z}L6nmHA z_n0RAJ#!w5HTMawdj*R)ho=*+;o1uUJcM@xoDQH5$WQ1ok>l6$i6D*jT>xd&MxAPf z2C(kP&%Kci$#B>L@U;#=ad|)AYvxSjOo2y#R(Wp$x!R zwOzZfpp0?AT%jE(GaV?D?f|89uP@$Sq{K~bqWSU({9)-^YIRt>XII>mX9je_&sxt~ zX9dfqVSE_i8Tg4d5=p9YEkL@=5FRay0Dg%b2_wbmrGzxaA^=0N7C;I7;Y82w2hejI zr*xc8jfhh_T04Fo>2WN+-;=CkJ<&Lkhtc*g+}Aa74mw3j=GeIa#s+of z6Jbgt{ghm;Ifpjd3L9{4M>xXYaxHOsmcHP+=>V>I7HhmjbDw~csW22GT(HYq@Z5m~ zF#%-0%%h3uEaEdE3>iJ|t&{$Sd?M}wVe~>13;c{|^B_Q?fEiH;ps(o{3Mba$U()7W z3PE7Mtjp(uBD?J5kR3iXV5Yxd1?=5_59;NhodjP zURN?tx}AU#`j=EP0E{Y;ZkqGyt3l}D4A{(xC(kpnSu)#+Gsq)nmySuS@!NtS=;vMv z9Iy14G9B%`&-GV3q!B!TjYjP58p^d8U>HE3cHn{J~E8aKeDzLgX*SpzJ^T!yz_ z$??ExW~L44F!V(dY5hjP{G*)162)YA##?Cu`lt?>kRT)IOrsvhzDHXKO-`dcLWceP zdjj#P_Zu(3B{(G`{OK#Q`{`3JKW*r3etxx;RxYU}DfgnsfO_~B_!)>UtoD8docU(M z)mF%?tkzja(ope6EJYt*k^zjuLN{B~1rj>yyRiZ{auOymE|@yBhAixgYo=_X)S>1< zQ}T!o4fWe!WTi2L3`rCLm_4zuGj*G+ywjPG!iC!vlbDogGTOK?GbB=*EJ-U2aQ>ds zn8)I>qZ3A0^Iig13fJV}!jw(NPXn*&rUJQ3FqaWqFM>>VKPzO9J}ub6A5^UQuys4z z>evBXoR<@ixaz3vpA7G456B3b_2W^+cIE}ltY@tC>SeQGt97&~-fGRwrbS$brKAkS zqE|R}bA#?z-6gA@O|axOv-er+iUv!zxl1-bmte_uQ}VoZGY-zLJa0wO{O|?q>gx;f zho@*Jo{6Xn{Ya613xshw06?Geb@LPZ_xE=%Q~nCGQ)l8FzvwIX)FR_&$Ki{BGwfvk z6yP*B^5Y~YxET=~L`J22`9*zVj{;{RF;X~(g8p_d{!9&8Mv3(O;iLWgvrI(>-Y9$T z_4*`c#^J}u;iYkSK^(sC5B2H&6}VrY`+*&Pkq z2xAUDvVFY{rM4j(v-(jSxXybuD_e}kM^ib^z?i12jq2n4x*Qj?d%=_Y_b*0U1mN^S z0Aq6pbd$P6L8SlpzJBV-e$wJ=Cv4<5_Zh%Rn|;-QQUG4=Q?ItT;vltN1SkXW#Xbtc zmd-B)@I{;gv*lV6^sk{Kj|K2`7GNPDevZo%XHya?1@J}Yi6)adnNfOSPQqgWG&^7H zCu0$cbjnO2?vhWCF1GPHl0*i8FOJjWj1C%;_)%U<*6r-FwV{#RQ3iUwVc4CsHbM%n zWIXf*gaH(+5+JVA=80FWpPKOH)(xG>wI6^l?hm{k3HXD#=r!EzzaG8yHS764oz`4; z_mikee*-a$=2n5p?qJFhbE7x?uQfB+abw^4i;ST-tzFu>UrUF7gnvT4lkYWAPbgPEUOOp zJ$uEx@QCpIrOU(T&Re*kdgZ*Te#eB@Z!Ik?z3;@*qFz<$Lnkg@j?rVn3v14)SiGkfbOvH{76d)k3L~VOuU##;bX&niwBqV^UIYs?tlbKmR8LRACq3} z=ux$B#j?c}=cktti-gA=H#7YxXJ7)Zj&`pWp0#Mj%H4vPqYoEl?zGMBQ&9mV^>7hmSNe_U=)yoRm0DL? zHg27{sDGfdp0drX>JjKT;OWw`b$uP$3oBPBeaE)ab)JQl{sWM{h~7E#&Re)r>DSFe zJp!YYZT9vEoTd=-=tncg^r5;DmVCgx& zVny}J@1X$ffLPa-qd!~p+egm0I2!F8SgA2E;iqr>XK7j4`M*@Zzv9X@e_a$E&@a$lclPXl zO>x;dw|(-nOBO7yDjbwMCVKBfW@P`sGgjc^fZ5+akk{|-31ugjp|Zy)-n0{;PNxx4T?n-+!@p@}=7gxO$IRVkhJgVnW3NGI05TKtcy~>4 zUOa`|aJ8MgsKNZi%p6)%Yt*4hakqOzB8RBQ`qYFxUM-<29&fi zrFy(ZLhbJHq6x&<%ywYBdX2=jSCj2fI@;)ZVt-IEpn5=y66zfcEg_!94Iz$l{d%oY?TZ9_tdw5n zQ_aWKw5@cK{B$O%-z*U+wpthBY}^=t8~|5B^)hq^aTd6XIO`DzhC)8SW@w;{w;T;K z6KW@3!*t2+4OWu*sL)1(Nc>-hz&RD1{)F1XP%Vz%31~W<=rjQ`!$6s2MPFylHC+AulG7qQ|F`iv zx@{kW*@RT*N~(8~Id;25++nN#(MEEShLFtFH@NkotPsZ~3&U_BRQU}XZW|h5qhcG4 z#F;zcCNv6?Hbc^@7~gE+W}1EeOp<+eWh5NdD{=0nR_<$g?&?_{%ovtnT%9U~b2rIQ zmxxie>(MqEOGc{6CSLxyvAb+EP8#gR#_o~i@wV0kn#V9S8QPRWn<+St;TEo>d6ds3 zc@*fg^suic64iaRQQa`=@E<%WgW)PrCbP_(P>4guC6V07E=y?1oscFypUB$qvqVjz z6ke33MIxc0(t}c*!Ua;4b5;e_G*&nDD@kh#(P)u~ay!!s8~JG2+7Q+6B-P2bLYa-^ zmdGo`G+U$6Mt&RVHVV-4E<%1tUINKWad{V8cr7ijiRibdZv8D6{T5bBYC$`K=`?~yK=YyPr_lB+4&iw&{6J&ais(8iVu(d*bSs8( z9)nvlelKfVibRDNB{#o@M7oL;S#Eh)8WgdEthLb$8%1g0djLHK?Vf{nO*rt^xv-T6 zeiZK_@Z?Mn8`Ypp;gRB(!U+rc`!G}T7o$NsAs}&v+S>Lw%SN-Q@1ua0Lx;zq!&BJe z2V7V|eYc={i0?x2Vg$5sWu4C-h>=$$5S)W|V--B610<%EJf=C4|2j6`oe-rxmA=JJ zc##iyfX(!{6Xb8@Tr$E5y(DY**%{n#qX(tu57`(!%pHq056xp-V`d-}(TpKNc|KPb zdoNVax#2=@0q5=(+#{4zI|ybWW5lKe{fRN{gwCJI>=BzQ^r)2&dW?fb94zKw2?u}S z;BgN44h}8l%rXw1AiY)w09pYZ+d#**SSa8^Ptt4UZlsf55B$Ae2g9t@_gJk~a!IRy zW}QQS6$ve8DQe_}m`eNURFW*UzgsJr*m9w#h~5-2{7D|}-#Azy93*~XZc z1hbtn>jd*EW5gB@?O@Crq4OGJwhLw_W3~xq7h|>xCP6y6SIE10_^@%Gq2li;*)9j zIRHD{WL;G9M5ynOH~d>bUqiRE(Cs`HE^y&8vFB(Fh>orUc#VxN6r&H2(ZBEkKVjjj zC8W}M<>&~gfgEJX57u=kTo-?A9S*LmkjL0p3ZQ54$#%EdBaBbc))`Qfa!5C{Du7)q z4zY_vhluU#0eu6htsu1v7CLbuom%bzs1es7t5%EZVFMsROsEASlY_)UDj$@Ah3;I) zrxtDn^gOnZ5z|8f0CMEUXK8!we3uOG#YgnTLT@e<(&27EtK>rD@yD&Ou8RwUtU?R{ z^c*V$IR{%Cj%mNSz(D_I_ZQitBStmZal-5L3d8B}06Gt;MUYy8&0}j!m_kD-1+Q50Gi__Da8np%YRs_#_>@V*o2o0^Z?@s0D1wN$n-=bu^7N!Vne-7m^eah=Her> z;0_ZVeDxtszW11?AU8e(dz#LLMjGscfY#8PkP-YQ#Oa7|l_Kjx#ObI9)I{$@@+u=U z!-lU`kNWVJI)V>|mDZx=sKkqwqp!6Zy)Obgir-#GYaE?Z*(2Bw1pJV{eIL;|{0N}$ zAoUQW9>Mk&a^W-$cLkueWFgIoRYzvCy{e!2CzmBoN3rGpV`2RmT~3@1pP-JDSmq1) z1P|aO2cOVLo(6OU(yoQH_Sp0@T)2TovI)>;5=nj~u7W@2i-dhKy{d-Hensac=_-7j zvceGCdh{u!;!cMY%4thY`ud$AYl>r$F!f&^%%aHe{H*_}P+R+wf!R~fAt!C5-K zBZ#|FmPTOd_MWi)t>9q^M+Ndzns;a@&6kA`o>*HmDW&}^ZpNScYgcA$znA{igswwsMe!# zSH`NtomMN0eCys?^Zn)%KMpd@JRXN9Qd1k!aoLWQ_kZueiL#2qR&4|4b`9KMnl7$0 zI9Nq5P2;XsrQfV;z13AYrc3&y+}`hMQZz;6S~cz}y`|*KhLJD6a(KBsyB_ghm1sd$Pg_}58(P5iC= E6`rmI761SM literal 4660 zcmZu#33wFM9e;0m3#7yk#1HW+MIt!}2)Y5(gv(79LIcRL5IJI8hU{#zu-Of}!x6C{ zhqM$Z1C$D)@?tpTs9d5zF)UZO5roQ7DUV(lV_a4cFc7P4RRtk3CZw@_3avad^A|x4VKop3QVA15_n| zM(C8Z;7ZcO<1LPpM2|PdB}qA4GBDy-(MTp~L*rX@(vFf8x9$dq&oh!Vq@=x#d(N6Qj9t(o>-M+|!WW+)*dLTBeowA_1Q$WtH$r zGFUY&D?My}dh*m;+lXG4>_zTu$RLcEUS)f06);9yY2YEaM|BG>W@9P=cK+BwEh3S8n1}fud?M=D5!Nd>Q!R`CWM1pu8s9s5stQy zVxch>D&q0q9EY7g>@13t8i67#ekVp_jX^gO;1h=NJ~R4qbJke(589lTu=(Esbu6}g z1jRs-w{23D&)5q#!f(j~78+~YAICE%hroJB6yi&pqLdYa*uP<6%TUBZWfmIGGI!!% zq5e4GHcq(DaBG2o;WV<(n834dR}=|{)gqSrelz!VkURMXf|)21)X8XDI2zATwGlDP z^#lt|;#ZPH%5HyPENY?2wu{S|u~%*D*DTc(Bad7(0ykNPo4m{N=xgGYMji!Icph2m zL^bRyjYL&nSya`ua`uM}WiVWf@d1&U6L)7JvyxbD(3=*-4_-Ga?!;|v+;2n|?%SxT z2F314VmO&k_Nv&Bx(pHp>+_F??CKuGm^$asjGz-9Nqhd|C?zYsu0o&67 z{8n!MPQp2`{d)j&0n7t1-zex@RD=^x;Ka{aLFbwHrcqFejHgZKVl}Kr6;1U8Ca@=g zc;r+=DbuCTKk%aR#Qyi;hZaZ?JfP4*!+Rx0({Zz8+^ijQzY-Sww&KLwk#Sd){$r6+ z)%1T5{JW*;MWRV9C9_yCwnqPv$GD0YRkjx`kyrc)it`qLr2v*00q@0V4sP}pZgztO zybl(4jeyUxvjQ8zGphE7pyPW)h5-uwD`2#Wj9S8&`v*Xrb2Tm@|9wcbtg`f7rxK+PW-fFDj@bs0P@z3R!iL)a4BzQ=mWu3rUpV0Me8la zYe6gzRcIY>eWh+aaPnb|HW(afE>(XPj67|i4+YaqYBus&k*6lK39{J?U<-h)06qe+ z4Zz0$J^`>DzzzUAd5;~L7%jz*A^aF&i!4~Q;XQV|g#5h6-5%ECU|6*Hh}mLCC*I=w zX3zd26WS$GRQULhHd^U)B$%?ed5@B3DOAOEugJ?kg>ZKR*dsUhO1MwBDUi&5!Hkm3 z0l^HHOtoNMmdruHwuzeeChDK9)sdn&{+F=;UiTPR%2(TV<%Z;j?=8nPCQt~S0~|Z z!(c5&wK%B^Cuz*!53rcX4K`rs(D%5()MD|nb=Y#7~gZT>$^&ml1xna5`p7VLj~M0U*yi=wDLzZ=Onn))@VWla}Emb`opwBrM)H zQt6D*3b$MQ41ntqLj4iKzhr-}QS)~I-StkZt7n$F&-d(5*ZJ!OFZOIhX-a-LI9Ye) zRqtO^G3U~Ew+eoGt$6W`dz3ysRP%>|V|>1$>UiDN&!36kIO8jQGx1u#&5g!ALFqHF z?^VM7NU83czVUF{r4Z>pfxJGdSNkc2lxBcrprQpQs_aClyOQ+Co}8xJ5*E?)>0j0_ zCzN&s)d2Pupu1M**Cbb6KOen#;n5kDX#?sg?F53nu=adc-If3C$ma)pTQA-1 zLFu#L#uF(m3#qIq7Yn+cI(BJPVfThj1GT%mZKBi#nw(&<@rtaw8jkpWeWUHJqCrn2 z5AW3Rgkp;(o4-Wst`Se>->m4j;gi#AANe4mdUqzJX~K-|>eM(bP&IAu&V}JpGaw@hyCEg-}a(mC6pV9mMU6~5;Mg6 jx6NGBt|q;H*Ye7-7yX|dGzS3@HUJLxaq_ diff --git a/trees.cmo b/trees.cmo index 2e95b0d39abb34678f5274a3197cd4d697a4b3d6..6fc67aff33ed6bf32a9af05d9183950ee5021bad 100644 GIT binary patch literal 13986 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 delta 2086 zcmZuyYiyHc6#ky>`_`_vtz9qMO1EYm(v7inrNWkQDFKAQWGF+88#bkFV7P8$8#*Lf zNC;vik?uuw$0C1S#35MRJ>ro7FFusBlffk#YL z$Ke*7ALOu`er%{ui&ezm@qe=;?xtx&-=TjC-KJ#PKxr*O-O@$NV_TRxp1RMv1#&>|%c!#vbJ*IfhOc0v5i{yum>L)_!qma>3ouc~jQSl+vg2`> zvg|(z(<%0!fQkAE^;4LxF`kC$9%BGz2gh&1ELV9QW>T6_Z>3?DJNpP`YM4>)z3?Po{se=22!w4YDU#y4Kf;Fm0C@(%GOp` z`9BvIojXy^>(Ssv1<4i~Jg69z9zQDf zv+#$gxFQ{mu+i!$1+Wcfvj-0ff3T$$wr^S6@34^u@-_KGEkW3>v-2<5^4*ugeoU4w zh5f8-whH#!Vo$4oe&t;XG|O!aY~B`4>=;BPZ8$SFuegh4LqoBhaPYb{^ue)L{1}=g z##>Du#~~INfMbGhn*#@LSVIQRpr{Vb@i-$Ke-h5s9PfZLA>*IHc|~-G{2u2|93O!5 zHplznGRXK1I&|kkqEqDDQFG6i)3N`XN+r}hjItL z4e%w2bQj4suIZ39&%jGM@?UZY-WlnPqLviUh$E<7l(qBeWz () @@ -137,6 +138,7 @@ let generate_full_tree d = let generate_some_tree maxd nodechance leafchance = let rec aux n = match n with | 0 -> if (Random.int 101 < leafchance) then Leaf (Random.int 100) else Empty + | k when k = maxd -> Node (Random.int 1000, aux (maxd-1), aux (maxd-1)) | k -> begin match Random.int 101 with | k when k <= nodechance -> Node (Random.int 1000, aux (n-1), aux (n-1)) @@ -231,17 +233,126 @@ let even_more_fancy_dfs_postfixe t graphdata r tts rfound gfound bfound rmark gm end in aux t 0 0 ;; -(* --------------------------------------| TESTS |-------------------------------------- *) -Random.self_init ;; +(* NEW VERSION *) -open_graph " 1800x800" ;; +type pt = {x : int ; y :int} ;; +type node_data = {tag : int ; parent : pt ; self : pt} ;; + +type 'a data_tree = Nothing | Tail of node_data | Cross of node_data * 'a data_tree * 'a data_tree ;; +(* changing names to avoid confusion *) + +let count_per_floor tr = + let d = depth_of_tree tr in + let res = Array.make d 0 in + let rec aux tr dpth = match tr with + | Empty -> () + | Leaf _ -> res.(dpth) <- res.(dpth) + 1 + | Node (_, g, d) -> res.(dpth) <- res.(dpth) + 1 ; aux g (dpth+1) ; aux d (dpth+1) + in aux tr 0 ; res ;; + +let showtree tdt r = + let rec aux t = match t with + | Nothing -> () + | Tail data -> begin + set_line_width 9; + set_color (rgb 48 48 48); + draw_poly_line [|(data.parent.x, data.parent.y); (data.self.x, data.self.y)|]; + + set_color (rgb 192 192 192); + fill_circle data.self.x data.self.y r; + + set_color (rgb 32 192 32); + set_line_width 7; + draw_circle data.self.x data.self.y r; + + set_color black; + set_line_width 5; + draw_integer data.self.x data.self.y data.tag r; + end + | Cross (data, g, d) -> begin + set_line_width 9; + set_color (rgb 48 48 48); + draw_poly_line [|(data.parent.x, data.parent.y); (data.self.x, data.self.y)|]; + + aux g; + aux d; + + set_color (rgb 192 192 192); + fill_circle data.self.x data.self.y r; + + set_color (rgb 192 192 32); + set_line_width 7; + draw_circle data.self.x data.self.y r; + + set_color black; + set_line_width 5; + draw_integer data.self.x data.self.y data.tag r; + end + in aux tdt ;; + +let coords_on_segment a b divsize k = + if divsize <> 0 then + a + k*(b-a)/divsize + else (a + b)/2 ;; + +let max_of_arr a = + let m = ref a.(0) in + for i = 1 to (Array.length a -1) do + if !m < a.(i) then m := a.(i) + done; !m ;; + + + +let pretty_tree_printing_new_version tr r ystep win_w win_h display = + let d = depth_of_tree tr in + let amt_per_floor = count_per_floor tr in + + let visited_fl = Array.make d 0 in + (* visited.(x) count the number of already visited nodes in floor x *) + + let rec build_data_tree tr dpth parent_xy = + match tr with + | Empty -> Nothing + | Leaf x -> begin + (*let self = {x = win_w/2 - (14*r/6)*amt_per_floor.(dpth)/2 + (14*r/6)*visited_fl.(dpth); y = win_h - r/2 - (dpth)*ystep} in*) + let self = {x = coords_on_segment (max r (win_w/2 - 2*r*(pw 2 dpth))) (min (win_w - r) (win_w/2 + 2*r*(pw 2 dpth))) (amt_per_floor.(dpth)-1) visited_fl.(dpth); y = win_h - r/2 - (dpth)*ystep} in + visited_fl.(dpth) <- visited_fl.(dpth) + 1; + let data = {tag = x ; parent = parent_xy ; self = self} in + Tail (data) + end + | Node (x, g, d) -> begin + (*let self = {x = win_w/2 - (14*r/6)*amt_per_floor.(dpth)/2 + (14*r/6)*visited_fl.(dpth); y = win_h - r/2 - (dpth)*ystep} in*) + let self = {x = coords_on_segment (max r (win_w/2 - 2*r*(pw 2 dpth))) (min (win_w - r) (win_w/2 + 2*r*(pw 2 dpth))) (amt_per_floor.(dpth)-1) visited_fl.(dpth); y = win_h - r/2 - (dpth)*ystep} in + visited_fl.(dpth) <- visited_fl.(dpth) + 1; + if dpth <> 0 then begin + let data = {tag = x ; parent = parent_xy ; self = self} in + Cross (data, build_data_tree g (dpth+1) self, build_data_tree d (dpth+1) self) + end else begin + let data = {tag = x ; parent = self ; self = self} in + Cross (data, build_data_tree g (dpth+1) self, build_data_tree d (dpth+1) self) + end + end + in + let treedata = build_data_tree tr 0 {x = win_w/2 ; y = win_h - r} in + if display then showtree treedata r ;; + +(* --------------------------------------| TESTS |-------------------------------------- *) +Random.self_init () ;; + +let identity n = n ;; + +open_graph " 1800x1000" ;; set_window_title "Trees" ;; -let tt = generate_some_tree 4 100 75 ;; +let tt = generate_some_tree 5 75 100 ;; -let gdata = even_more_pretty_printing tt 40 150 false ;; +ignore (pretty_tree_printing_new_version tt 40 150 1800 1000 true) ;; -even_more_fancy_dfs_prefixe tt gdata 40 0.2 255 255 32 32 32 255 ;; +ignore (Scanf.bscanf Scanf.Scanning.stdin "%d\n" identity) ;; +(* +let gdata = even_more_pretty_printing tt 30 150 false ;; + +even_more_fancy_dfs_prefixe tt gdata 30 0.2 255 255 32 32 32 255 ;;*) close_graph () ;;