From b8c822eecc899b031cc4de0887e97cbb227866f1 Mon Sep 17 00:00:00 2001 From: MrWh1teF0x <142975991+MrWh1teF0x@users.noreply.github.com> Date: Sat, 24 Feb 2024 22:43:16 +0000 Subject: [PATCH 01/12] done (without tests) --- task_01/src/main | Bin 0 -> 87728 bytes task_01/src/main.cpp | 57 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100755 task_01/src/main diff --git a/task_01/src/main b/task_01/src/main new file mode 100755 index 0000000000000000000000000000000000000000..3722c980a4a2bc3581eb837712741c3b419b9327 GIT binary patch literal 87728 zcmeFacYGFA_CG%NnP)OjGU=q#5=v-+kPt$LPyz{E1Ox;_fFLLYgrHbKuth|{USfA$ z?AWobSi!ZSu8OV&>juk;th(%4@_oP0otdXV{CvK@*X#HD=jW5x%$ZZ}x#ymHZkaoG zChICEjtwYfct6t^ZV+3at|=8RWBbIgOocJfNHQvn?nXBw4*VbvPc9bj4SVAcar9+ zGXm>1?&%{h!{t-{{9eJnO7%{7Dg+l$3SJq~zNi)Y zZWQ21`I;!~k?7g2$Y-`9KcyA<^IM^x){32-TG79v75O(?q5r9sd^fj3|G5=nvi%EuA=`>+)~ARke_s1^DZpdYEezJa1nv6%uN0(yawV;pk(!yH%UBEU5C_Va5s zAqR5&{RNQpiur;XsV?29sX2c6iu#(>4YjKpYHEy{>gkhe7S*k)JAUcvhPqYLCyidV zqP}i=?Sf@>ns;Q*oTD2``_|MnELpYUl$vFA^~X0Xsi|AFYQ?Il6BZgZb0#0Xbk*w0 zX-mVGYjL?~+0>Jl3u(o&)s>_i-Oz90(t05^3|zWmb)pcdn^-CMZlvJJ!TNkda z)tQKJ$pA0Q1+|N6YL_iru@FMYt)Zl3*^1+rF4Q(eq!pRkhPs-%wF~Q3HY{C%%xaEb zyS8R!-Ky0q>T8!RZ8){&6Wb)^1>yxt7;ln z)h=yVUA?ffavDVYp*S#V#p;Gtb+yZ@7f!FKJi334c2WH)+7&V79xdfQtVkg1WJfoY zEnKmt!FA2zRdrECn^Awt()vX;)9O~QS&sS>_bpz^VxCrKEU#O>e8tHmqmN$bM!@n~ z`dD3L37WV4JUc8*>@e7fhSP8L(nm%sy=$d|g z`WoXVR*xE8Q`)D@zv>shEbY@@lV{C>a9N+y5@YnNStCbP*Oc_>*Jn^PZ%_m;lEa7& zVAKxCUl3zS9Qu1=HpXYdcpT{6@u!Rg97=F4uiFD@qtHir?R;wCsg42JIiT^UkbbJm zuK=F0bSY*?A!C6{duZ#G7)C5(nTxN^ql>?F--#F^gT}os-q7PxOg#d|W5D_I=0)CoWPTe>Z+80!kAAw_Q5=Y& z=ezQu`8u5^@8P>^G@WCmH%5}OCxUKk5jpRTpu1B$q3?^JXGX|3N6@n)=m#R`ULQyH zp$K|zgna6Jjj(%jizEcEpX5BlouUfe>kmoinD70({*&}}9uaV$n=i}ib)jTeM9|$T zA=#*kpmPr5{ia6HIbZR9vm)rs+xyLrpzHaH<}8Vzdv!+6$_P3F(f_TDpeOiL!&o0d zMs&DK~Ij5zbS(5%_+&=7C}#okl!9bj~o|wM9?`8^nN=d z=vf}|5BP@%{y*}-zfwB@%hkmVnIv)0LTYhx|#qf z9SzDaA?M)!Pg+`9wg}D+<>3A|e4HK0!TrzpI6IJo`|tO0b{q%y-|XY;Fb?kD>f`Jv z4(>nO$JuEe+<%gfv%@&Jzt+duQ5@WVl#jE6IJkeLkF#SqxWB~5*&!UXu;jQJ9>8&w__zU=}lcMn#V(_P8@P}jY zdt&fE#o*V+;8(=pn`7{EWAHO$@HH{`@)*1>2A>y$&xpY%#o(2Zc*(cbjc*)R)%a=E z#?KE-onBe8v*e|!&BKmCn6zZ}g5(d2`=oR{2Tn$SZXQ+(O4Vj-4#A*94VehtEM6mY z<6HKnbX-rl=UfQ+5|QuUlc2|MRgDL#p84m9s%H+FRqDm6H-2l#fPyb3Y6YQ|eT${u zy!4Fk^}{A1_>DEaW>jq)b}1x{s>UxG600^1dl5);JnFr95rXAKt1INxJf!vWXZro8 zfXRy)NQcIjx~OVXuxoeGQ+cRlCkk^W#_FoZ7jbnLEot1bX1Db%1o8pKi6A&Y?AzAVU$`G~>{ss$LnAS%cNw0nC@4`+ZY}`6}~Wl{Iz){B6<#5Jc&EDqPweOdfmQ5gDUDa5*uWIv*eOlo=)R}=kWn<+BYE$J0;18TmlPG^xSP^29w()QRQ z?W){KbCGU4^*+ZeHa06*xO;yl`bl_;wG=mNTF#@?z;lUTw;35S$(zJ;OtKND-Cj4GET zu}0+!)i>%!8f8~)tlX)-9uZ^PkLd6ZFV)9F^%XQxfmO9}`EG@x@2nb9xjW_D4-ueG zvwLlR>%Z_m>T0v~2Ik4E_{NW$&-$5FVs)%01*Nq5kM((%g2xK3ZhW4iOh2)4A6;+( zIL)1zbmQ|C$Bvvk&u;;&$|W&X*!&^uy|HpjbG5#>8s6NF5+cl`&I%YSn`dm-P8QNi z7H#tkIJt6*EAE$T1S@ia0wnlD4Y6|Nn$u|sHM=wT`kL{MRba5hzfyQ_I6 z5<;8IM7$0*lHcWj;6IN%e=q$*tTZ>T-MIce+4p~sziDc!=-CviYTQ%RW48=Ja1nKb zCRx1365SS&W8D8>-2;^MlvHUgn?Mmoe~wVJR4ZbgM|sKhFY~=ULYEG8QliSs8WDS^ zx>-e(WnM%bgli7+EH(z+eHd`}MAc)yU&Dboj9#nxfJt3vL3w?xz&Y8Pl^i;J$wjb|P(8nRJ5R6Z+q(g8OhKWinP zB6M&3CR*2~83#m>4oE&0il}?9orlx2N6!Jd8IiCL36Z;mDquxw)u3k^hJv_{E`5*{ z+sNhzp0pgKk!EujIYO=oRc&^YH%<+G-PcRY)iGTaNVBW?Q9+-PG>z}OS`K)&wk(NG^B1R5goJxw>m8T?10&3`-nSB?Fd3uqoNn1+j61kt%vR%$SjxuPDA& zmjO`_J(r#KugH0(=aa*9p>|n?VSVFU(HA(9zC$wpuy<;lgm7|$IowrufU?LE>6YPj zO|DU4C5J0Whl0q;Zapm8$4I(eaX9o3&rNrof0b?xfsSSvw)_*_4aAswcwHRkzi*@q zJAB^%?DvuNAu}sP&^9>mCPdKHkrkuo{@bcHXD&wH!bd!4O}m;OqUOfR9k6m+6$df& zsd9;Ci21WzL+ngeU?ZkGdJcAz8-NdJ@*bUJ#txVKu_iNu5r=5{n<}rC%-EMVvia|+ z+MM`;+uiN0Qf$VsT6%(;DYUC{pUVY#S91j?lAM@UBIjMr-%|f3^bFESc2+gMN2)Y< z=C-kNUq~z5)f^X{@C>|i;Ba@6w@l{zg^8Q>v=6( zXtQ5)|J5~jKsU2p&C{i5(e3q??;_(v`W(zXB8QdMWB)~6+KAgQ1bb`!=QXY{t<8>} zYW_|t>BG^*R5b?RBn({iDKPP;i@K8-x|5vL$c7u9@f`5erbd^JZf%xv2|enIl`XjM zk$W=MHRw{W#qeZA&wSWu$mZx*?EyE&2mJGYa4lP7_sHClqtxcT3`v>3Aaq`QnxlU6 zne3?>a}X=hanV`{{r;S}R3Vq$C?n!@#*WAkin!lD!yi2%xvTlcACX^==P*fvRXZ_8 zr(DWgL#(eLj=_KL8``L6U8^Y@zJp&RD2lQf4Mf%lWXKpPL$BOv>J~5g4509!%6+TS zJ#GKu9S0cd40RHD3uQHbCRRjy#2tqtiz#Dp)cEzJo-`sVqT9ozP#CW1 z!{;q1`BqeiUpu>+HwcQb-&@sVkK8@P)KFxbkU1FE#$*oW1;+V0H>Z1lAhByLi&7Q-2f=ZGm1;cS8@Naaqd(a&tnxmX` z3450#EGpG~O=tO$Cgw`fjHv9R%W?Q<%Uk8Bg2S2a9SsWj4QJ4RpGQlDtUwR(i;NoDO#zc)WNqX4r*);pgA+{lKVHM{3UdX!%-*Ma)Z=3d#Wu zb%GljEC{{cyqLt;+xot&x7a${fr$fuDN<2xk8y?Q#PGiv6LX9KZWq)fTA?^P$nV*I zc)j^*f3ND;!R~72y*V1_ft0IuraZC}i=HW0uxrSx@^o}0_hhU2$7b9CZNW)`hY^O< zsmMH{i`KV^3=tTOn*&a38z=42-r3d6iqW@j;>!O@m2s^Q(z}|!7IYWTJ-9`jh_&j* zkD8lF-1vNc)S8kPQQ^`ZDPz~0mqSBDroTmJ`W;Z66;0sQAAR!*yQQBiAmy<9yQTa5Vel)bB;J+dRUBL2toeiFM(=s$Osu7u6e4bsNt-WSrFz&N>txttK^V zPs=d(_CKVmBG?E~wI{+(uN0egB%DCcY>F&MY_D~AYscbRWP*s2M-?a4t1&ux8aki| zD~?orMi8RYZLo)Di@_%{+gN{bY>D+%!|(a(jxT@5SE!BJn)AH z{+Ax$jxzo#>#=Jxzcyd*fy`gAIKP$~2M6a1*Dz+USd(90SGOp?VMTtOD_g&2`2r+5 z9-9K0xM4|ceSY5rUzKJO z@@p3@%3rgR+12JBzx3p~`h2agk2YvJl4!#Jm;x3Q-~DIDkkw*bzC{Oy2G0=@|N0pOQ_zW~Nz z?(z`Ql>+_^a2ntbfVTnW;92H3fI|U0VNNp_a6I4{fc1b)fR6w^3HZ)em1Q^0T zitd;=cLy8@SOvHWa0%c!fENHh0JshCdBEL(%Wzln4d9i4iP(3s4X_CC5a2|>gl}6~ zmI1B=yd3aJz=r@6aSQr4z)^rd03HRHf!oQAfMtO908R&d8n6NI7r@H_Ct_9LA;37S z9_R0p|mb#S^o00A~T-2KXZ2Zotn0 zn*rNk!6KA|cmnJWcoAR~;5~p#06zk}0FciIw*jVOv12!27r_qn4IJHl;DPEbn*0Wf_jt4_aFKLe5A|9h;mpKE*jDwB8tz zH@IiNE}cM?^m74oK5S``ge2ley$v{0LCAxp5bn8-wOk z3Zj&wACE(SQ%t#U5X=$!%mPYjzkLq=c$B*rK)T4qw%XMEr6OT=PpvBLMJ z$S;kwWog*fS>PW6KP8esHq2iOelz%kBKa%B{HwtaV2qHxp}w7A{tobeKzbSGJbqo6 zzxQ|2=OfQUZu)JJ`7;i$4eMwZG>o;d0dXAmRc)Bh@odBI*fAQeG9X4JGejToZ)fg9h6{J>Fu{@cKR68wTl{;Y8N-QYh3ert8u4E~$H!w(_6 z{sDe#y{*mm<2Y(6p2IgK|s)?+Fz$f7{Tm+d{Ak$hL z-wpmD@LRLt74X|(J~tpTkNU9wZ@}*dert7*h%RwF_^riZ5%@#FUmB@DFkdpD4<>?t z9{BR!gBK$c!}%`*|8($6BGWGk^DhGbBJc|%`8ovk_z(W2;1@^o7l+fo0{+e5x7H_q z1O9#BAF2HL(3yx~>jm(qMCxZ>GcueyAHZ+T*PJVxnClRgQoj%*kI1{!pYpQhOo)YVe1F-&(Bf0Dm(0 zt<4qpfl3I4*AtXjuyI$fyLq*m_GD4=GB0qdH6C&|qt%F$cUqet&r24-fp|fj>O(hX?-f zz#ks?!vlYK;13V{;er4EdBFRgg!laj?|Tugd4fx6{PCL?{CPOPu@Q;$n;QHjYM?*B zfonX1k>8WOG?e>5TzcQRXsgNI=f3=JQh49B;5{UNSkjQ+kH597;Kg=RU5OelNK8;dWGh-Zv;@4acPsxXFzC8clSQ8Qa~0^SKUxSYnc&_l=8YSFuN5 z?`G`Ty~ItA?sKK#-z#~8*`7oYFKl`dTG!YwYm$%WfpxYLDuT)5AL2V97cAIUG(h50V* z>%s~b#@hFPi-+b%r@&Wm2IqI5v0zPo!pOPLf!$?F_ z>cG*}y43xGNiR2AFL!HS7Il!%oh~j9VSxWN2LCDsPjFk2+op_i7x&W7bn&CyGHi44 zDi=TC;c!Q(Szg ziw|<~lU-aEsX)8H#btpL_#-j=-7db(O~2Cp;!95#zt+V)eRsR~RG0rt3_sazg>^2! z!Np~P8nm4*?xjz43+nlAtc!c)o8jVK`OkN8&%XOz+_UdF7a!*4Z{+I>FTbfSE)O=q zO6a8di#0G-y14hDoQ*Cn4=EtC-Nj`=82FbiKF3X8(OF*5_cT-?k59v7eD%KzfxUjB=_Ylhowjk8?5&Xxbn z#gBLK@jdi~7Y}n?To$&$`m2k3gGIB8d-i6#f#s#|;o_eDEiUfW$Netu`QuX;_xhtl zF7D-*<#sfl{_ZaBrJwEM3*GX>g8jApq?QViK7T!GRSaQjf4bl%$;>y~pj4TuLB?oi zFnBqNni&dq=qtorfZ)53O@AYMHb7>`-c^c`lGn9e5KcL1#I; z9P~M&@Mc_v1|8Q=U!@`k`xPiy5DJbQh|MM$*%Tcd%1BnzE3g>`$iiSon)v}PrnZCq z>1`-5wFtJiNg&&>u1Az)q}Xi~k#BIy$grLS2pXeo(0GideWsDA;#Q;}f07mjt)=x1 zMu^FRGb@lP)4Y$VX5l(BE|Xnrs27=UAnLNLT)u6Pla!1v$7Yv=UJoFzpU?|t_j5Du zgSyKuk6(c%AF`ep1!RCAsn(DJAOi)-vC4u#1__dHGo2FZ z1#KIx1PjPfDMNrW+(NBf-TlmnsaP+B{)}GJ>a+Oxw%t-++>YIv(KI<=4`W$ zK_8cWT>Q;&{dVgj#Bp{_!XzL&thT7v?D=BbPU}fJaY1N06g+PP)1WTLmMX~%*yZE! z0k~vjSBKB(8EvzaGXU+!%&l-(e`fAx=T;~*b1!k}Tb#+l-|Czo@KUEq;APGZftNe) z3B1DjQQ(zMI_xrYuX6ecyxJKr@EYeBf!8``3cSv_RbZ3zw7~0~uLR!U#1%39O-_4( zw>TpN-s;R3c$;&Ez}uZ$1m5B75_q@st-yPobVQYzyWQy{@BwGCzz3ZMfe$&C2z=PN zQ{W@c3j!Z?_6gkK{4DS>XBS**=05IxDDVmASAkDD?a}1T+^3vj0{`MH5%{#TQQ$Mq zZ33Tjb_#sn*(dM?Cxq_6%ze@6A#j&dEpWFpU*Jp5*#iIS+#>L0=Q)9|IG+oA)%iu> zYfcWDvzhyvGeF?$&P*4s5xB>>+=UMce8YLuh2IN&(@8}aV&=Z-lmX`EIx1@c2XXoY?sAPIMH@AyQrh9X9yQ^fKyoXBG$$P3~CSQCu zny4*(otmAT^ARFf<&8{y3QZt*b~ZleH>URvh?N}8>#=E9qr0mG?_3<4a0H$Q(}heUO=oobcyZeCb4N7$CK0UxYSNClOK4z znMSlgj}ms5AJEUVo1Zv8%`hGY>j{r-bZN{7r#A6R6!UdZ-}X5rzcJ0iq?%58F!>go ze~}v;f($!Kh9}yyk=#b6NjM}!m$Tgdq$|cjP>Vc{iVr7TX^$_%=1Z_9`0Qg)C^vP3 z{peWiLjmgqpPkIq?e`_asI%=+2^gS2P#eL&*q4zUw9L8oEg0TK=Fi|i;LC`fjwOhX zb{Eg_?_xsBXj1VoJq3sM z&C)g9!QO6XVr0vqkzIV25n2Kln(d~ijsy)CWAaFt{x~Y8-PF(;IE8LdBpO*)BqB80 zsrC;bk1?c&7U6V40p_Ku{k(*n%i?*lFyTT_OY3nma!$hFpxPgwa6L(<2x(OTNhc<3 zCyAoQjGtgthti~?)6vE{&QdqPo0WOc+HsMx-^SRu4^pZhO&`eeW_^Kk$2qEiBYTL< znRO=_OVoSaboo71fyX7U+%(AA*qCUhor_EF>yV`4e61sKWi zwuMlmvhPQ6NLl6y8Oblnq0&dnk>*ttjG5a%(0L!B1{4tGu!xe-pSz>yBa(99p@oGEa$(eQ?fkP^A*LC4LIVva8V$67P=x2JUo@ zEy1?^v0(Zq=wGKlIwyG~<*#>&1>WRL6?m(&NZ_BGlLX%GY!vus=T?E+ zoaY4I;e00WF6X}j?{?abqP_!J+r-WvvvzVc@AOmF0HGhsI$Gd=vhEQ0->jtqf6i(Y z_)FIFgq;^SoRpiL7dneDNi;jxIj0F+>|7-9c;^;@OPt39E_L<@Ji+-=;EB$!0+%@* z#xVVIXN16$oMQ#9a?Tdm;M^i`jq{wqlbz26u62GEc&d|*KHKbkmeWz-MyEvJInFqN z=Q;}np6@gWyujHcaFcVtz|GE60xxmi0$d(MAKkW(8d+a6v(y+gHDkypxKCPuL1x7z zhzr$aRlremfgVHjv8Ih=JlJ&^P<%=iryrKUzp7@@x*E5qzM%}GH_nq7}}Oo7w&th?)6 zCtvV7XNbTh&P;(zon?SS%AoE`9Np48VjXN;@wK>a{{=?I!k6q7CUy}Wi%fTe_!f>p za4xX3(D8)3k8#twpf6%CH{^lt==f8hYZuUN#0N2|6ZU?2u|t)-sS=pXVq&x zupB=u{Uv}^(7O6uj6A91bLqI81r@NuS(4ZcMs~+yWV9^47KzxlKLpMBxe#4827++2 zC#K{?A*09b`MNV!#(@8zmR0Z!=j2rE6y1k*q&j9Gmtd3qC;}q|)Jz)TWk?M@Ctzm2ivepKiANcs>C^(k|D5m!dmpRq__-=LDHB}8V{!+k+{ zP$h9-)5$+n_HKwV`5_$P)IuW!7)Kfjq0E=qDFI$Zk=A zIdDN-&5V@>MS61ve;qh|B#yNa(vzPv4LKP(@1fdq%;|~snSht)6FD}yHXRe{$p~w6 zUczEr8`dKzw|Sf(A!|CCr&%LNY8R$4YXeOfViZJe9D$!$3e8y@_zgkY7SuwIql|H6 zU)dE2mj_-+QF9|%1KKdQ7KJnQd z!tBce^AW5+g2hjki(b_^%)TmcWii%y!0HmkR-$6<6ePO{by?yu-7pTGM7JE1xf#U@ zu{iw_5Cmq1T7h1wJJc@*Z5b2wW?q_`qt>F|q3P#oOr>ma{PmSj{QtggzgMOb_V@{b-%jbv7u-&5I_B549T zhD;oiR3@S>zgXF~*@n>*yund?twiTvrtBP4{uBtz@rA~QGa0Dthv4}Y;GO34#q-*T zA<8~wkYQW`-i_~V??9LH9t1x3gmgWfdNC^3 zoUSrfvHtrh^e*Nx>MgWKwwDBWHxox>`M*VfU>>LJYSdIu@CN&QrqE7GUyUYf9*>zb z;xaH5636;d?1s>;amUVPxdub6~Ieq_X>! zXjTVloHwc-EL(DKoJ`ygEXOjT3B4n5C|*RICeZbgPnNWRYgI9$KSWur;1y*bV3!2K z`slQxN)(7S$yZ_OV7{U36jO`e*^0O^_L+W=_=hTlNB;t$=Wzt4GSY?#=X-T#1(skz z{mkR2Ib?U>aADr5@}yyrsT2IBK84ZoXxF(oM3v%|n~FncJOEw7sdwO>W zjRa+8bh;Y4MQ6#L-@HL(v-(36(}{ZoY)&cFS)erfi5JmIUA&=zyDkGH25Pa2XE`*&^`!D zN)73pYXbI_W1(Rn#HtP#b?rMTV2?nF)p3xh_od!NoNN2icd{yO57=W6-|8GlT;fUT zrYZ{{@h@7Rqv6%l;%(qR=*cMYR05|T<_iJ)pNX!}s}R`h3yHt9(E96tcBWe}bvJkqg!$*NFz1=}XSS>V74Y5+^W}#6 z64RcJDwh1e0q5_@k^Z0vyi%W^&i5|N zJ4|~s(yJ=ak0y^jk#rx17I@0EcTj+fu%|`|C>>SS1gQDYw1;61p)P^M6`qulFb|Pt zerej@AzsCV`@nmcd|d?_Szq6o_F1S;S;c!DJbsj1^E(c~W&9|s2Wo0RE`J~=Y+#3{ zaYJR^tV)+KUaR3IvrW)G1;YUaRa;DG3vooIc#J7-Q3D$M6kUUM1;UboY7$Pfn1a^1 zPN=|uWA+K!FDlUM!8|ouV0dkVF(z1v-k+IX0_L?82wO>knZePcbROHmd?H#y!msU- zMQzYtHPW^GZ3z6`(_(1;vY>q<`U$b~NAQ03lo$!OvgD@(?cPJ&^qElD7Kd2j@;3zS zB6LQQzCU#xGEJWW-m&5I!oM7TD#FY8>^#?icefC5a32be`;~0d@D=m8@3M%3^LiElkaU(&5?zim8xLFpV=OOU7C?UmS zp~DV9-EPaSM#ZYHAn~Iw#i77R&tQJ%hJt)q86{-T=Kp)`o z^z1;l-fT*Zj{8gCKP| zB<}E~q=;c3r4K=O8NV=KZA7;mU<>}MFG?vRA%L9X?+aLCF_U7a5cnJdUwK0CAN&?S zU0DYqP33`LKJIyNL_~zHXYS-O--)xKRZI4P)bJxo9zal;AH>;>$eUIKWp)L=gK6?yLD@2N(&@dQB;Cxhw;+3L| z(JgNnWCn=Vjv_xQ?WXa#4TQvePu^(H(YD7p`x#U#lc`g|T1WOptl##WE%lgSS7EFb z)mMXcgU>#l^Pe75>>(pv_M>1u<+I~zD&+>t2(i~0GZ+(wF~6dJAMhDmpsc6*oPeHt zyov7rnP~`wACU0BOuUs@j}L(UZ0F%vJ%>~_4x#ILs3dysS7h4*j53d@u4KwHI03bu zPp^Qk>p++Y_A${SSkoyH({NGh+W0oai>^R3$a^5v2=T1byW;x6Q1(q!np1+{Pqp4k zyuAx%*pxM`$)(8WJx5l9tk(*Gye~*-=s0o)tF$esW^VaLe#0@vhpxnYhAN`c8z>cYASGpq1|JC1w<@ zM~9i$6uQ(`dVQ!3rNmNR7)5uZ?vrm+UqK}KR7?buZ&LyO6C-k80nu;sN+uO@l9WBh zBgonF8$D(#cVg(QH*r510&U1h-1iSCG>kJVaMAO^Bvk?9nTtvW)yTyuP>DWGw}7)K z-t!FWgd_;`qJS`UZ*I)qj-ImYd9=0J&tUpCpfd!f^Vw9d3Fc48yB4?>O;#+&m&$qq zy&BED1+1{8aW&P|GC7K?nNqE1Q8A@TUWUFXd5W@1;*3qj$>a{7vk=SK4GQ8*1!)=+WjCWua9+*-)TJk&}^JfB;TT30O5jtt$ncN{q94-x+o`v4|%I$@iDxVL;!2wF%Wu zUOy-h7x;ok@{-Y@r3S4R(H?2uTFUTY1QGvXg!3#ygi9{1lp01SV>1EPdpNZv znu$#RHs@2BDk4R zF=DjG?8^(ltJCVQCr?5~Dw3!XUx!oj#b}g8y8?;l0x}D3fsB>3OK9mTt%|$$Vk}jn zFL@w3o1)hOiN%0a#od!(YqgO5MIwZjYgOF$rvVp z=<48xUnM6ATV3tkhLn<10jXMP2;85kZDp~Ilz%b!PLQhRmd&tnM#^#WiL~IOJZ>h*WkOCh$emP2m;v@sdq~8Cr@oBmP;O*EK9R2KKf? zytZz_6sC8)?7lUuB;0=WP7nm+CggiNf`qIfrl!3U1xd8->Y;1Zv zn=NyeuI_~tkm{BzaigwtW|-0ijk9Q{7`QPiE5qJHEvKoJ5isdSpT{dBo)+8hQed4* zM${VIXshiMfs|j#dtX;QS>YlI-=2k;K+!!ajh>T3iZ9tPfU!^CT7t^4`@rC$2lQS} zZrTm!q5I5~yV+NrF9qOc-iVCEmv%1<#YOn!AGLCquQYVSJ}w1hQl-N1(_=3~F2L@mH=!iNcb#OP1e0^C2W1*Fkw)2=Llz#QG8xv^NvhMxX?IIQT3 zK;j#KG@F}^U0(KPrn#j(0gdJUW9<^^H8lGs0rWVxC5N*$vL8r8>KEG+Fg158>(sR$Q%+t6|;O5VV|#8e?o(6+gCZU7lEHF1W zs2sg>+ENa8PR~fM!m>tJ$LzG*(Yw6%I(m24XO7<8^|_;Wb$#LJU0wfh?m#DNc4~IG zyX$PVXz9sDr?<^lG25g9+1kRpGrbvTz>kO?6*s`SrVRU9?uf^PZi;;zx_PjOH%roA1f`~9@MGP-doK5k?l z?@`-xqfFfK_FbqfnZ>;Wi7zS7LMdJ;?r+fxJ#j-ia-pXqH@n20V^2myh=WtIaA(jFO>bzhI|eq@?^LaE|u59l5zB?xsLn+!L(>^%5NZ zEs!jMk?JmGiJ_8l^m-Qd>LRLg-iE;{p>G18teJpsp`?VDyU;>b#JOpw^mGuj>v7YP zP}_b8#wFf-e1)v^uB8bX7%mbP6{hB541+o)TbJY(Y~azD{v3aysqdKwmVkT0&sdn^ zz4X9Am{l*Iied{k6NOrN2kJ+#DvY437s4aNf@fo@lQ6J9HvokuK!@ylNf^|h`-o%} zAYpj_Z=fj1DohyB|9f2LRKb-h;gsZCnP5sL7;8r^r31a)0}?F(w=(+T6urTSLX5MfFsd^83KE@Gv7jb0_6W&3yH_HAmP=E6{a^Gyolc1!3n57HQ z2`7A(1U)KfuR}CbP<4e5df^CsNnNr}AgS3bok?MCc}$86+8q$*lu^@gn&k^8a8FE< zgNGmEv9gQgY87~E$rr;kACH~hsm2$Bnc1b_UGMSrn3G^KliZ+v9fDYtJPLuQJRw8# z3xf6n+-QlCcftGAJDn znuY}JpAnf-it8b;Ek@HA8dwpu>*KJ+i5WZ#f!&@^ctONprZ7U(Rh^CCW5^^ULM3Fl zmf?rY&nUY}#JnOMN8mB&^+V>p3Uq^@mUtZX9NB)zBt?eIxkXw~&4ToCOtD*p*)cL? zxCrEj%%4lNj5-&Bn|xtEWKz%?-((U01m0cbi(!7qJd6pb+%mra-X4!16EbVsxJtOd zaKIA^hs>OGS4qMkOoDJoCNUvXh{1{FSH%z*Od%Fa@hTiLKX!=-8Gb-gY_EmPGNz#I zI)xuHucN1t0-OhdtrQBYP4Ggd33-U7yCCpLj3zH+E-iF5?Sa7GV>Edo^Cr3&)}8th z0zZ2~M_AcHr;C7^vm*zU_Ga)n46ke){#u(KT59r9(8d!aMqm&qI$LERtPBqAdbXe^ zpEsfb6+N!9I3CNGEHjCy$>%~uMuIIpn2Udr_5{fz)I)iOgW?gJ@Cld|M@+ z?<6Ji)SYOe(3S!{ItY;t10B9jvQc#yoUo`CMV5atzk&E(6F z!7<<$7iPc4>k4?WxLe+5yxy9D>+bFTjt)6^4*I_09vPf^hR#49!JiOH#XYmGMJ_=L zK~h|l%Q<`S7YrE1z1z+veG_W3xGa4l<-ee^{%vOQx&W=cxV+6GUQa@?iw9(^3D zxE|O>^rxac#e*_7lRg}MX7S)Q*YNtEdAJ^u@h4ut1@9JDrAxjW(C-#k>wNzSD~qqz z_GDv#D!!(z$aF`c`{rnSMxmg6bF~fUp>TckbiOvq(zmV7Yb+d7lA~?D4EC4gYC8|1 z>?L{Hw%<_RlD68O%_whaublg7TW6H9v?%u_UhhM>N_*#i!s`l@rL<4(e|Y^5=qxSC zeTvsp;D^%EytjFsjNi~8=}om}TR_GLl4BJ? zOTS7%@-2P`z28_tx?8)cV4NU*tpX~j5@eudqEh-*3sPZyo(*KYAXQd6iq&s|ycj*z z$|5pRkfW?S(M|N5EXXwLbhPw-Qw2HNT95frziEO@x5`nk{iX{t!+NL!$gzUVv`!cU zWUe5`ShrJKjUcnEQ>d+0klEH5)V5HNIaVpP)d_N}wVm3Q2{PAOOl`{rnP;TTK_vD& zEt&V@e4$2q5WRLe_e3e3tj^&FsI!R?Rqe&+jE7u_- zSO$@@an@v=WU~1cdL-Vw=p<9xus_sErph&vd<~JZqpY(bm31vbr>w7;@(hsp7jZgI z%Ez~QWWKK_{r2@JT$y{@dyqVyjQD@!e7;IfMa-1d1kwpvs*DOxBBeM8)?!(Y=t(LU zT8xx;5F=$v<^H}RO#M5l%Vc?Brcbp?;dgj1`DP?Mn`GXG=+h*S^g`%EH0J`jfh(J9 zCezI~P?px{F5kBEq37&?)Z@eCi79qI3@SU$Ore|KAelavlVNk{D7!^341en-(d#+( zsL|lvqgTB6u9Cj-rA}9%Pd5nsNhjt@OtAv}UoM8gSd%X{NyO-qNSUNKjj9d(dU7C% z?>y;JO#GR3_o7|{>Hl9MyA@x7Qr8;zrQC%crR-#J_YI_qJ-jlc4W@iY{{7-&z9<#u zYxOC$ZNYz7-ooVzRIz;fXH3D%vUQ>OW|iy2R|=?BJA*G;>BTDU?fH(57R;Ik41paF> z`tt_=F#ccYg)?Lgj5q#azL7EH)=i6CD!6TvnZl3+yn^mN(~B0Zk(qxD|{Ys%A2zJsRL;AEtni?&q$ zfV8k%e5##{kSov7)xa0jw6J|K=3V7kn#}jrTpe{2K>kv6$W~*~Y|n%Ga-~Ax-Yj@3EA3F*z}iq8TY2QO)I7i-Y;v zo=Z*c4eGT*`O+1+N2A>7yWc<@pe4lEDMpCI2YweBpQ4d zR|5+5tmGNo$PMh9*LEy?cL7>l%34ey2HYqG<6CW)CEY5Up!ZTLR=h5T09>Lg?LLVkB8!Ai$C9COXPcQ^6Fe7U&=~+h9@q{B=WN&@qFVb^b_Q| z^D4169VcGJ^A(X0Upq>yZUZjS?tHf)k*9dRb`jz$Ht~D~D>Q&|S5c0PM85tI&m97x zsbm}gnz#^isl+!Cf8EJQjk58hYyj2VF<}&ellp~(^_aWX!CXx})d;btuD-!P_mkUNAu1h46agjKRki{a~3wADNusoP-44~P$A#AjfQLnqS<L?8E_FY^?DaE`5xIrfrPLP*!MrUpk&c^7)ZHjL<##YO?}Cg8 z^1$l+xJrfhKYg8C-!!u2QSn)M_n;(9B=2?#C-FOkT0CFM3>`!o3FWzHqrc%p=li9~(fKUV`F^RoYJ9%V_e)ix^POcBb5((hc(GraQcaUUZNqqZ z6@f*Y^0=0~4AetCwZA&}ZadYJeOSt~#OTR=K(Sx9QcaIQ&R=lo#Dy*>PFjaB#1^1F z+Nk+P2KNBPekw~fb(rwKDSUh&y72LV=)%Vb{K98&3z0l@K|xSZ`KhM4$VZH%)BIJD zqzn6D-DH1oEE}Ly(O9JJ;kx2@KlPhP?Z<(?FfJ8?EkwDl}2R3|frg1YHbM48!N3owBQ%&40<2zPN#h#;fTGV^Kzlo-rPKR_`ro=n6g?w#R-18c;i~XLO zYWfVaF%e9M#zb&RAX~fHZ8<4{E*f`RPD-G!>nNiqH$laI$4xcmOmZE#nwo#S3FyOX^DkCEmqvk2D z_Hti)J7grf@CsuGZV*SHNlOA=ta07N0Ux39SyBn+izkYiJUi>1G1h&pMdU8Koo@-yRZ{KxD8`GA4i*8H5`E4nW z?<75r1V0q&^e#Y!>;hFPZmpP%aQ$-%)_7fk5?7+Pvp(ys#jjCxfsA9&~t{HiJw6Pr2*v~$yrVFEGtHfh? z>QNw1VzyQo#eCv%2c%*@A&EgDIxULJmr7$lJ*k?~kMe5&4g90j$l8BH6-Cwl8)|4& z?Z2rq-P$+u_%?0{G{t`E66FO|%3G?-D`mi|#PW_PYdw+ktc*68ig9-+f1@=(o!yMY zeg_;LG@cB?<~M^QsGIYE;mAGdt>8e7Pc`z6!klC$n6Y2xR86mX=FAXtW*K?I^YQOj zL5=;Yr)nyi77;P#)*b7#?H|N-;0qV#*6k#$Ht;S-F>l_?t=rZWK8>;1{3I^D5E5t? z_=mHYI}U=PsW@b!_yIERTT`>tNIGct=#Q_(|%C>aZ(;2Q%*lXmg>+w;wMXn^VSU*8~5)0mWbw+Mtg_#)vfa1vbk#lCzUsNxRYE~|_@ zz9MuPs8jQ`koUD<)zo7qwzBcj712d9I`8WA(1^jXD?_0qkHo+V+^`e=>oS&}nRZox-z)nd2Nu)U}=j*y9OpqcgLcK_J#oU5kuAurzNt}ibt zsf2m7V<)ONI#U6kHNOhD(ly7uxkMlQ5vXa@0Cj2C3q&V% z5jvhkbkwn*Wmipwpi0L>c1*_ukIjp(Z|k-;6uG;Ui?1NWe(zm1)gXOLxt64|jN&`K zlW+lgO8(H}$WJvrj5PkJ8y%8(S;1>}GI0m)H9R*2F(u{4Q2quTv0tZGO`m`&wdYRJ zjJ(WDWO^)KUURJ&5)Qwyre0ia z7;Y`hB$>I_eWLls))TEpxSXeVFj=*;B&py^t` z*#AhNnl^!&Mircgrj3(}?d$MCSTvqHfxU(U<3x$P_kxR3xe#;i^YX%Lh1m=;WPGXt zq!SUNGgUVyK=VBP$q5!7^&vmi)DG0c6{j&zI3w*rf%DUL3PhNxc6e)pKN@xA|BL5=`%7uLCU4)io3j(%V2y zV{*~ei1v6tkSB16F3ui}&J=nLX+8o>a8>lunh@vz05y%NsNy(&*Y5|))wnADjj)iw z?)F@JiJdDI-;WvuzW>J4Rq9>b8slB4J{xqXttK*3o^D;O#&emV)Z#O!pR#ne#q0&} zQ%zSwPp^8TpM3kx+`4{UuVqG=i(Ig7%H-il+dq$w1I(>At?RX_ZnaU~nd|zT;~68D zmGA}h{@pNR2CWCXF#KNi)&B_f`SnJiQ#l(Yr+i&SW#`dU8HCC>WY|T%m(KZLuT@4@ z7uf;zS!m|jIsAMm#b=?~`FleHSby?-s9$CTvU_Ru+g*!u#Nr^DZCuUGZYp#%^6RzK z$deWIz}AU1ce>0{kGarjEBhtnUd(8BCmgnMK4v~R{HQfLGv5!<=(YpK{$~{|po5yW z5hn?X$1w)H2xJcqKUj^<6zW)k-L8OtMcd%7qXsD0FY}>-si@)_#jm~LOLWP#AQa%_ z2UkR(G6~)@H^zX^Eie3q6;1**P0~Z*$oJ9cQ=LDz*Sp<*fOh^CX@Kn4K^jq!CV{}_ zJ8~x+VL7iM9X;*+H=0d;iu;*jp%Le&xK_#Ije84D#~^VtDFWpuZ{ms}PmbM3jmQ;IYmigj zW@xSgF;pn3<5LW$K%^2PrRtNb+mt#(a~HLttOHFTU}lo)Nheu4H_;e?my=_Y>uged zGOYIU#ts(hV~Nr%e58-*(|tjxtWOSSj_ny*m{J*i)VMZjD&4NgIYWw(*~M_2;f{&+ zk>&bBOhR+<6(VPrM;nyWMw!Wuqy5Ih<%&;{h(67u{zXwav_<|Qi2EgNr)BaB0!-dM zHk+{J9U=`XEl>!0$)`8;mLJkD3IT|k1A7w4}Z%}YLFZ&cr)D=g%S!?PW>1NDlqD#Ws)3I3E4jKj)poR4FMXW&uwyt386%A}u!1!F6A)McZwzjuyg;g#(hZ>| zozu{W+!1|4b2q61rL7wl!J^#~1qdK(e zk?mxZQq|IyN7MRZSU)C!Y8{FuSQ%lDm`deiBZ$6{;WCWVJwgX0uW~D-6gsPYSHgIQ zdd7QJS@fk9?THC~CT_Sg#YETpZi}OZli+!{q)bN{U61<-ZTu8BlKuFbs%t4j%i_it z(To0#(K~GrqrM=Io=w6os6nW$a6d3T+L-fIuCB=$l1jQ+Ork^xwsiEXM@t>!m9vY> zaBD5U0J}LbVtee!Y7OY5v%PTZMHiX%$&xje>wJS?FFeOKfEy!SzN8@qAK8Nn(xfev z76kBM&i9-6g0k~2K*Q4|#I1sEbF`+$!Rv+GCpte(bxm&Lm>t`8oROWTQgNqH8}1(| zx&Y$?T(>aW4|P%(xxFrKZtLJhw|gXKaS%RUo;%!e&>whNAMcmMt!FRVmqau4nBy^* z9*MaKd7Qw?_gbD|oG1l%ZSdT*EIKj0vD~dl^rwvqcs+2Yf=z<2hzMS%RHApKuSGgx zZQmy4(2A3!>yzZnbOgc$w=m&w3=>y}iMkFOe6`|_2(@(KnrN;bPjKt(lidLUw<|u$ z^(*aKtBLi=Ww3~ZQzc^D=ETNxnja}{sc8A>lFao7Z4ZxQXGCYiGF+(K{_4zV-bAOp zn=oG-cvduuwoqoE#%cA%e`K?4H8xnKU>9`q}$5|H3ap~4gP~8W<%$wOvO~^ zszP-B=K<6G-T4X=W^7vZbwN8zK-or3WhVft-{LP+;n9#goyv@HGUQ%_D~^OCa_L&k zh27-DsP1AP_f=iuk~rDXLR(ZHC@IVJI%m930+~n(Rb8qaOcySb40VWd`gOT-8?@`8 zDPoMMjFP<#)hk<0Aj9i?oPB_K&;)$=- z#SP+V6i-8V;=fxB9K+K>oa_}ind^AE2B*-?yt)skz@t1p&C@QPUcUgU;ns>4tL`B2edg(g@TYmP`xG*6pljW*-ovCLi8=um;B0_AP2#J#&|bIw+)*H)`v zs2GN+I4Dh(i$FITY{rE)SmWeksE|K**~5SZ;zIdWJGmIjGN{>Bzd+|?*f=@RH9eFs z2^I%at=u>>bqk!V%$0#sHFQIWJ~ypo_}sg{G+VG)KaipsHW=QWta)P~n(-CqrugA& zp~pELK;Lw$gIqmrbtL>0UylU{^h<-SxH!)m zW}b$qvqP^1dWK!;EwP%{!IfPOT7{2$IkFzSHC%HaZoh+1SgChg?H|X5mWdNDcuU3R zUdZ(Ile3<@RcrG@6f6)rg+bkBJWMF|GNF{W4sKossjMfgj&4h~Eel+4{oQ;ePN5;6 zVp(45knp`Vee)m4e*6>GBsX=u7`GeiG2+^9z|FuHiHbK^feluNW38@etR2Q%S@&9T z8?4Ott)xKT49k8p5Eu51_nZRX!d6x%L_lGvk2YLq?L8(jUxD&2PgvdDtP`yEFx-3S zLf?gkTBE)dnRPw3vN8Rth`XMRR9fzVGZ7cDf7WN^?!Q% z8W=mS>%8GUjbDNhft*eahf(U&@`=!AWq`KX|1?XkOs9WIf+pl1&r2k09SF4q7__8agaDpq$V-Y z+U|GGJ?GBMoq4-UTFQgO*>~Q(ckbMK{?EB*-tkAlv`+dnZ~BK%4&59#(nwd~%i8Eg zfA&rPh&1{DucAia3SYt9?jHUR{v*RxgQ8}WHHugGDjs!QHaXxW)>vZUFAF=sQTzT~ z=*q-;9S^PH%EIqr72%w~S~y#%K~Q%c1Bk9`hBOpg_&&zpHGIJz8rpwz5`VlA+2hyf z0q?~syy#E7=}*Z68bp}aM*qG*v~zvo+BbnspZ%==z^ne$JDB&FfAAC_EB@Yp>fiL1 zzxVURH};2|f1LO^==r99;@|PMzwfjD z46p!0`7aIK9`Aq#*$aO=j0s-m{hA@oI4JxKmiT7;e%0_FC09t39tv+`cMlF9^KZo*@9+D!_58_~ z{D08%_y49JykvTymM%urw2H!CgSB1ru7CUM=2wF)nhH|*9;Ujxa3e(64fEL5l_bh& z)=A+dOzOtM2hk`P{*-BPoqr8(q6sa9m(k*gJn_~1M4CqfEoTR0@=p^>y!NPn)k**8 zJ3|32t(m7L>A3SWG^CkCg+KWqZ~EK*EpPg}F8Q}r{h?p+_dpcC=1;!qkG?~M)+{afjB$$tQsLe-z3%O(7C)zxEIqM@sW{BD*`Gt~;e56J{=XRmNC^Q-2- z6)p`E_uBuKKi>04Px?Dw_b0JdGxniqrkY$=cmYH0de#4tp1IKnc$+n|ukh!tDa(`=?AZLnWH* zSokU)crU2nu3?#nxsN7X7QTevZyWxtctOl&zgjr91!4H1jOxFCWDYAvPu_$B1AEl?h zx#tgk+`sxM|0D1Ed!O|`Qn>aRpt~R3sjEryP}6z~zks#gJN!Q|$A>;NbPb{54ZK>K zEL`|4JjV5}`ZvkGnupYs<-*V7*L}mkitZrCYW{QK*U{iZf8z(gm)r_Xur9nc zU@OdBG=sbFIiT+Kuh}^m_Mutjg>PfS_hTb=K_hy}zn7JRTZcdC-*VEw6^n1tm7ZG@ z*$dwS;oS0n{5_Za+m9xvrWy5xk745XLk>NzXlCZ5>H3AQ(wyG)KP2m7_Cu5Y3!lJ) z-Ttn>?~)nYP=g*HaB0PitOpqiZvnCH0OIswUU)sTvu6(oDSrwr_H&DyUi7be$v@Jk zhrJokd=oCvP0TZg&pox!n_Y`4y;f&#W1&2^Q7RRu!zaV2(XN*(QCRM8l%6^ghAYi} zSlQSp9zvA6)oGOLVXYT+%G7QC)W$+FES1h|co)MTWu;oO<9(prux zYd!qkU7$sX@asaaIEiJW1q+wT-DqxpqqG=e&AdKdp&eGs-QMgpri+z2l~}5&X0&b= ziH3~b>>fDVHUzxGwiOH+g`m+b)(iR-AcDj&zaoGycOHX%%X$^J9~zys}at#h>AYOaj%KUkZC<}dwv?4En1DPdtV z>h>$E_uO;LE^#NKoAiLSSmK3=(BSjpM2OX%3Ku5Bvx}GrcCWm=+=;667cd0Nf?Meh zWS*c{#DeI^C5$`CBVl;2+w1gNbzc8$w^@wdUG3DG=fhqL_|h{dz0j(6OB-}+th*PU zz;styoeR$54j_}sLzqju(`uJj=rOTPl~((L;Gr2mi9vZ=1Y*t5OuJ4r!w*xZi7fOE z*IHf1)#*9lt=U67Fc1-|2Gm>c0Gqi1$gABfH)7H!3@4Pq%9xFr3e7Butg$nvmnOEu zQ8JUn(wDG(*v*CG;Q}%c!mz&DHPdxC*kPb)uue;jn^hPl6n78m& zHkN?o#4nF`R%p4C+-$v5ZX0gKG)`pBlXv!Gx`UZ+4?T0%bDE}s-oUAiY6n~_M`q0$ zR$OYFJ%#m4iI}6zTUh82A5AluV=jl`jjMLbm2kPX0s$qPF%tqKDp8x5R@m-!ic_ht zAdq<$3$*1CmXIV*yM^8%|65rtwj7#-4#abk{39)duhh8bggVs&Jxm?dLZd#P(|4Ww1N$>pV0TlV+Iv+u?Sr4G{&+hjqz?-ZUu~a~p&W zb7x78Gm(|fEQV(wRSd1NT0)4N<&k`oS_dq;<{=XeT$4FvquelkfSq@$THjQFptT457l38p+^FWTZ^)}S79^__@f7E6zU{2pl$=dFD#cy z0c0*8Hex&BO88-kOpC*!n_?k7<>>d@zYf^HMhVlE;uxDBn>$_d6k&ko#0!kZS6hz4 z<#Mm=frmpcX&Hullmvq)LkSS&+$$2_9kZW~pM?Kw#IZm&2C^j&X6jY^~K^_wJHqva9Pk<5+ai-h*@t`N{J6^shh+MGc3a!@sa#%vDxS$wsmo zPD(w$H(%Q6QkObwcTd#Q6Cq-m^otA`p=gQp>1PgG_+89o|; zbX%|*`x}M?!9*c_2u8YmX^pLAas#m6z-|OV5^56NFN;(&ic|PC!JN0N%{3aOT8?{w zcVXL3f`bM>P5XqWK)8{Ea!1y-UY(hCea*u4#>GMOnUT{<%XW0U2QQE>{~U*%=1L)7|Ym~gRq za9~0eoWaubBW7h@SUzffsSiBxL$g`1QHK+ODW^PWw4zqOOFwI-B{Y!+lvp-TnKN38 zx3%<-py=@a!OB`D3pkB!B#4*+rxbelb%~!R)ui?X-IN^66K$SN1z=ykUCf4;_;*NC zSs+E6%%~o`yj?K$E^Y{1%Nf6T1hY{uvvuhWyc3x>efUqwTU?Ei9&&dI3}CK-CjqNu zcc6zAS+22jRrM{yejw`8rv1^SR;zw+q*|_bqhk*|z%FTHwepPf`F9K@pE6Sc+%oJy zH0YW~sMF#qZbonxS_40KUC85KYj&efFYI7OTe{6+kAL29Gu!jM$soBqm0-#UE0Cqs zPFYI2$fIeL-b^JCl_M*%4lAEB(l=(I1CbgoNOh6JOof3=D%M>0N!FDK?_ejzRL2%4 z@x#2e!aY(_HRWL56f+@&$nfkEckQ)E)6X5B+yaixCtk9&t(qsHbG#Rg8o66?XbTuf z_;VSkQ)xBY@PpB4Nuzn26M>M$L>@nV=8@y4QIn&;6wZa=bBBZ>tPy8;s^3@wI}RTY zt8j7|j!dY;f7&FScQxoq%$@=&g0tn1tmTbzmF~qHqdq95Y_^er$zp z&K0=NcA3JXlY~=Ag@BCwkffUl>9GC5a++~+3oW!bLBb3ct?{<<9&hE>nWiWadulKd zQMlJc;iduD^~PeDZ4g(SgWs=t)pb~wUQ$L3G^GjEI~5oziLr^Sh)z-qK`K!`y}>Df zAFA~-eA%674fF#?r9?8{Q_;K)3kWt))GRO6F@vha!BVpO{$u1E=tdN)JYw;gpDTg2 zdGwO&C~ZTv#ugi;o@596QLu3cVTs=s>w0A)!;MTqRkn)WY!qChrhJuu2N zx57i%TW73$(OO}wPQbCJ!UFGOVXV$-!>lKYhf+NoB9xQ%^--4E2S?s#6;AAwqT@H4 zCQH90PItD5V#k12t(iD5NFjfDEtE6}Lj|lBGarPG6Co}Oq1CCi5ZVK~OT??wGInd@ z-x~K@Z5z`+TrG4z%X>V<4w|U(IE9Oy+8P2?KSuHUMR-5DWFvN=tT+@bls)N5G>!H< zfzTNSFY7?b4a?C|e+7>nyKp#qLW<=|r`2!Qn)GYA?#)t6oP-IC8CHfVreSgHC;lPb zGpl6GR3rvQZiiMQELSQ~w`*AsJNd!gh`Fs*Rm51!)a$L*$Oqh9Z?Kbwrv|rKzZ)%2 z5?6%vZuEf0QrD~YBGv|=r&gfP(-RqYDru<3k+ikOc__0DOipmxM$eN2D>;Iz?IhhF zSc zFbp8QDLh{yut7l$GuD9igE%1)aLQ_ZBJo45GmCq8R|WHOvChdv=jdaOwq|w+wz2il ziQ%?+v=kDHwjS9b5ke~$!Y&MaR^V9D8--+%6MN_hvGap`=SQqxZEl0zt7{zYSq#a^ zYT`tMI0G#}iHx#u%0#eHl*C9faKc&_aZ3bnt5w)(9<=ff_8+-4ofZ5amGK+Vgdw6B zslxK4;#EovTZWf{LOAmyI>Mwl<>q{(dU-a$pyI`90AMNXhb3JTQkwEQ*xe3acB`>O zngDnarcU~uiL&zj6Vfg>sI?u{50ov!FKZs-DdE6BoKmkGJ(CowP6Wo%Wgk)Qx-j!7 zhMSxAWN;H@Y(b!T+6~(!P?eBbS@QChxnWK}<%^W1~&vjeoaFK{75Mb0tv~3~mq}E_qw$Xywig+fS((s$vl%v-~R| zNnB#0)GPJ13W}QOlZ5-X6@79By-Y*(?7}p85S^q)@`b1JusB^VZv!vS8L}`NdMvAO zOJg60Rd}{MqzKe0>~o*QMv)YTQ1!y#qYQ6OuOd{z)xHh*Ku9aqhq5Y^d4{w*mpRg?Ezq8=|VA)K$nMj%q z2e9UBb~+hbORJV3N>T%jBhmO1+y+QbL7Ji!c_ZM4+1*KZ+RQ1m4J(b+D`Y>a6){2% zJcHyeyC@bDx)JcThUMZ-IIKYz1XwmWzyemN>n5oi&sQ4T$#~83GLui6mNZGLKbN&=k(ej+vDGIrRijGTLz z7a-4x+%Wf}`3Q5db4;PKh04sy?{S8Z_xUdJH!)*z!&xufLa&ZAd$^?2oB>|DUUAAu zQ`xw=%3@eTE-YoGFn3vQ^#>^%u<0ZQ6C!7pNMoL3jS1B)V{I2FGFA|T7KQRS>4A1D zoAH1tnS=*^$PgNrWcP!6FmELRm&k!AZju8*tB^q06GctHX;1==8|zF<5$q1-LoS)k zadZl-Mw)tv`#ok7`K*Q+tBkp0#8KmfN-s*!6>`XSY*P;~rJ!+FEUh>XHEUBufmD*< zNfhmbWGT;!v_h;;71?owf-p~dND;CNif?eE!0}=73`|~BI6=#hWn(k!5E>*t4oTF2 zb`DtIFo??7s_8T%n5=ao5$&Wma!Zk)yE~VuHNswi+SrL!%pnc2I+=NqNs1XFpp`bF z;R_=5hht|#Q^utOUyktX79=~PJ%x1G%DrfKi<$C3Ydg-3AuHSD$D|x%+jWCbt}W(o z7BsoupblpCTf`V(20Thxk|4xGnFJQ1|1J8LfLw8Y+n^xy>FFM#ty&OqN^i1ts-m?Kq-aATdb2RaMFEJ>PEu zw+TU97IS$)LlO{{sUX)P+sr-F{HmNtMNSB-0r?Br12>5cr)MS3 zXb=PLVDbg_Dd!jtVPF#F<&dq;Co5Q`cXJ`U$Dew7-;@H&K#K>r)*KbA- zu0+TstyS=ql+6b>4$qFxPLGVPjEv&6*o7wC#H}W>9Y*`jb!c#-Ju=j~_z|49a()z+ zX^+q0jZ#(@&Qs|R6`UJc)t|wW@k6DW_)ZI!<;W>PV6y5E1~plfxIJ9KW}ye@T3O}W zxZTN{O{XSu@B-mHH@gz*;YG^^H@hDPZOy*G->c`C(1Q)+_Jz4*L?Dmx<++#m@DZOQ zle0%#vd_Fx@Z84GFwD}ba!Ca*=_uRmG0~2_DFf5rp%aqj6 zK&veYA#8SZ4Z3w}R{1AA|WgQfic?r#zurxY}njsvId__z#X zC7){SB{P`>%QzB1EXU{ppl&{p2cxZv^IY-4A3lt8oTA{=-dfvc4A>VM?c!PGqG3$S zVrL+okIyz$;PsayZShe6u_WDfR<8%8nsR{qn7340uHm?YIsBOpe<>F~dUV7@Arb~l zI-lINWoAvj18eid!4iCZy9Ay%WLE9f-~=!MMs+3Uk^oc~P5~jyHFlhnfWQiq4on6L zX*JthVUA#Pn9xJ$CZfZLdJ2)T+ej|OrQ9)@dBow9Ewm{UL~(P>Gn>ed;D-2OE}KZF zX~G@ug=;L0Y>w!boHEbpL}|dAtzC{xvHU21xk1c&R1T705(l#LvNNw#IN)e%EFIXh zheUmPf&?mN>|w(~ITj`UTGAoFkXV68ch1A({Dl*)oS_jpA$hif2mlWKnWIs%$Vsc% zCOwrm73)TZb2Lh95gY_YqFLlo@*DI~!hg~Xa@JXR0dKIwGqENjCJ61UB@EnW@*vg+ z!---h2yIe0EEW{&HJoBsX|eU{+IqScFSZCv+_^`a;hh4%_r>80baLhSBl!^_25sYSLP1 zTWAH$8qi+@1?FJM08R%i!f~?(&NK7z>omoaXO_`8rKE3^;5l%-D6A-Rg@X%-uH-H# z?nI_eLO5*Ypx_>?4DlW$I0Toh$#9~@a0^Zf*EsQ{l9WnF`oGMSW9myL4a|WiVlo)y zsK=G))FwqcDFd>HbWF}r4gsBe`k$Tm-7d z0Ax4Zobq#0&y*v)@&ui=CY_`5X5$Tg0tH~Lbyi?c@uS;=pXr^{Xs^StX87ceG0PLI zdz0a6sRk@lTlKoG6TNkBdmIr^PGO5ZuFx}cP}r# zwzZePd!gHlpre2glT~`Kxd?ISgy=vdori>+l=HdyJK<{EhvXzF)Rmf7t=4hG5R-+6 z7G6s#nvx#HEM!)TVm4v(wdr7M1+r9Ywiy4XL3;-iV&6}yE=n>D5y;G$0@Ocy=VYlV z3OS$}!U)yRVwWo=tERunAi2u0O#v|$^;)Zj^J7%$f{tcvZLH_0j2!sSs&nskIKa_4 zut^ZjbkfEwxx3}XV!}0peaD%xP87S($SSg7N{&&|@po9Fvx75NOGvvjeW0?JpkK|O zqB>TylzHQgueUnqIRUdf-lYNuD=2f;hzL5~D|gR_6UA|ymKdkP6l0Zkd%GRH@qV{6 zUTaqB{pD!9a^S!?Vgos_apVehbAO07dInyvEsd{KD&ufphqKe8^;)yPF^XhsjHowA z50Gg{_ZTMxbncXCXy!S1PA0uO`54={Go2KL&#WFA4l}mOUntm#KPeB>D(U#1)O7Hb z_%|-nvsbBb-xSv3XBwR8f{I1RcjdYAwOn6mkvf5|*hOZ`!i@oed)p{pN0<7wdT+GW zq$5YmAXofoeDnAtVUP1S3X$Lsbj4jcV1jQIb9{pqTgLaWsF+-}wt}Bic^}+4E&<36 z3!YgQzwlDifN>@geZ#as^f+B=q9XJi_+j8J>!+udrh0?bDe;Web!2tAj1L2tNqNG2;8w7B>afff;;3A9-Fy@8el|8Ss%zn=)SwD%{60_-fmRc~G0@_{Cju=Gd}pAgfWNaN&^o=R11-jT zBG6j9hXO5|I~!<$+}(i|!>t8c>Gnf`R<$h#TEF(5KnvB52U?4EEYPa6vw_x^Jrigd z*;=4QV)q1E5Ha>YafWMlA+f z0`=xV%bng4Xlc{kftE2X23oGPVyc$r{fjqCcvpFU{R8*6YXI1RU;Y^gj6Ng$FWxta zYhL?103Y&pdavLuiOJ6hz7YHk2Rx<;{6p~ zi<$g<6kllkbIv#)1AK>fv-gJ6{x<;6oBu1^ey?}Ix$p1G_;<@I4)6kJ{(MK^|5)Jk z77_XkTAyq2AUnL9y!u0?UGm?&`Rw5bztOvjUOJNa9N=+o^>*TQnaK~mdt`@q8{X-g zgyLOQfbYlpSoDyee^%g@?Fsys1a29gz&|H&%R~kK4S`#ZCGcy9%zeEP1DF^1-2%5f zQQ*%A+>)cf>5U{bf6J%^{{IASnYF<80$-`UW$^-^5x8Xw0$&!m<;(*An84lj`IiE> zEMMAx9`K#s?cSbq0+7oeNPEjj1pb!-x6D=G2d^^ocgLR>xD^7@{+z%qGZgqw3EXm1 zfj^Ho-Hc$K-Z=rt&(NBkfVT8tb3^j4*s><~7X6 z1@7WiS>Tqn%aFeZ_-?GU`?Ayj%<$}e|5V0t_xA%=n{~F5MY_%bp7*@n0q~y%d>394 zFnlh3?_ZMf-TnIXfN{Pc?XCEb;r?9UmZ=N;7QE?<@Z6pM(}3TJ`RtVW7}W@G_LBBi z&dNBy26*1{ev#lqyS&$=;!bg`52FHv(4$Xdn0jeRg94dE<`*PV={-(KPoi z3fu}sf&ZewU3&kI0(bH7j|Fa3I2q?1!1LyFHv}Hd#|l|#|Dyu8Vp!mx61Y{s1pZBd zTQy7Ir|~{$8s92TvOb>{xK#(F{nr7{o9DNsz15+leIIm9bn$|8x<}v#@m8|DaoPjm zF9J^Uv?`&D^ScAue?{6`-A~%TBXFxm3jChy%=lIj68KAi=gsq1q`lRqrTxp)ehB~U z6o6cQ8z7=bmk)nI#&PlCbs8r<1b_Rsw0GC}AYQVV*ZvIPv~HgfePExA`BMV7daJ-c z4frnTIS-#RfSrO5uSt8W_e=Y~5V%!M1wJJE?!KM*F2HF%R`Hki4+-2VtO9QVPV&o@ z3m=vCR@IgE|5o5ukrw#>61X*v1pZwff3Nq#k^toLJ!x<41c8s^RoOIus}c+Rl)$YL zF7QtX+}aER|2p7A7w&72zsYcEl(<|Ae4_ih`omoUw+grPIU{gu#R>dHz;|MQT|E4G zX>YA2Y5y64Tcb?iUj;l5-`%go>9!-oWJO&}S+BXDb-3H(z6w}!O9UlzDE zK?MF^0neM~8`9nymeT&a1KRJwAhiCjzW12GU6baQ0nfYd??`)B&wN|p)?AkP+y=#+ z?(6ayymF1<)>4)BKMnYZ{GGh~s1~zsAUi>QUt>Gy5{i49F+d|;~Q{XPYx(;uar2D#fI3aLr*~>T|1$;#Q zPF{Xa+FP?(e*EJB?Z1!TiB8pr^K;VvT^Yw3=K{Y8uPmo|S{H}FCk1Yeeu1|IZv8F- z|D?dJ<3QkF0i5RJzLx%v7%q*Hmjz^P6vq(i4$Dh5t~UWdx7V*$$13pI;j99JxCl=m zYXv?!yj%e-QSNc24(}tPmN=xZvzS zJhtCxP+^h8H^jSY2sHC~a?{j$t0@d~8vbu74IDl<4F~!*50=!BJT|y86jH>`9)GeF zmY#Z)k9Z*mJ1jjRz$YF(i)hrdPaS`9?t~rW%wvx&pseoV@kdUVIREZSqM@2$NZA6M zf@2FLJHeZD?K5gVAcGL+mne>Q*=MM7qOIFFJD81Pn-nk_?eD$7?mZfKr zeZY=-I+04%#VPKeszAX7z8-%3^xPvSo_Qvm8k?4wTy9bnwo+3+Ih6jr-bT+WHKV%aKGP#g%yT-|J*IQ(c~CuR9&5hChroIR407h!Z4RqM(pN zJkz|~yUo)Vup310xi1gOYze>ZCJl9x%$ONs1uYht68q^sn-f-?_Ah7KfG_D&p_^64 zzJj%2oJUT;qdz`|6pb+)P~O-GQJSDjuQWpWtZ% z*(*9UpTs8Y29CEm5YprZ$>bD2(08B6o8=O0V2qG7`EVJ=03bIR^?@a#g;+R z=*eImwBq{F$l5?3c{W z!7Dnje&G@-Ub4E8JBP$k$^`LdW}(WqTZn=lA^E6uk1fVgKAFYN1QSiI$u?0ku96+2 zR|@I!%iq`&(TuE#bWut}#XDh0%#);-7a*9Y9bms`+G?I|nvf@(ZltxQgfw*9-|JLH zbKaE=itSD<#~UH?0E~9Pq7TALpfbxIW09l#`*l_*oLi(6Ty?cUzLBGCQ7ZZ+j(KeR z9Y9a>`Ty`N&i^)|haW$20=6)j9*bP@CsFIhrHp}#l-_feh{6u3n5;7lMuD0d+am9C zdAY0%)iR2kv7^)zsa>%tXHd;zu(o!Y@BYGzJ5d0~SX%k660GBuz6XGiY5+=Yk=cz^ z%PwisX>$eAIO*mbM2PtXaR;KLQ?)F7F8M|~l0)eVAEa@m@YEZ_iFF)G#uW$V`MRoq zaUOcx8$-T+G=|jVF{!(cw@^Knz)6zqAD8y zLbc^lVk7k>#BZRMGIfx@+BmmA#tQEk{v2CDr4;^y%D#`mvcXq2{Kq;i_5+SZtKval zUB+no4Y#S_WwD$C3+FzS?c!0TjsuUOf73WL4GhUsE;nkpml+)*+8cw5zd>&?9phA9 zbfdRO18%4o!>QJk+n4^# zIsG-CQLiKE=9&IKj^F?G2R~@(^S>hZ*Xy+ON16_Q-1$?O4yh3K`M)Lo_4+j#n4Xc= zPWx*dum%`)(ffZ+Zlu>Q>knu{A9wwq2kZxl`CmkS3Vrl?)O_`H{yLmqFXH#_C;I<^ z^tV^(PxGgF>ih-l{d4?5d!pmLfczEu=yg>ltoPUc`uzV2ZK?kw)Cr$&(PAd9uO#~4 z2Dsb**8rm?IzB>r<|9|a@8rkDpI^q0$^IkKPp=ble;vaa-un%w|2*Q}^wF!fH_$kp zMd7dDhvfawNq@bLY;ph3JN;jfAhceOYT~L)K<}&bq5Rk6{WTv&e z*Ze}g7M%I({^_9q&FQcCuzLNv9oY16@Bb%G|8Gp0c6$BSf=>n-p<&+R2AD_^Pm4p`fIyE{ck{jnv<{{ zn`iJ{>92I=_Sf%w(V1vR`)l6u&L>TaowEK!|Mb!MC?35GSn~dwpFDDgn|p7Vi~U#o z>-BDD{@yuhI&ZF9&7bn6X)K-p!_t3`^ncjFpNGw`_FtlJn*W4_m_M}tr~{|A^wH}P z>2IL%za_cGZ1Lkq)8#^?G4I|3CW?)8f;*u`+=6(<|k<>)(10y8gnQ z272Fs{@RvWIVi$EeeT1i|2ZN~eD1;jNL8`;uXst~(zyj7(4Qz_AD{n=e3InHKw}88 S`@H@)o-!>z;dF4mdjB620JN+C literal 0 HcmV?d00001 diff --git a/task_01/src/main.cpp b/task_01/src/main.cpp index 0e4393ba..76aa0414 100644 --- a/task_01/src/main.cpp +++ b/task_01/src/main.cpp @@ -1,3 +1,58 @@ #include +#include +#include -int main() { return 0; } +long long GetSize() { + long long c; + std::cout << "Enter a length of array: "; + std::cin >> c; + if (c <= 0) { + std::cout << "You need to enter a number greater than 0\n"; + GetSize(); + } + return c; +}; + +long long GetNumber() { + long long n; + std::cout << "Enter a number: "; + std::cin >> n; + return n; +}; + +std::vector GetArray(long long l) { + std::vector nums; + std::cout << "Enter the array: "; + for (int i = 0; i < l; i++) { + int c; + std::cin >> c; + nums.push_back(c); + } + return nums; +} + +std::pair GetTwoNums(long long n, + std::vector nums) { + size_t l = 0; + size_t r = nums.size() - 1; + while (l != r) { + if (nums[l] + nums[r] == n) + return {nums[l], nums[r]}; + else if (nums[l] + nums[r] < n) + l++; + else if (nums[l] + nums[r] > n) + r--; + } + throw std::logic_error( + "There are no two elements, which add up to a given number."); +} + +int main() { + long long n = GetNumber(); + long long l = GetSize(); + std::vector nums = GetArray(l); + std::pair res = GetTwoNums(n, nums); + std::cout << "Two numbers, which add up to a given number: " << res.first + << ", " << res.second; + return 0; +} From b5f79571d8079d361dab8681a6005bb7718f8bdb Mon Sep 17 00:00:00 2001 From: MrWh1teF0x <142975991+MrWh1teF0x@users.noreply.github.com> Date: Sun, 25 Feb 2024 15:11:39 +0000 Subject: [PATCH 02/12] homework_1 done (with tests) --- task_01/src/main | Bin 87728 -> 0 bytes task_01/src/main.cpp | 18 ++-------- task_01/src/test.cpp | 60 ++++++++++++++++++++++++++++++++-- task_01/src/topology_sort.cpp | 16 +++++++++ task_01/src/topology_sort.hpp | 6 ++++ 5 files changed, 81 insertions(+), 19 deletions(-) delete mode 100755 task_01/src/main diff --git a/task_01/src/main b/task_01/src/main deleted file mode 100755 index 3722c980a4a2bc3581eb837712741c3b419b9327..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87728 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 S`@H@)o-!>z;dF4mdjB620JN+C diff --git a/task_01/src/main.cpp b/task_01/src/main.cpp index 76aa0414..03a9f9a9 100644 --- a/task_01/src/main.cpp +++ b/task_01/src/main.cpp @@ -2,6 +2,8 @@ #include #include +#include "topology_sort.hpp" + long long GetSize() { long long c; std::cout << "Enter a length of array: "; @@ -31,22 +33,6 @@ std::vector GetArray(long long l) { return nums; } -std::pair GetTwoNums(long long n, - std::vector nums) { - size_t l = 0; - size_t r = nums.size() - 1; - while (l != r) { - if (nums[l] + nums[r] == n) - return {nums[l], nums[r]}; - else if (nums[l] + nums[r] < n) - l++; - else if (nums[l] + nums[r] > n) - r--; - } - throw std::logic_error( - "There are no two elements, which add up to a given number."); -} - int main() { long long n = GetNumber(); long long l = GetSize(); diff --git a/task_01/src/test.cpp b/task_01/src/test.cpp index ef5a86ae..3468decd 100644 --- a/task_01/src/test.cpp +++ b/task_01/src/test.cpp @@ -1,8 +1,62 @@ - #include +#include +#include + #include "topology_sort.hpp" -TEST(TopologySort, Simple) { - ASSERT_EQ(1, 1); // Stack [] +TEST(GetTwoNums, Test_1) { + ASSERT_EQ(GetTwoNums(15, std::vector{5, 10, 15, 20, 25}), + (std::pair{5, 10})); +} + +TEST(GetTwoNums, Test_2) { + ASSERT_EQ( + GetTwoNums(18, std::vector{1, 2, 3, 5, 7, 8, 10, 14, 19, 25}), + (std::pair{8, 10})); +} + +TEST(GetTwoNums, Test_3) { + ASSERT_EQ(GetTwoNums(-20, std::vector{-100, -98, -72, -54, -11, 0, + 10, 20, 34, 60}), + (std::pair{-54, 34})); +} + +TEST(GetTwoNums, Test_4) { + ASSERT_EQ( + GetTwoNums(-6, std::vector{-120, -100, -84, -20, -11, -5, -1}), + (std::pair{-5, -1})); } + +TEST(GetTwoNums, Test_5) { + ASSERT_EQ( + GetTwoNums(21000000000, + std::vector{1000000000, 2000000000, 4000000000, + 8000000000, 11000000000, 13000000000}), + (std::pair{8000000000, 13000000000})); +} + +TEST(GetTwoNums, Test_6) { + ASSERT_EQ( + GetTwoNums( + 11, std::vector{0, 0, 0, 0, 0, 1, 1, 2, 2, 2, 2, 3, + 6, 7, 8, 9, 9, 9, 12, 13, 15, 15, 16, 17}), + (std::pair{2, 9})); +} + +TEST(GetTwoNums, Test_7) { + ASSERT_EQ(GetTwoNums(100000000000000, + std::vector{ + 10000000000000, 20000000000000, 30000000000000, + 30000000000000, 50000000000000, 50000000000000, + 60000000000000, 110000000000000, 110000000000000, + 110000000000000}), + (std::pair{50000000000000, 50000000000000})); +} + +TEST(GetTwoNums, Test_8) { + ASSERT_EQ(GetTwoNums(84, std::vector{-12, -6, -4, 1, 23, 25, 26, + 33, 38, 46, 52, 58, 64, 69, + 76, 82, 97, 101}), + (std::pair{26, 58})); +} \ No newline at end of file diff --git a/task_01/src/topology_sort.cpp b/task_01/src/topology_sort.cpp index e53f670c..a0723fcd 100644 --- a/task_01/src/topology_sort.cpp +++ b/task_01/src/topology_sort.cpp @@ -1 +1,17 @@ #include "topology_sort.hpp" + +std::pair GetTwoNums(long long n, + std::vector nums) { + size_t l = 0; + size_t r = nums.size() - 1; + while (l != r) { + if (nums[l] + nums[r] == n) + return {nums[l], nums[r]}; + else if (nums[l] + nums[r] < n) + l++; + else if (nums[l] + nums[r] > n) + r--; + } + throw std::logic_error( + "There are no two elements, which add up to a given number."); +} \ No newline at end of file diff --git a/task_01/src/topology_sort.hpp b/task_01/src/topology_sort.hpp index 6f70f09b..472631d3 100644 --- a/task_01/src/topology_sort.hpp +++ b/task_01/src/topology_sort.hpp @@ -1 +1,7 @@ #pragma once + +#include +#include + +std::pair GetTwoNums(long long n, + std::vector nums); \ No newline at end of file From dab51dc848ee0aba030f4765b1e698fb942c48e0 Mon Sep 17 00:00:00 2001 From: MrWh1teF0x <142975991+MrWh1teF0x@users.noreply.github.com> Date: Fri, 8 Mar 2024 11:11:24 +0000 Subject: [PATCH 03/12] some changes --- task_01/src/main.cpp | 36 +++++++++++++++++------------------ task_01/src/test.cpp | 10 ++++++++++ task_01/src/topology_sort.cpp | 23 ++++++++++++---------- task_01/src/topology_sort.hpp | 2 +- 4 files changed, 42 insertions(+), 29 deletions(-) diff --git a/task_01/src/main.cpp b/task_01/src/main.cpp index 03a9f9a9..2afee715 100644 --- a/task_01/src/main.cpp +++ b/task_01/src/main.cpp @@ -4,40 +4,40 @@ #include "topology_sort.hpp" -long long GetSize() { - long long c; +size_t GetSize() { + size_t length; std::cout << "Enter a length of array: "; - std::cin >> c; - if (c <= 0) { - std::cout << "You need to enter a number greater than 0\n"; + std::cin >> length; + if (length <= 1) { + std::cout << "You need to enter a number greater than 1\n"; GetSize(); } - return c; + return length; }; long long GetNumber() { - long long n; + long long number; std::cout << "Enter a number: "; - std::cin >> n; - return n; + std::cin >> number; + return number; }; -std::vector GetArray(long long l) { +std::vector GetArray(size_t length) { std::vector nums; std::cout << "Enter the array: "; - for (int i = 0; i < l; i++) { - int c; - std::cin >> c; - nums.push_back(c); + for (int i = 0; i < length; i++) { + int number; + std::cin >> number; + nums.push_back(number); } return nums; } int main() { - long long n = GetNumber(); - long long l = GetSize(); - std::vector nums = GetArray(l); - std::pair res = GetTwoNums(n, nums); + long long number = GetNumber(); + size_t length = GetSize(); + std::vector nums = GetArray(length); + std::pair res = GetTwoNums(number, nums); std::cout << "Two numbers, which add up to a given number: " << res.first << ", " << res.second; return 0; diff --git a/task_01/src/test.cpp b/task_01/src/test.cpp index 3468decd..5e3ebdf3 100644 --- a/task_01/src/test.cpp +++ b/task_01/src/test.cpp @@ -59,4 +59,14 @@ TEST(GetTwoNums, Test_8) { 33, 38, 46, 52, 58, 64, 69, 76, 82, 97, 101}), (std::pair{26, 58})); +} + +TEST(GetTwoNums, Test_9) { + ASSERT_EQ(GetTwoNums(12, std::vector{12}), + (std::pair{-1, -1})); +} + +TEST(GetTwoNums, Test_10) { + ASSERT_EQ(GetTwoNums(100, std::vector{}), + (std::pair{-1, -1})); } \ No newline at end of file diff --git a/task_01/src/topology_sort.cpp b/task_01/src/topology_sort.cpp index a0723fcd..906d330f 100644 --- a/task_01/src/topology_sort.cpp +++ b/task_01/src/topology_sort.cpp @@ -1,16 +1,19 @@ #include "topology_sort.hpp" -std::pair GetTwoNums(long long n, +std::pair GetTwoNums(long long number, std::vector nums) { - size_t l = 0; - size_t r = nums.size() - 1; - while (l != r) { - if (nums[l] + nums[r] == n) - return {nums[l], nums[r]}; - else if (nums[l] + nums[r] < n) - l++; - else if (nums[l] + nums[r] > n) - r--; + if (nums.size() <= 1) { + return {-1, -1}; + } + size_t left = 0; + size_t right = nums.size() - 1; + while (left != right) { + if (nums[left] + nums[right] == number) + return {nums[left], nums[right]}; + else if (nums[left] + nums[right] < number) + left++; + else if (nums[left] + nums[right] > number) + right--; } throw std::logic_error( "There are no two elements, which add up to a given number."); diff --git a/task_01/src/topology_sort.hpp b/task_01/src/topology_sort.hpp index 472631d3..d609c245 100644 --- a/task_01/src/topology_sort.hpp +++ b/task_01/src/topology_sort.hpp @@ -3,5 +3,5 @@ #include #include -std::pair GetTwoNums(long long n, +std::pair GetTwoNums(long long number, std::vector nums); \ No newline at end of file From 8fa71be83a7ab8a7f965be9a31e96386ca062f01 Mon Sep 17 00:00:00 2001 From: MrWh1teF0x <142975991+MrWh1teF0x@users.noreply.github.com> Date: Sun, 31 Mar 2024 11:28:24 +0000 Subject: [PATCH 04/12] rename files and add tests --- .../{topology_sort.cpp => get_two_nums.cpp} | 6 ++--- .../{topology_sort.hpp => get_two_nums.hpp} | 2 +- task_01/src/main.cpp | 2 +- task_01/src/test.cpp | 22 ++++++++++++++----- 4 files changed, 21 insertions(+), 11 deletions(-) rename task_01/src/{topology_sort.cpp => get_two_nums.cpp} (84%) rename task_01/src/{topology_sort.hpp => get_two_nums.hpp} (95%) diff --git a/task_01/src/topology_sort.cpp b/task_01/src/get_two_nums.cpp similarity index 84% rename from task_01/src/topology_sort.cpp rename to task_01/src/get_two_nums.cpp index 906d330f..ce5cb802 100644 --- a/task_01/src/topology_sort.cpp +++ b/task_01/src/get_two_nums.cpp @@ -1,9 +1,9 @@ -#include "topology_sort.hpp" +#include "get_two_nums.hpp" std::pair GetTwoNums(long long number, std::vector nums) { if (nums.size() <= 1) { - return {-1, -1}; + throw std::length_error("The array size must be greater than 1."); } size_t left = 0; size_t right = nums.size() - 1; @@ -17,4 +17,4 @@ std::pair GetTwoNums(long long number, } throw std::logic_error( "There are no two elements, which add up to a given number."); -} \ No newline at end of file +} diff --git a/task_01/src/topology_sort.hpp b/task_01/src/get_two_nums.hpp similarity index 95% rename from task_01/src/topology_sort.hpp rename to task_01/src/get_two_nums.hpp index d609c245..5c1e6383 100644 --- a/task_01/src/topology_sort.hpp +++ b/task_01/src/get_two_nums.hpp @@ -4,4 +4,4 @@ #include std::pair GetTwoNums(long long number, - std::vector nums); \ No newline at end of file + std::vector nums); diff --git a/task_01/src/main.cpp b/task_01/src/main.cpp index 2afee715..9effade2 100644 --- a/task_01/src/main.cpp +++ b/task_01/src/main.cpp @@ -2,7 +2,7 @@ #include #include -#include "topology_sort.hpp" +#include "get_two_nums.hpp" size_t GetSize() { size_t length; diff --git a/task_01/src/test.cpp b/task_01/src/test.cpp index 5e3ebdf3..98fc92aa 100644 --- a/task_01/src/test.cpp +++ b/task_01/src/test.cpp @@ -1,9 +1,10 @@ #include #include +#include #include -#include "topology_sort.hpp" +#include "get_two_nums.hpp" TEST(GetTwoNums, Test_1) { ASSERT_EQ(GetTwoNums(15, std::vector{5, 10, 15, 20, 25}), @@ -62,11 +63,20 @@ TEST(GetTwoNums, Test_8) { } TEST(GetTwoNums, Test_9) { - ASSERT_EQ(GetTwoNums(12, std::vector{12}), - (std::pair{-1, -1})); + EXPECT_THROW(GetTwoNums(2, std::vector{2}), std::length_error); } TEST(GetTwoNums, Test_10) { - ASSERT_EQ(GetTwoNums(100, std::vector{}), - (std::pair{-1, -1})); -} \ No newline at end of file + EXPECT_THROW(GetTwoNums(100, std::vector{}), std::length_error); +} + +TEST(GetTwoNums, Test_11) { + EXPECT_THROW(GetTwoNums(5, std::vector{1, 2, 5, 7, 9, 11, 23, 55}), + std::logic_error); +} + +TEST(GetTwoNums, Test_12) { + EXPECT_THROW(GetTwoNums(-10, std::vector{1, 2, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14}), + std::logic_error); +} From e0c84c632fda074683c157ddb7811ae87a63aa82 Mon Sep 17 00:00:00 2001 From: MrWh1teF0x <142975991+MrWh1teF0x@users.noreply.github.com> Date: Thu, 6 Jun 2024 22:50:11 +0000 Subject: [PATCH 05/12] complete task_05 with tests --- task_05/src/main.cpp | 3 - task_05/src/merge_sort.hpp | 48 ++++++++++++ task_05/src/test.cpp | 6 -- task_05/src/test_merge_sort.cpp | 126 ++++++++++++++++++++++++++++++++ 4 files changed, 174 insertions(+), 9 deletions(-) delete mode 100644 task_05/src/main.cpp create mode 100644 task_05/src/merge_sort.hpp delete mode 100644 task_05/src/test.cpp create mode 100644 task_05/src/test_merge_sort.cpp diff --git a/task_05/src/main.cpp b/task_05/src/main.cpp deleted file mode 100644 index 0e4393ba..00000000 --- a/task_05/src/main.cpp +++ /dev/null @@ -1,3 +0,0 @@ -#include - -int main() { return 0; } diff --git a/task_05/src/merge_sort.hpp b/task_05/src/merge_sort.hpp new file mode 100644 index 00000000..7389f850 --- /dev/null +++ b/task_05/src/merge_sort.hpp @@ -0,0 +1,48 @@ +#include +#include +using namespace std; + +template +void Merge(T* begin, T* middle, T* end) { + std::vector sorted_array; + + T* begin_copy = begin; + T* middle_copy = middle; + + while ((begin < middle_copy) || (middle < end)) { + if ((begin < middle_copy) && (middle < end)) { + if (*begin <= *middle) { + sorted_array.push_back(*begin); + ++begin; + } else { + sorted_array.push_back(*middle); + ++middle; + } + } else { + if (begin < middle_copy) { + sorted_array.push_back(*begin); + ++begin; + } else { + sorted_array.push_back(*middle); + ++middle; + } + } + } + size_t index = 0; + for (T* i = begin_copy; i < end; i++) { + *i = sorted_array[index]; + index++; + } +} + +template +void MergeSort(T* begin, T* end) { + if ((begin == end) || (end - begin < 2)) return; + + T* middle = begin + (end - begin) / 2; + + MergeSort(begin, middle); + MergeSort(middle, end); + + Merge(begin, middle, end); +} diff --git a/task_05/src/test.cpp b/task_05/src/test.cpp deleted file mode 100644 index 5e11617e..00000000 --- a/task_05/src/test.cpp +++ /dev/null @@ -1,6 +0,0 @@ - -#include - -TEST(TopologySort, Simple) { - ASSERT_EQ(1, 1); // Stack [] -} diff --git a/task_05/src/test_merge_sort.cpp b/task_05/src/test_merge_sort.cpp new file mode 100644 index 00000000..ec26303e --- /dev/null +++ b/task_05/src/test_merge_sort.cpp @@ -0,0 +1,126 @@ +#include + +#include +#include +#include +#include + +#include "merge_sort.hpp" + +TEST(MergeSort, Test_1) { + vector data{2, 1, 3, 7, 5, 6, 4}; + int* begin = &(data[0]); + int* end = &(data[data.size()]); + MergeSort(begin, end); + ASSERT_EQ(data, (vector{1, 2, 3, 4, 5, 6, 7})); +} + +TEST(MergeSort, Test_2) { + vector data{}; + int* begin = &(data[0]); + int* end = &(data[data.size()]); + MergeSort(begin, end); + ASSERT_EQ(data, (vector{})); +} + +TEST(MergeSort, Test_3) { + vector data{1}; + int* begin = &(data[0]); + int* end = &(data[data.size()]); + MergeSort(begin, end); + ASSERT_EQ(data, (vector{1})); +} + +TEST(MergeSort, Test_4) { + vector data{2, 1}; + int* begin = &(data[0]); + int* end = &(data[data.size()]); + MergeSort(begin, end); + ASSERT_EQ(data, (vector{1, 2})); +} + +TEST(MergeSort, Test_5) { + vector data{20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, + 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; + int* begin = &(data[0]); + int* end = &(data[data.size()]); + MergeSort(begin, end); + ASSERT_EQ(data, (vector{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20})); +} + +TEST(MergeSort, Test_6) { + vector data{3.456, 7.890, 8.976, 4.567, 6.543, 5.432, 2.109, 9.012, + 1.234, 6.789, 0.987, 1.234, 5.678, 4.321, 9.876, 8.765, + 2.345, 7.654, 0.123, 3.210, 4.321, 1.234, 5.432, 9.876, + 6.543, 8.765, 3.456, 7.890, 2.109, 0.987, 6.789, 4.567, + 8.976, 2.345, 9.012, 7.654, 5.678, 3.210, 0.123}; + + vector sorted_data = data; + std::sort(sorted_data.begin(), sorted_data.end()); + + double* begin = &(data[0]); + double* end = &(data[data.size()]); + MergeSort(begin, end); + + ASSERT_EQ(data, sorted_data); +} + +TEST(MergeSort, Test_7) { + vector data{3, 5, 3, 2, 4, 5, 7, 3, 3, 2, 1, 4, 9, 7, 5}; + + vector sorted_data = data; + std::sort(sorted_data.begin(), sorted_data.end()); + + int* begin = &(data[0]); + int* end = &(data[data.size()]); + MergeSort(begin, end); + + ASSERT_EQ(data, sorted_data); +} + +TEST(MergeSort, Test_8) { + vector data{3, 5, 3, 2, 4, 5, 7, 3, 3, 2, 1, 4, 9, 7, 5}; + + vector sorted_data = data; + std::sort(sorted_data.begin(), sorted_data.end()); + + int* begin = &(data[0]); + int* end = &(data[data.size()]); + MergeSort(begin, end); + + ASSERT_EQ(data, sorted_data); +} + +TEST(MergeSort, Test_9) { + vector data{18, 5, 26, 21, 7, 25, 19, 16, 9, 3, 8, 13, 27, + 14, 2, 1, 23, 6, 29, 17, 4, 15, 11, 28, 12}; + + vector sorted_data = data; + std::sort(sorted_data.begin(), sorted_data.begin() + 12); + + int* begin = &(data[0]); + int* end = &(data[12]); + MergeSort(begin, end); + + ASSERT_EQ(data, sorted_data); +} + +TEST(MergeSort, Test_10) { + vector data{1, 2, 3, 4, 5, 1, 6, 7, 8, 9, 2, 10, 11, + 12, 13, 14, 3, 15, 16, 17, 4, 18, 19, 20, 5, 21, + 22, 23, 24, 1, 25, 26, 27, 28, 29, 2, 30, 31, 32, + 33, 34, 35, 3, 36, 37, 38, 39, 40, 4, 41, 42, 43, + 44, 45, 5, 46, 47, 48, 49, 50, 1, 51, 52, 53, 54, + 55, 2, 56, 57, 58, 59, 60, 3, 61, 62, 63, 64, 65, + 4, 66, 67, 68, 69, 70, 5, 71, 72, 73, 74, 75, 1}; + + vector sorted_data = data; + std::sort(sorted_data.begin(), sorted_data.end()); + + int* begin = &(data[0]); + int* end = &(data[data.size()]); + MergeSort(begin, end); + + ASSERT_EQ(data, sorted_data); +} \ No newline at end of file From 2ec3133c6b7b3f824d582f900858992ce6561588 Mon Sep 17 00:00:00 2001 From: MrWh1teF0x <142975991+MrWh1teF0x@users.noreply.github.com> Date: Fri, 7 Jun 2024 11:37:05 +0000 Subject: [PATCH 06/12] complete task_03 with tests --- task_03/src/temperature.cpp | 25 +++++++++++++++++++++ task_03/src/temperature.hpp | 5 +++++ task_03/src/test.cpp | 42 ++++++++++++++++++++++++++++++++--- task_03/src/topology_sort.cpp | 1 - task_03/src/topology_sort.hpp | 1 - 5 files changed, 69 insertions(+), 5 deletions(-) create mode 100644 task_03/src/temperature.cpp create mode 100644 task_03/src/temperature.hpp delete mode 100644 task_03/src/topology_sort.cpp delete mode 100644 task_03/src/topology_sort.hpp diff --git a/task_03/src/temperature.cpp b/task_03/src/temperature.cpp new file mode 100644 index 00000000..29ce0136 --- /dev/null +++ b/task_03/src/temperature.cpp @@ -0,0 +1,25 @@ +#include "temperature.hpp" + +vector DaysBeforeWarming(vector temperatures) { + vector days(temperatures.size()); + + if (temperatures.empty()) return days; + + for (size_t i = 0; i < temperatures.size() - 1; i++) { + // Если у предыдущего дня температура больше и кол-во дней до потепления + // больше 1, то для текущего дня можно не считать кол-во дней + if (i > 0 && temperatures[i - 1] > temperatures[i] && days[i - 1] > 1) + days[i] = temperatures[i - 1] - 1; + // Иначе считаем кол-во дней по-честному + else { + for (size_t j = i; j < temperatures.size(); j++) { + if (temperatures[j] > temperatures[i]) break; + days[i]++; + } + // Если мы вышли из цикла без break, значит потепления не было на + // протяжении всех дней + if (days[i] == temperatures.size() - i) days[i] = 0; + } + } + return days; +} \ No newline at end of file diff --git a/task_03/src/temperature.hpp b/task_03/src/temperature.hpp new file mode 100644 index 00000000..36c8677f --- /dev/null +++ b/task_03/src/temperature.hpp @@ -0,0 +1,5 @@ +#pragma once +#include +using namespace std; + +vector DaysBeforeWarming(vector temperatures); \ No newline at end of file diff --git a/task_03/src/test.cpp b/task_03/src/test.cpp index ef5a86ae..0ccb600a 100644 --- a/task_03/src/test.cpp +++ b/task_03/src/test.cpp @@ -1,8 +1,44 @@ #include -#include "topology_sort.hpp" +#include "temperature.hpp" -TEST(TopologySort, Simple) { - ASSERT_EQ(1, 1); // Stack [] +TEST(DaysBeforeWarming, Test_1) { + ASSERT_EQ(DaysBeforeWarming(vector{}), vector{}); } + +TEST(DaysBeforeWarming, Test_2) { + ASSERT_EQ(DaysBeforeWarming(vector{1}), vector{0}); +} + +TEST(DaysBeforeWarming, Test_3) { + ASSERT_EQ(DaysBeforeWarming(vector{1, 2}), (vector{1, 0})); +} + +TEST(DaysBeforeWarming, Test_4) { + ASSERT_EQ(DaysBeforeWarming(vector{1, 2, 3, 4, 5, 6}), + (vector{1, 1, 1, 1, 1, 0})); +} + +TEST(DaysBeforeWarming, Test_5) { + ASSERT_EQ(DaysBeforeWarming(vector{6, 5, 4, 3, 2, 1}), + (vector{0, 0, 0, 0, 0, 0})); +} + +TEST(DaysBeforeWarming, Test_6) { + ASSERT_EQ(DaysBeforeWarming(vector{-6, -5, -4, -3, -2, -1}), + (vector{1, 1, 1, 1, 1, 0})); +} + +TEST(DaysBeforeWarming, Test_7) { + ASSERT_EQ(DaysBeforeWarming(vector{-1, 0, 2, -1, -5, 3, 6, 1}), + (vector{1, 1, 3, 1, 1, 1, 0, 0})); +} + +TEST(DaysBeforeWarming, Test_8) { + ASSERT_EQ(DaysBeforeWarming(vector{ + -10, 5, -3, 8, -20, 12, 17, -15, 6, -7, 25, -30, 19, + 4, -2, 11, -18, 14, -5, 9, -13, 22, -35, 16, -40}), + (vector{1, 2, 4, 2, 7, 1, 4, 16, 2, 5, 0, 1, 9, + 18, 3, 2, 10, 4, 13, 2, 8, 0, 1, 0, 0})); +} \ No newline at end of file diff --git a/task_03/src/topology_sort.cpp b/task_03/src/topology_sort.cpp deleted file mode 100644 index e53f670c..00000000 --- a/task_03/src/topology_sort.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "topology_sort.hpp" diff --git a/task_03/src/topology_sort.hpp b/task_03/src/topology_sort.hpp deleted file mode 100644 index 6f70f09b..00000000 --- a/task_03/src/topology_sort.hpp +++ /dev/null @@ -1 +0,0 @@ -#pragma once From 479288156871ddd9d647c5079ab80189b1c7c8db Mon Sep 17 00:00:00 2001 From: MrWh1teF0x <142975991+MrWh1teF0x@users.noreply.github.com> Date: Fri, 7 Jun 2024 22:45:34 +0000 Subject: [PATCH 07/12] complete task_02 with tests --- task_02/src/main.cpp | 7 +++- task_02/src/stack.cpp | 21 ------------ task_02/src/stack.hpp | 76 ++++++++++++++++++++++++++++++++++++++----- task_02/src/test.cpp | 21 ++++++++++-- 4 files changed, 91 insertions(+), 34 deletions(-) delete mode 100644 task_02/src/stack.cpp diff --git a/task_02/src/main.cpp b/task_02/src/main.cpp index 0e4393ba..28f23bb9 100644 --- a/task_02/src/main.cpp +++ b/task_02/src/main.cpp @@ -1,3 +1,8 @@ #include -int main() { return 0; } +#include "stack.hpp" + +int main() { + MinStack stack; + stack.Push(1); +} diff --git a/task_02/src/stack.cpp b/task_02/src/stack.cpp deleted file mode 100644 index 8ca89902..00000000 --- a/task_02/src/stack.cpp +++ /dev/null @@ -1,21 +0,0 @@ -#include "stack.hpp" - -#include - -void Stack::Push(int value) { data_.push(value); } - -int Stack::Pop() { - auto result = data_.top(); - data_.pop(); - return result; -} - -void MinStack::Push(int value) { data_.push_back(value); } - -int MinStack::Pop() { - auto result = data_.back(); - data_.pop_back(); - return result; -} - -int MinStack::GetMin() { return *std::min_element(data_.begin(), data_.end()); } \ No newline at end of file diff --git a/task_02/src/stack.hpp b/task_02/src/stack.hpp index 138ec40f..5c7ea37f 100644 --- a/task_02/src/stack.hpp +++ b/task_02/src/stack.hpp @@ -1,23 +1,81 @@ #pragma once -#include -#include +#include +#include +template +struct StackElem { + explicit StackElem(T value, const std::shared_ptr& prev) + : value_{value}, prev_{prev} {} + + T value_; + std::shared_ptr prev_; +}; + +template class Stack { public: - void Push(int value); - int Pop(); + explicit Stack() : top_{nullptr} {} + + void Push(T value); + T Pop(); + + T Top() const { + if (IsEmpty()) throw std::out_of_range("Stack is empty!"); + return top_->value_; + } + size_t Size() const { return size_; } + bool IsEmpty() const { return size_ == 0; } private: - std::stack data_; + std::shared_ptr> top_; + size_t size_ = 0; }; +template class MinStack { public: - void Push(int value); - int Pop(); - int GetMin(); + explicit MinStack() : data_(), mins_data_() {} + + void Push(T value); + T Pop(); + + T Top() const { return data_.Top(); } + T GetMin() const { return mins_data_.Top(); } + size_t Size() const { return data_.Size(); } + bool IsEmpty() const { return data_.IsEmpty(); } private: - std::vector data_; + Stack data_; + Stack mins_data_; }; + +template +void Stack::Push(T value) { + top_ = std::make_shared>(value, top_); + size_++; +} + +template +T Stack::Pop() { + if (IsEmpty()) throw std::out_of_range("Stack is empty!"); + T res = top_->value_; + top_ = std::move(top_->prev_); + size_--; + return res; +} + +template +void MinStack::Push(T value) { + data_.Push(value); + if (mins_data_.Size() > 0 && mins_data_.Top() < value) + mins_data_.Push(mins_data_.Top()); + else + mins_data_.Push(value); +} + +template +T MinStack::Pop() { + mins_data_.Pop(); + return data_.Pop(); +} \ No newline at end of file diff --git a/task_02/src/test.cpp b/task_02/src/test.cpp index 54e7ce90..6fdce571 100644 --- a/task_02/src/test.cpp +++ b/task_02/src/test.cpp @@ -6,7 +6,7 @@ #include "stack.hpp" TEST(StackTest, Simple) { - Stack stack; + Stack stack; stack.Push(1); // Stack [1] ASSERT_EQ(stack.Pop(), 1); // Stack [] stack.Push(1); // Stack [1] @@ -22,7 +22,7 @@ TEST(StackTest, Simple) { } TEST(MinStackTest, Simple) { - MinStack stack; + MinStack stack; stack.Push(1); // Stack [1] ASSERT_EQ(stack.GetMin(), 1); ASSERT_EQ(stack.Pop(), 1); // Stack [] @@ -39,4 +39,19 @@ TEST(MinStackTest, Simple) { ASSERT_EQ(stack.GetMin(), 1); ASSERT_EQ(stack.Pop(), 3); // Stack [1] ASSERT_EQ(stack.Pop(), 1); // Stack [] -} \ No newline at end of file +} + +TEST(StackTest, Empty) { + Stack stack; + EXPECT_THROW(stack.Pop(), std::out_of_range); +} + +TEST(MinStackTest, Empty) { + MinStack stack; + EXPECT_THROW(stack.Pop(), std::out_of_range); +} + +TEST(MinStackTest, Empty_2) { + MinStack stack; + EXPECT_THROW(stack.GetMin(), std::out_of_range); +} From 4c7c18c1ebb7823faa77a3a38f3c1800f490ee82 Mon Sep 17 00:00:00 2001 From: MrWh1teF0x <142975991+MrWh1teF0x@users.noreply.github.com> Date: Sun, 16 Jun 2024 17:32:32 +0000 Subject: [PATCH 08/12] complete task_06 with tests --- task_06/src/find_ordinal_statistic.hpp | 34 ++++++++++++++ task_06/src/main.cpp | 3 -- task_06/src/test.cpp | 65 ++++++++++++++++++++++++-- 3 files changed, 96 insertions(+), 6 deletions(-) create mode 100644 task_06/src/find_ordinal_statistic.hpp delete mode 100644 task_06/src/main.cpp diff --git a/task_06/src/find_ordinal_statistic.hpp b/task_06/src/find_ordinal_statistic.hpp new file mode 100644 index 00000000..00804b6a --- /dev/null +++ b/task_06/src/find_ordinal_statistic.hpp @@ -0,0 +1,34 @@ +#include +#include +using namespace std; + +template +T FindOrdinalStatistic(vector data, size_t n) { + if (data.empty()) throw logic_error("An array is empty!"); + if (n > data.size() || n <= 0) + throw logic_error("Incorrect ordinal statistic!"); + + if (data.size() == 1) return data[0]; + + size_t p = rand() % data.size(); + T pivot = data[p]; + data.erase(data.begin() + p); + // Левая часть содержит элементы, которые меньше pivot'а, а правая - + // которые больше + vector left_part{pivot}, right_part; + + for (auto elem : data) { + if (elem < pivot) + left_part.push_back(elem); + else if (elem > pivot) + right_part.push_back(elem); + // Мы не добавляем дубликаты, а просто уменьшаем порядковую статистику + else if (n != 1) + n--; + } + + if (n <= left_part.size()) + return FindOrdinalStatistic(left_part, n); + else + return FindOrdinalStatistic(right_part, n - left_part.size()); +} \ No newline at end of file diff --git a/task_06/src/main.cpp b/task_06/src/main.cpp deleted file mode 100644 index 0e4393ba..00000000 --- a/task_06/src/main.cpp +++ /dev/null @@ -1,3 +0,0 @@ -#include - -int main() { return 0; } diff --git a/task_06/src/test.cpp b/task_06/src/test.cpp index 5e11617e..987a9de4 100644 --- a/task_06/src/test.cpp +++ b/task_06/src/test.cpp @@ -1,6 +1,65 @@ - #include -TEST(TopologySort, Simple) { - ASSERT_EQ(1, 1); // Stack [] +#include "find_ordinal_statistic.hpp" + +TEST(FindOrdinalStatistic, Test_1) { + vector v{1, 2, 3, 4, 5, 6}; + ASSERT_EQ(FindOrdinalStatistic(v, 5), 5); +} + +TEST(FindOrdinalStatistic, Test_2) { + vector v{1}; + ASSERT_EQ(FindOrdinalStatistic(v, 1), 1); +} + +TEST(FindOrdinalStatistic, Test_3) { + vector v{3, 1, 2}; + ASSERT_EQ(FindOrdinalStatistic(v, 2), 2); +} + +TEST(FindOrdinalStatistic, Test_4) { + vector v{}; + EXPECT_THROW(FindOrdinalStatistic(v, 0), std::logic_error); +} + +TEST(FindOrdinalStatistic, Test_5) { + vector v{8, 4}; + EXPECT_THROW(FindOrdinalStatistic(v, 3), std::logic_error); } + +TEST(FindOrdinalStatistic, Test_6) { + vector v{8, 4}; + ASSERT_EQ(FindOrdinalStatistic(v, 1), 4); +} + +TEST(FindOrdinalStatistic, Test_7) { + vector v{2, 4, 6, 2, 2}; + ASSERT_EQ(FindOrdinalStatistic(v, 4), 4); +} + +TEST(FindOrdinalStatistic, Test_8) { + vector v{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; + ASSERT_EQ(FindOrdinalStatistic(v, 7), 1); +} + +TEST(FindOrdinalStatistic, Test_9) { + vector v{46, 58, 77, 16, 26, 36, 95, 80, 74, 39, 68, 72, 60, 61, 23, + 30, 52, 9, 78, 31, 5, 55, 27, 62, 73, 57, 79, 18, 11, 54, + 51, 90, 38, 6, 21, 29, 93, 94, 81, 22, 17, 71, 7, 76, 44, + 99, 84, 82, 85, 19, 91, 63, 87, 37, 25, 14, 47, 100, 86, 66, + 88, 13, 35, 2, 4, 10, 34, 20, 69, 59, 33, 45, 32, 98, 49, + 56, 83, 12, 40, 65, 1, 53, 41, 50, 96, 89, 8, 3, 75, 42, + 28, 67, 70, 48, 92, 43, 97, 24, 15, 64}; + ASSERT_EQ(FindOrdinalStatistic(v, 100), 100); +} + +TEST(FindOrdinalStatistic, Test_10) { + vector v{46, 58, 77, 16, 26, 36, 95, 80, 74, 39, 68, 72, 60, 61, 23, + 30, 52, 9, 78, 31, 5, 55, 27, 62, 73, 57, 79, 18, 11, 54, + 51, 90, 38, 6, 21, 29, 93, 94, 81, 22, 17, 71, 7, 76, 44, + 99, 84, 82, 85, 19, 91, 63, 87, 37, 25, 14, 47, 100, 86, 66, + 88, 13, 35, 2, 4, 10, 34, 20, 69, 59, 33, 45, 32, 98, 49, + 56, 83, 12, 40, 65, 1, 53, 41, 50, 96, 89, 8, 3, 75, 42, + 28, 67, 70, 48, 92, 43, 97, 24, 15, 64}; + ASSERT_EQ(FindOrdinalStatistic(v, 24), 24); +} \ No newline at end of file From 9e4b8e38195c95070426a0d59cc186c72f99a153 Mon Sep 17 00:00:00 2001 From: MrWh1teF0x <142975991+MrWh1teF0x@users.noreply.github.com> Date: Sun, 16 Jun 2024 21:13:35 +0000 Subject: [PATCH 09/12] complete task_04 with tests --- task_04/src/main.cpp | 3 -- task_04/src/max_heap.hpp | 65 ++++++++++++++++++++++++++++++++++++++ task_04/src/test.cpp | 67 ++++++++++++++++++++++++++++++++++++++-- 3 files changed, 129 insertions(+), 6 deletions(-) delete mode 100644 task_04/src/main.cpp create mode 100644 task_04/src/max_heap.hpp diff --git a/task_04/src/main.cpp b/task_04/src/main.cpp deleted file mode 100644 index 0e4393ba..00000000 --- a/task_04/src/main.cpp +++ /dev/null @@ -1,3 +0,0 @@ -#include - -int main() { return 0; } diff --git a/task_04/src/max_heap.hpp b/task_04/src/max_heap.hpp new file mode 100644 index 00000000..b77fa512 --- /dev/null +++ b/task_04/src/max_heap.hpp @@ -0,0 +1,65 @@ +#include +#include +#include + +template +class MaxHeap { + public: + MaxHeap() = default; + + MaxHeap(const std::vector& data) { + for (auto& elem : data) Add(elem); + } + + MaxHeap(const std::initializer_list& data) { + for (const auto& elem : data) Add(elem); + } + + T ExtractMax() { + if (Empty()) throw std::out_of_range("Empty heap!"); + + T max = data_[0]; + std::swap(data_[0], data_[Size() - 1]); + data_.pop_back(); + SiftDown(0); + return max; + } + + void Add(T elem) { + data_.push_back(elem); + SiftUp(); + } + + size_t Size() const { return data_.size(); } + + bool Empty() const { return Size() == 0; } + + private: + std::vector data_; + + size_t IndexParent(size_t index) const { return (index - 1) / 2; } + + size_t IndexLeftChild(size_t index) const { return (2 * index + 1); } + + size_t IndexRightChild(size_t index) const { return (2 * index + 2); } + + void SiftDown(size_t index) { + while (IndexLeftChild(index) < Size()) { + size_t max = IndexLeftChild(index); + if (IndexRightChild(index) < Size() && + data_[IndexRightChild(index)] > data_[max]) + max = IndexRightChild(index); + if (data_[index] > data_[max]) break; + std::swap(data_[index], data_[max]); + index = max; + } + } + + void SiftUp() { + size_t index = Size() - 1; + while (index > 0 && data_[index] > data_[IndexParent(index)]) { + std::swap(data_[index], data_[IndexParent(index)]); + index = IndexParent(index); + } + } +}; diff --git a/task_04/src/test.cpp b/task_04/src/test.cpp index 5e11617e..8ecbb041 100644 --- a/task_04/src/test.cpp +++ b/task_04/src/test.cpp @@ -1,6 +1,67 @@ - #include -TEST(TopologySort, Simple) { - ASSERT_EQ(1, 1); // Stack [] +#include +#include + +#include "max_heap.hpp" + +using namespace std; + +TEST(MaxHeap_Test, Test_1) { + MaxHeap heap; + EXPECT_THROW(heap.ExtractMax(), out_of_range); + ASSERT_EQ(heap.Size(), 0); + EXPECT_TRUE(heap.Empty()); +} + +TEST(MaxHeap_Test, Test_2) { + MaxHeap heap{1, 6, 3, 8, 2}; + ASSERT_EQ(heap.ExtractMax(), 8); + ASSERT_EQ(heap.ExtractMax(), 6); + ASSERT_EQ(heap.ExtractMax(), 3); + ASSERT_EQ(heap.ExtractMax(), 2); + ASSERT_EQ(heap.ExtractMax(), 1); + EXPECT_THROW(heap.ExtractMax(), out_of_range); +} + +TEST(MaxHeap_Test, Test_3) { + vector data{1, 4, 3, 5, 0, 6}; + MaxHeap heap(data); + ASSERT_EQ(heap.ExtractMax(), 6); + ASSERT_EQ(heap.ExtractMax(), 5); + ASSERT_EQ(heap.ExtractMax(), 4); + ASSERT_EQ(heap.ExtractMax(), 3); + ASSERT_EQ(heap.ExtractMax(), 1); + ASSERT_EQ(heap.ExtractMax(), 0); + heap.Add(5); + heap.Add(7); + ASSERT_EQ(heap.ExtractMax(), 7); + ASSERT_EQ(heap.ExtractMax(), 5); +} + +TEST(MaxHeap_Test, Test_4) { + MaxHeap heap; + heap.Add(1); + heap.Add(2); + heap.Add(3); + heap.Add(4); + heap.Add(5); + ASSERT_EQ(heap.ExtractMax(), 5); + ASSERT_EQ(heap.ExtractMax(), 4); + ASSERT_EQ(heap.ExtractMax(), 3); + ASSERT_EQ(heap.ExtractMax(), 2); + ASSERT_EQ(heap.ExtractMax(), 1); +} + +TEST(MaxHeap_Test, Test_5) { + MaxHeap heap; + EXPECT_TRUE(heap.Empty()); + heap.Add(6); + ASSERT_EQ(heap.Size(), 1); + heap.Add(6); + heap.Add(6); + ASSERT_EQ(heap.Size(), 3); + ASSERT_EQ(heap.ExtractMax(), 6); + ASSERT_EQ(heap.ExtractMax(), 6); + ASSERT_EQ(heap.ExtractMax(), 6); } From 21590bee04daa873567bc4d19dab2d2f70781067 Mon Sep 17 00:00:00 2001 From: MrWh1teF0x <142975991+MrWh1teF0x@users.noreply.github.com> Date: Sun, 16 Jun 2024 22:03:25 +0000 Subject: [PATCH 10/12] complete task_09 with tests --- task_09/src/main.cpp | 3 --- task_09/src/min_amount_of_coins.cpp | 14 +++++++++++ task_09/src/min_amount_of_coins.hpp | 6 +++++ task_09/src/test.cpp | 37 ++++++++++++++++++++++++++++- 4 files changed, 56 insertions(+), 4 deletions(-) delete mode 100644 task_09/src/main.cpp create mode 100644 task_09/src/min_amount_of_coins.cpp create mode 100644 task_09/src/min_amount_of_coins.hpp diff --git a/task_09/src/main.cpp b/task_09/src/main.cpp deleted file mode 100644 index 0e4393ba..00000000 --- a/task_09/src/main.cpp +++ /dev/null @@ -1,3 +0,0 @@ -#include - -int main() { return 0; } diff --git a/task_09/src/min_amount_of_coins.cpp b/task_09/src/min_amount_of_coins.cpp new file mode 100644 index 00000000..a20f94a7 --- /dev/null +++ b/task_09/src/min_amount_of_coins.cpp @@ -0,0 +1,14 @@ +#include "min_amount_of_coins.hpp" +#include + +unsigned MinAmountOfCoins(std::vector& coins, unsigned amount) { + std::vector amounts(amount + 1, amount + 1); + amounts[0] = 0; + + for (size_t i = 1; i <= amount; ++i) + for (auto& coin : coins) + if (coin <= i) amounts[i] = std::min(amounts[i], amounts[i - coin] + 1); + + if (amounts[amount] > amount) throw std::logic_error("Impossible to collect amount from this set of coins!"); + return amounts[amount]; +} \ No newline at end of file diff --git a/task_09/src/min_amount_of_coins.hpp b/task_09/src/min_amount_of_coins.hpp new file mode 100644 index 00000000..a90fe831 --- /dev/null +++ b/task_09/src/min_amount_of_coins.hpp @@ -0,0 +1,6 @@ +#pragma once +#include +#include +#include + +unsigned MinAmountOfCoins(std::vector& coins, unsigned amount); \ No newline at end of file diff --git a/task_09/src/test.cpp b/task_09/src/test.cpp index 869094dd..350a1818 100644 --- a/task_09/src/test.cpp +++ b/task_09/src/test.cpp @@ -1,4 +1,39 @@ #include -TEST(TopologySort, Simple) { ASSERT_EQ(1, 1); } +#include +#include + +#include "min_amount_of_coins.hpp" + +using namespace std; + +TEST(MinAmountOfCoins, Test_1) { + vector coins{1, 2, 5, 10}; + ASSERT_EQ(MinAmountOfCoins(coins, 20), 2); +} + +TEST(MinAmountOfCoins, Test_2) { + vector coins{1, 2, 5, 10}; + ASSERT_EQ(MinAmountOfCoins(coins, 21), 3); +} + +TEST(MinAmountOfCoins, Test_3) { + vector coins{1, 3, 5, 7}; + ASSERT_EQ(MinAmountOfCoins(coins, 18), 4); +} + +TEST(MinAmountOfCoins, Test_4) { + vector coins{3, 5, 7}; + EXPECT_THROW(MinAmountOfCoins(coins, 2), std::logic_error); +} + +TEST(MinAmountOfCoins, Test_5) { + vector coins{1, 2, 4, 5}; + ASSERT_EQ(MinAmountOfCoins(coins, 8), 2); +} + +TEST(MinAmountOfCoins, Test_6) { + vector coins{1, 2, 5, 10}; + ASSERT_EQ(MinAmountOfCoins(coins, 28), 5); +} \ No newline at end of file From 75be983fd5d4b1bd7bf6a4297314a792cccf91fd Mon Sep 17 00:00:00 2001 From: MrWh1teF0x <142975991+MrWh1teF0x@users.noreply.github.com> Date: Mon, 17 Jun 2024 02:21:51 +0000 Subject: [PATCH 11/12] complete task_08 with tests --- task_08/src/hash_table.hpp | 145 +++++++++++++++++++++++++++++++++++++ task_08/src/main.cpp | 3 - task_08/src/test.cpp | 37 +++++++++- 3 files changed, 179 insertions(+), 6 deletions(-) create mode 100644 task_08/src/hash_table.hpp delete mode 100644 task_08/src/main.cpp diff --git a/task_08/src/hash_table.hpp b/task_08/src/hash_table.hpp new file mode 100644 index 00000000..68f1bc33 --- /dev/null +++ b/task_08/src/hash_table.hpp @@ -0,0 +1,145 @@ +#pragma once +#include + +#include +#include +#include + +using namespace std; + +template +class HashTable { + public: + HashTable() : size_{0}, states_size_{0}, buffer_size_{8} { + data_ = vector(buffer_size_); + states_ = vector(buffer_size_, State::Free); + } + + HashTable(const std::initializer_list &data) + : size_{data.size()}, states_size_{data.size()}, buffer_size_{8} { + data_ = data; + states_ = vector(buffer_size_, State::Occupied); + } + + void Insert(T value); + + void Remove(T value); + + bool Contains(T value); + + void Clear(); + + size_t Size() const { return size_; } + + bool Empty() const { return size_ == 0; } + + private: + constexpr static const double hash_coef = 0.74920592; + constexpr static const double rehash_coef = 0.6; + + enum class State { Deleted, Occupied, Free }; + + size_t buffer_size_; + size_t size_; + size_t states_size_; + + vector data_; + vector states_; + + size_t FirstHashFunction(T key); + size_t SecondHashFunction(T key); + + void Resize(); + + void Rehash(); +}; + +template +void HashTable::Insert(T value) { + size_t hash = FirstHashFunction(value) % buffer_size_; + size_t counter = 0; + + while (states_[hash] == State::Occupied) { + if (data_[hash] == value) return; + counter++; + hash = (FirstHashFunction(value) + counter * SecondHashFunction(value)) % + buffer_size_; + } + + data_[hash] = value; + states_[hash] = State::Occupied; + states_size_++; + size_++; + + double states_coefficient = double(states_size_) / double(buffer_size_); + if (states_coefficient >= rehash_coef) Rehash(); +} + +template +void HashTable::Remove(T value) { + size_t hash = FirstHashFunction(value) % buffer_size_; + size_t counter = 0; + + while (states_[hash] != State::Free) { + if (data_[hash] == value && states_[hash] == State::Occupied) { + states_[hash] = State::Deleted; + size_--; + break; + } + if (data_[hash] == value && states_[hash] == State::Deleted) break; + + counter++; + hash = (FirstHashFunction(value) + SecondHashFunction(value) * counter) % + buffer_size_; + } +} + +template +bool HashTable::Contains(T value) { + size_t hash = FirstHashFunction(value) % buffer_size_; + size_t counter = 0; + + while (states_[hash] != State::Free) { + if (data_[hash] == value && states_[hash] == State::Occupied) return true; + counter++; + hash = (FirstHashFunction(value) + counter * SecondHashFunction(value)) % + buffer_size_; + } + return false; +} + +template +void HashTable::Clear() { + states_size_ = 0; + size_ = 0; + for (auto &cell : states_) cell = State::Free; +} + +template +size_t HashTable::FirstHashFunction(T key) { + return floor(buffer_size_ * + ((double(key) * hash_coef) - floor(double(key) * hash_coef))); +} + +template +size_t HashTable::SecondHashFunction(T key) { + return int(key * buffer_size_ - 1) % (buffer_size_); +} + +template +void HashTable::Resize() { + buffer_size_ *= 2; + data_.resize(buffer_size_); + states_.resize(buffer_size_); +} + +template +void HashTable::Rehash() { + vector sub_data; + for (size_t i = 0; i < buffer_size_; i++) + if (states_[i] == State::Occupied) sub_data.push_back(data_[i]); + + Resize(); + Clear(); + for (auto &elem : sub_data) Insert(elem); +} diff --git a/task_08/src/main.cpp b/task_08/src/main.cpp deleted file mode 100644 index 0e4393ba..00000000 --- a/task_08/src/main.cpp +++ /dev/null @@ -1,3 +0,0 @@ -#include - -int main() { return 0; } diff --git a/task_08/src/test.cpp b/task_08/src/test.cpp index 5e11617e..26261751 100644 --- a/task_08/src/test.cpp +++ b/task_08/src/test.cpp @@ -1,6 +1,37 @@ - #include -TEST(TopologySort, Simple) { - ASSERT_EQ(1, 1); // Stack [] +#include +#include + +TEST(HashTable_Test, Test_1) { + HashTable table; + table.Insert(1); + ASSERT_TRUE(table.Contains(1)); + ASSERT_FALSE(table.Contains(2)); + table.Remove(1); + ASSERT_FALSE(table.Contains(1)); +} + +TEST(HashTable_Test, Test_2) { + HashTable table; + table.Insert(2); + table.Insert(5); + table.Insert(7); + ASSERT_TRUE(table.Contains(2)); + ASSERT_TRUE(table.Contains(5)); + ASSERT_TRUE(table.Contains(7)); + ASSERT_EQ(table.Size(), 3); + table.Clear(); + ASSERT_TRUE(table.Empty()); +} + +TEST(HashTable_Test, Test_3) { + HashTable table; + table.Insert(10); + table.Insert(20); + table.Insert(30); + ASSERT_TRUE(table.Contains(10)); + ASSERT_FALSE(table.Contains(40)); + table.Clear(); + ASSERT_EQ(table.Size(), 0); } From b544a6bb4b2bfb52e26295a8a88c104d2ee9037f Mon Sep 17 00:00:00 2001 From: MrWh1teF0x <142975991+MrWh1teF0x@users.noreply.github.com> Date: Mon, 17 Jun 2024 13:03:54 +0000 Subject: [PATCH 12/12] complete task_07 with tests --- task_07/src/avl_tree.hpp | 166 +++++++++++++++++++++++++++++++++++++++ task_07/src/main.cpp | 3 - task_07/src/test.cpp | 62 ++++++++++++++- 3 files changed, 225 insertions(+), 6 deletions(-) create mode 100644 task_07/src/avl_tree.hpp delete mode 100644 task_07/src/main.cpp diff --git a/task_07/src/avl_tree.hpp b/task_07/src/avl_tree.hpp new file mode 100644 index 00000000..004e0c93 --- /dev/null +++ b/task_07/src/avl_tree.hpp @@ -0,0 +1,166 @@ +#include +#include +#include + +template +struct Node { + explicit Node(T k) : key{k}, left{nullptr}, right{nullptr}, height{1} {} + T key; + size_t height; + Node* left; + Node* right; +}; + +template +class AVLTree { + public: + AVLTree() : root_{nullptr} {} + + void Insert(T value); + + void Remove(T value); + + bool Contains(T value) const; + + private: + Node* root_; + + Node* Insert(Node* node, T value); + + Node* Remove(Node* node, T value); + + bool Contains(const Node* node, T value) const; + + Node* Balance(Node* node); + + Node* FindMin(Node* node) const; + + Node* RemoveMin(Node* node); + + Node* LeftRotate(Node* node); + + Node* RightRotate(Node* node); + + size_t Height(Node* node) const; + + void UpdateHeight(Node* node); + + int Difference(Node* node) const; +}; + +template +void AVLTree::Insert(T value) { + root_ = Insert(root_, value); +} + +template +void AVLTree::Remove(T value) { + root_ = Remove(root_, value); +} + +template +bool AVLTree::Contains(T value) const { + return Contains(root_, value); +} + +template +Node* AVLTree::Insert(Node* node, T value) { + if (!node) return new Node(value); + if (value < node->key) + node->left = Insert(node->left, value); + else if (value > node->key) + node->right = Insert(node->right, value); + return Balance(node); +} + +template +Node* AVLTree::Remove(Node* node, T value) { + if (!node) return nullptr; + if (value < node->key) + node->left = Remove(node->left, value); + else if (value > node->key) + node->right = Remove(node->right, value); + else if (value == node->key) { + Node* new_node_1 = node->left; + Node* new_node_2 = node->right; + delete node; + if (!new_node_2) return new_node_1; + Node* min = FindMin(new_node_2); + min->right = RemoveMin(new_node_2); + min->left = new_node_1; + return Balance(min); + } + return Balance(node); +} + +template +bool AVLTree::Contains(const Node* node, T value) const { + if (!node) return false; + if (value < node->key) return Contains(node->left, value); + if (value > node->key) return Contains(node->right, value); + return true; +} + +template +Node* AVLTree::Balance(Node* node) { + UpdateHeight(node); + if (Difference(node) == 2) { + if (Difference(node->right) < 0) node->right = RightRotate(node->right); + return LeftRotate(node); + } + if (Difference(node) == -2) { + if (Difference(node->left) > 0) node->left = LeftRotate(node->left); + return RightRotate(node); + } + return node; +} + +template +Node* AVLTree::FindMin(Node* node) const { + if (!node->left) return node; + return FindMin(node->left); +} + +template +Node* AVLTree::RemoveMin(Node* node) { + if (!node->left) return node->right; + node->left = RemoveMin(node->left); + return Balance(node); +} + +template +Node* AVLTree::LeftRotate(Node* node) { + Node* new_node = node->right; + node->right = new_node->left; + new_node->left = node; + UpdateHeight(node); + UpdateHeight(new_node); + return new_node; +} + +template +Node* AVLTree::RightRotate(Node* node) { + Node* new_node = node->left; + node->left = new_node->right; + new_node->right = node; + UpdateHeight(node); + UpdateHeight(new_node); + return new_node; +} + +template +size_t AVLTree::Height(Node* node) const { + return node ? node->height : 0; +} + +template +void AVLTree::UpdateHeight(Node* node) { + size_t left_height = Height(node->left); + size_t right_height = Height(node->right); + node->height = std::max(left_height, right_height) + 1; +} + +template +int AVLTree::Difference(Node* node) const { + return Height(node->right) - Height(node->left); +} diff --git a/task_07/src/main.cpp b/task_07/src/main.cpp deleted file mode 100644 index 0e4393ba..00000000 --- a/task_07/src/main.cpp +++ /dev/null @@ -1,3 +0,0 @@ -#include - -int main() { return 0; } diff --git a/task_07/src/test.cpp b/task_07/src/test.cpp index 5e11617e..95f7fdc4 100644 --- a/task_07/src/test.cpp +++ b/task_07/src/test.cpp @@ -1,6 +1,62 @@ - +#include #include -TEST(TopologySort, Simple) { - ASSERT_EQ(1, 1); // Stack [] +#include "avl_tree.hpp" + +TEST(AVLTree_Test, Test_1) { + AVLTree tree; + + tree.Insert(1); + ASSERT_TRUE(tree.Contains(1)); + tree.Insert(3); + ASSERT_TRUE(tree.Contains(3)); + ASSERT_FALSE(tree.Contains(5)); +} + +TEST(AVLTree_Test, Test_2) { + AVLTree tree; + + tree.Insert(20); + ASSERT_TRUE(tree.Contains(20)); + tree.Remove(20); + ASSERT_FALSE(tree.Contains(20)); +} + +TEST(AVLTree_Test, Test_3) { + AVLTree tree; + + tree.Insert(10); + tree.Remove(30); + ASSERT_TRUE(tree.Contains(10)); + ASSERT_FALSE(tree.Contains(30)); + tree.Remove(10); + ASSERT_FALSE(tree.Contains(10)); +} + +TEST(AVLTree_Test, Test_4) { + AVLTree tree; + + tree.Insert(60000000); + tree.Insert(40000000); + tree.Insert(20000000); + ASSERT_TRUE(tree.Contains(20000000)); + ASSERT_TRUE(tree.Contains(40000000)); + ASSERT_TRUE(tree.Contains(60000000)); + ASSERT_FALSE(tree.Contains(10000000)); + ASSERT_FALSE(tree.Contains(30000000)); + ASSERT_FALSE(tree.Contains(50000000)); +} + +TEST(AVLTree_Test, Test_5) { + AVLTree tree; + + tree.Insert(10000000); + tree.Insert(30000000); + tree.Insert(50000000); + ASSERT_TRUE(tree.Contains(10000000)); + ASSERT_TRUE(tree.Contains(30000000)); + ASSERT_TRUE(tree.Contains(50000000)); + ASSERT_FALSE(tree.Contains(20000000)); + ASSERT_FALSE(tree.Contains(40000000)); + ASSERT_FALSE(tree.Contains(60000000)); }