From c75abf3ea1f7956c3d1fb8788891febd22e6fb85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dobos=20=C3=81d=C3=A1m?= Date: Mon, 12 Dec 2022 01:31:28 +0100 Subject: [PATCH] Day11 --- day11/input.txt | 77 ++++++++++++++++++++++++++ day11/monkeys | Bin 0 -> 16272 bytes day11/monkeys.c | 144 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 221 insertions(+) create mode 100644 day11/input.txt create mode 100755 day11/monkeys create mode 100644 day11/monkeys.c diff --git a/day11/input.txt b/day11/input.txt new file mode 100644 index 0000000..1eedc56 --- /dev/null +++ b/day11/input.txt @@ -0,0 +1,77 @@ +8 +6 +99 +63 +76 +93 +54 +73 +0 1 11 +2 +7 +1 +4 +91 +60 +97 +54 +0 0 1 +17 +3 +2 +1 +65 +0 0 7 +7 +6 +5 +2 +84 +55 +0 0 3 +11 +2 +6 +5 +86 +63 +79 +54 +83 +0 1 0 +19 +7 +0 +7 +96 +67 +56 +95 +64 +69 +96 +0 0 4 +5 +4 +0 +8 +66 +94 +70 +93 +72 +67 +88 +51 +0 1 5 +13 +4 +5 +3 +59 +59 +74 +0 0 8 +3 +1 +3 diff --git a/day11/monkeys b/day11/monkeys new file mode 100755 index 0000000000000000000000000000000000000000..a89c2b38a3b25bd3ff2c88416e6c4351f838006a GIT binary patch literal 16272 zcmeHOdvH|M89%!OhzM-JPCV|u}C)~qnrNT#nlHF9Ql%Q9cuwcq9BuaK8m1AQ~2~$yJ@?rr-0&#HJ#IiHjh zIu@&ZI_W&fs4#WfH7h$OU2B>NrWAw9?Wc^;rNrB!>_T4YMmXtm6BbN4-j`uVdHJ-3 zPxDq4Z>00krt;5JrB}?2Mj95?&W(oVL?f|O+nlz=i{>n<^(EuJ`LYSrE-wxmQ|oWr zCg7%*FqKB(?l5`wN3v=qC;hj7w`JiUA9?lQ`S6)X-ana0J-*|f-K0b9CL7YBLjHJ& z5Kr~-I7r9L$4=BtjOg+3>n%h_DvKeQTtax|2>1_xdrRnV8bSZ=5%8K3@Eb66mTmWV{LE?2i*cQ+mBe6gVG8l+8f`>tHhaPO+p*IF1QPG-+#EeEk zzGx^d66-f^SiMG{@4MNm)mpU$#p-aoW$ z3`dDh#iyo6E~6Naf~UgQJ-*)XN$OVDHO70@{id=`nhD04Ke5upY0Pt52{~!QdF~ND zV8huL;b(35g2Z(2;ApK^N4Cdc06bjvvr-jjA{irFMOED4d=DYS?$HYt<+u|8l}08YRAtT)o|cf z4k`;L8)d)Qp7P(Zg2WD6-neJ|93J%|JD`v!gtuY_uubSupJ(s$r5 z3G?)mhL)A6mfPaeGP_B^^W5&uAYD}*2Z)aIq?@7Fd4SBuc)q<9Oji2Pa@A=WBscmg zJbGj++**&8oAN`{HCO*Fg_Bxt_ZAq*;JFDa3D3NaCOuD91Iy5^Y+5SxXpvqGV~?6! zP0h`u+hACf_DgA2qE^RV`52lere*vcX2)oR=O4#k1g|d!KZHjGd+>v>H4SJA=954llJMSAB%qC?VG&)q$N3ANR}nHY22vd}O-GM>b92I|p1DSuxpkuO~eO$7X1n zZTURM$?aQCp~*w8i+&X{tKGF!#rfNS@s?XizbRNL9QqIUf+lMIN0zJZ>y?p~o6v`+ zCwtcqTShdSPq(NrHx(^*J1icvENH%;UZyPO6)l1e3mq2PPV@vS#q)C7)lD54K0GT( zwKzNni0?|%$TP=Z!IQp&65Z$TqI27qz7rx;#Od0stYgqc?BfGtFWVve-=k%>b!nbw z4qFvr}{wnHCpMMXz?n~1wq+0$A#z$Yenb~b}^pmtiSS{OK zM_xJ)VJ^vPRyz8m>Y=Q32|>1kTDNy3#eOYk4uGtGua_rYU0PkUdW zUT7bk(=z?Iu6fcggB>wgwnL5rXF_we?$2uC>esSeaw-+ukm{mFWGY_26lZcysmzk! z{7V<^h#Z`sts^B(F0~^gI&*fUQ;r0TOB!QZu)mm`W44Q)=EB)DuT4u1c^+=Zj3_EP zM!(i473su}sPh8l(7KX#4B<*8hpII{Xo!1uxe=#R&Jown12k1UU&QVF(cjaY?elk2 z2+$s)ed#FVRLj4MKUv9sa^z!NbjV4v#NVCtVT5*LEcaYgJLB&@ed|TFmiT*;*IrcX z!tvC+rOsrIVs+4iYo2w%UH=i~gJf2si1F;2fWNXco@e|$nl${n-EbldHNID24*#Q2 zkas~`p@u@*jn(oFZj2sy6M~lyTetYkH-@xK>MT5;)jE4CvLfA^x`jBZ8JC+i44Tsw z1_&zug)P?Y9+Ck<_y=>(_^*1Ui7?h*I~Kdlj~D!MM`6# zT*?_JXP}&cat8j_4A7gO*%2{2nga34|6)@-wjR|VQxs*Q%tY5p6QTEG zRQ8(0dd}lLaI_zlidO-QZ&wZBcK1pxA$X4*$G=A5toQGN*+1k}LUZqzMmf2dLyUWIo!@C6FzdBpk~P;rUrqN>hB_&n1tYnS+(H7`u55D%b2 zae2Qg<6TmJinXtm@uyHJ)&7zC^{n($Et)^i9*VS-pWjOTD}{5M9Ft~OSo`SN%iB_a zsx{vjKZi=GebR0uq!d0AxR;G>G%Imjb?R&&s>^^^iD_1zS-KkdWcMV&*DJ;~!kMwr z;0XA=Bj6d}6xZ1vdS_qC|I@&|ws>6K4}6k)n&A1s_))^ilQODMf;WJd@;@*F?#6|$ z3gd8U9eXzEccgxm_1%s9O$(y2(4P#8GwK2_e_I0XQGTlGOnd%2L+M|p8YO?Lg3t?` z`sLKW3AmSyZFC**SvH=l0pOF}wA>&<~!h`uA(uo;%2 zNK8*9!y)zYgTs2*Ck~eEW`UCt67kk>B4E%52@T1lYJ~h;Lf7%Z0w#Ztc31U1KKw?Pf52tMhFgcP)D z^@ce#RHb@zAlWQ@q4pR;nAAv^l6%96WF#IN#^{hG!qEU3s9I~(5I)&VAF95lI9RGA z!$ILQ!fjw_>_R&(&$ut#tVU~d2;P`8eVD`6wBR~I1zI9-W|||#!iV|Nf@v^(GG01I z>qcCPaPKqARCS+b%IiiYmbzRg`UM=cR%3hGaYTjbJd?Hl^7@Q{MX1>Ao0UCN`hDMC z_&UrO-RJH0yv|_iWkp4u_Fn;xm*sJ8Kd*GdQ2aLJ*|zI=k+nuEh>_; z{oH^YDwI>U=k+?%UZu$Ko&Ep5vR|$Ayc7t9>0XnS?~*8IPWvZ;QBK&ub)QoAD}F9g zZe&}zPV@;Jc6+a~W7LL&;g!Z<#!H>;GrQ=ekl%On+FsaqnpztKX>3ftSMHTG<}bsS#}n5!Y9B{H{% lufH@sxa~G`q1BpPlfya3WnG$XrR<-f8ym`Whk=6?{{ +#include +#include + +#define BUFFER_SIZE 64 +#define MONKEY_MAX_STASH 100 +#define substitute(w, o) (o == 0 ? w : o) + +enum stage { + INIT, + ITEM_COUNT, + ITEMS, + OPERATION, + TEST, + THROW_TRUE, + THROW_FALSE +}; + +typedef struct monkey { + unsigned long stash[MONKEY_MAX_STASH]; + unsigned long stash_size; + int test; + int throw_true; + int throw_false; + int operation[3]; + unsigned long throw_count; +} MONKEY; + +unsigned long operate(unsigned long, int*); + +int main() { + char buf[BUFFER_SIZE], *p, c; + memset(buf, 0, BUFFER_SIZE); + p = buf; + + enum stage currentStage = INIT; + + MONKEY *monkeys, *currentMonkey; + int monkeyCount, itemRemaining; + + while ((c = getchar()) != EOF) { + *p++ = c; + if (c == '\n') { + switch (currentStage) { + case INIT: + sscanf(buf, "%i", &monkeyCount); + monkeys = (MONKEY*)malloc(monkeyCount*sizeof(MONKEY)); + memset(monkeys, 0, monkeyCount*sizeof(MONKEY)); + currentMonkey = monkeys; + currentStage = ITEM_COUNT; + break; + case ITEM_COUNT: + sscanf(buf, "%i", &itemRemaining); + currentStage = ITEMS; + break; + case ITEMS: + sscanf(buf, "%lu", ¤tMonkey->stash[currentMonkey->stash_size]); + currentMonkey->stash_size++; + itemRemaining--; + if (itemRemaining == 0) { + currentStage = OPERATION; + } + break; + case OPERATION: + sscanf(buf, "%i %i %i", ¤tMonkey->operation[0], ¤tMonkey->operation[1], ¤tMonkey->operation[2]); + currentStage = TEST; + break; + case TEST: + sscanf(buf, "%i", ¤tMonkey->test); + currentStage = THROW_TRUE; + break; + case THROW_TRUE: + sscanf(buf, "%i", ¤tMonkey->throw_true); + currentStage = THROW_FALSE; + break; + case THROW_FALSE: + sscanf(buf, "%i", ¤tMonkey->throw_false); + currentMonkey++; + currentStage = ITEM_COUNT; + break; + } + + memset(buf, 0, BUFFER_SIZE); + p = buf; + } + } + + unsigned long simplifier = 1; + for (int j = 0; j < monkeyCount; j++) { + simplifier *= monkeys[j].test; + } + + unsigned long worry, sumItems; + // Play 20 rounds with tha monkeys + for (int i = 0; i < 10000; i++) { + sumItems = 0; + // Each monkeys + for (int j = 0; j < monkeyCount; j++) { + // Each item + for (int k = 0; k < monkeys[j].stash_size; k++) { + monkeys[j].throw_count++; + worry = monkeys[j].stash[k]; + worry = operate(worry, monkeys[j].operation); + // Don't you worry child + // worry /= 3; + if (worry % monkeys[j].test == 0) { + monkeys[monkeys[j].throw_true].stash[monkeys[monkeys[j].throw_true].stash_size] = worry % simplifier; + monkeys[monkeys[j].throw_true].stash_size++; + } else { + monkeys[monkeys[j].throw_false].stash[monkeys[monkeys[j].throw_false].stash_size] = worry % simplifier; + monkeys[monkeys[j].throw_false].stash_size++; + } + } + monkeys[j].stash_size = 0; + memset(monkeys[j].stash, 0, MONKEY_MAX_STASH*sizeof(unsigned long)); + } + // Everything was thrown + } + + unsigned long max1 = 0, max2 = 0; + for (int i = 0; i < monkeyCount; i++) { + if (monkeys[i].throw_count > max1) { + max2 = max1; + max1 = monkeys[i].throw_count; + } else if (monkeys[i].throw_count > max2) { + max2 = monkeys[i].throw_count; + } + printf("Monkey %i throw count: %lu\n", i, monkeys[i].throw_count); + } + + printf("\nMonkey business: %lu\n", max1 * max2); + + free(monkeys); +} + +unsigned long operate(unsigned long worry, int* operation) { + if (operation[1] == 0) { + return substitute(worry, operation[0]) + substitute(worry, operation[2]); + } else if (operation[1] == 1) { + return substitute(worry, operation[0]) * substitute(worry, operation[2]); + } + + return -1; +}