From 320ec7894995e9a05b98795e365560d4bb68b08c Mon Sep 17 00:00:00 2001 From: dobiadi Date: Fri, 13 Dec 2024 15:56:59 +0100 Subject: [PATCH] Day11 tree --- day11/c/day11 | Bin 16000 -> 16264 bytes day11/c/day11.c | 109 +++++++++++++++++++++++------------------------- 2 files changed, 52 insertions(+), 57 deletions(-) diff --git a/day11/c/day11 b/day11/c/day11 index 0417e22dd75d881046fbd35f62a7c504fc9dfb32..b1c6e4d2d7bb9a3b39ba6c19e1c31f7c825163c9 100755 GIT binary patch literal 16264 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 MIKO{k`AYr&0<1Da*8l(j delta 3644 zcmZu!3vd(18QwdcWJ$J9l3$VuVA+U_%|o`pHW)w98DmyKv~GBW6bQJ+j@2kJ1*vU1 zO(jM+@kNN(?4(U+O4D?hj46H4&{sMwC>WcNVKOA8j1$tq4T*ckJVG!866p2cdl>L^ zXYRiJ-~aym?`hQ&i$B-v$~lySl;Kwap+$XjUbp(q8rR(Sq1XDdNu^#kksQWb_%@@G zIwHGDGo+6xvcy@H>LoiFXYt5t7Ete`c{^Y=h58VGa_uYZ$LGm+0X(12JXjFAEZWPy?^W3yWrX3J%+HAr-X+RBLwT=M-j6Epzbewl>71Ud!k(0*dG0pUeM_1w2+0y*$XrsdiBg`k;?c*u8PB2dG(B2 zG(PsLa-EM!v3XgcPEpzLQdNUiIFmeQb{1x-4CSp?!Uz;keq(-#v5j7iOt9v{_RBc6 zp2dk{W=b4NZuDd=_k98~+;(m}yH`n491PTa6cLWNXmWIY(%^q(d1W#$Hi|_%q!;-B zix)d=MNKrvvpD&v9e2MUoluRN?O5Dq1`pArLGcT4E@7|^in8Pf#NC%8-un{7;`n`3 zM=uu7`)*3r&|5gU0oci`_TPCjjy_5%x&i(bWv<1Sx%!zN*) zut|7A*gSBrnw+i3kBC3#p_Xf)E$5HVLulfj7`%tzOMp|xZ&9eZ70Jg*2fhfdYkDEd_k$ibZH>^?YjIWy+o1p^daxE3ese?X^L{4|mcopTllIlmL$QX51c zGM<@79J%E&oLuBfLu{Od(AcYYWcj{=(u8rh9GSHmi(lzs#q+ebQWL1s0$<$#3BguQ zrUm-7!kU0Mu@;N}q=pYTgnZ6p@rodyQFmzmx#$&ItpTXF(xqtN0e%0yld`gUMJKFgtq1A>aFn(OcqsaNKe7huJ6qMm3+e zY`+pnRTg08;@Et}_&&pjsiFS8L3&`fqBbS4L1EIs#Fp=wz6bJ^KDzxt`}N|4i5WoX z@b8@8Fu!3fW%jx=*16H_a1_lBSt(kft5w+)^N;FVEEGjC6@8+mi{0GbEnZg|X)g+OI1 zc>8X)DaN~=H#G6?1h|O00X*ATGY3pXvV`#$4Ow>Z13g*bU&iVc-3JD!(_9F#UfwrhUM-gT8)$&@J}E zgho81-B0w6`ZeXVHl$Zn*MCFNMo58Je=of+knby)onn^`2*etO@C^2p46hGX*a@9S{X1*qs)kdl;%9uYB%teRT*E0SqWWV z;ak)bo2B-(;!Aye$}i?q3lM zG%nk`z`MX(MQ&BD&e$5-u`S&CENQQ*B7dxMlWSEzYbesby*1LlIUFX%)lZRh^@8lJ z?XBT(SDVT`e69L1hW6@Vym$-4bdm!#<&GAu<8-`0in&~Jr)IjNQackm&Lm|^%4g^& zMaLFxY4kubB)VjlwO_M?qxH)r)srVqKY4HvFE06!xmU9zj#?*qq1KV3S6s(IBl%UW z*Q&Q;PXYP3wwWm)Wp(8a{VeGiBq88-x>cV#ZXpNi%E|hAJCW)tEc*R?m=xD9a_FaY z@{bk?)yJ6iWURj2qW7|&6gMog=zHBlS{s(aH|4d4rTIM-YNYQQRGbcAA~zc5T9pqv WP@@c)v$WbeTBRx!Fyz~dXZ{a?5^%!+ diff --git a/day11/c/day11.c b/day11/c/day11.c index ba416b3..9026f59 100644 --- a/day11/c/day11.c +++ b/day11/c/day11.c @@ -2,6 +2,7 @@ #include #include #include +#include #define MAX_CHARS 1024 #define MAX_INITIAL_STONES 1024 @@ -9,18 +10,14 @@ typedef struct stone { uint64_t value; - struct stone *prev; - struct stone *next; + struct stone *leafs[2]; + int leaf_count; } stone_t; -void deallocate_ll(stone_t *leaf); -void iterate_ll(stone_t *, void (*cb)(stone_t*, void*), void* ctx); +void add_leaf(stone_t* root, stone_t* leaf); +uint64_t call_on_leaf(stone_t *leaf, void (*cb)(stone_t*, void*), void* ctx); -void display(stone_t *stone, void* ctx) { - printf("%lu ", stone->value); -} void blink(stone_t *leaf, void* ctx); -void count(stone_t *leaf, void* ctx); int main() { char c, *p, *buf; @@ -46,59 +43,62 @@ int main() { i++; } - stone_t *head; + free(buf); - for (int i = 0; i < stone_count; i++) { + //call_on_leaf(root, display, NULL); + //printf("\n"); + uint64_t sum = 0; +#pragma omp parallel for + for (int j = 0; j < stone_count; j++) { + int blink_count = 75; stone_t *stone = calloc(1, sizeof(stone[0])); - stone->value = stones[i]; - if (i == 0) { - head = stone; - continue; + stone->value = stones[j]; + uint64_t s = call_on_leaf(stone, blink, &blink_count); +#pragma omp critical + { + sum += s; } - stone_t *tmp = head; - while(tmp->next != NULL) tmp = tmp->next; - tmp->next = stone; - stone->prev = tmp; } free(stones); - free(buf); - int blink_count = 75; - for (int i = 0; i < blink_count; i++) { - iterate_ll(head, blink, NULL); - while(head->prev != NULL) head = head->prev; - printf("%i\n", i); - } - uint64_t cnt = 0; - iterate_ll(head, count, &cnt); - - printf("%lu\n", cnt); - - deallocate_ll(head); + printf("%lu\n", sum); } -void deallocate_ll(stone_t *leaf) { - if (leaf == NULL) { - return; - } - stone_t* next = leaf->next; - free(leaf); - deallocate_ll(next); +void add_leaf(stone_t* root, stone_t* leaf) { + root->leafs[root->leaf_count++] = leaf; } -void iterate_ll(stone_t *leaf, void (*cb)(stone_t*, void*), void* ctx) { - if (leaf == NULL) { - return; - } - +uint64_t call_on_leaf(stone_t *leaf, void (*cb)(stone_t*, void*), void* ctx) { + //printf("%lu\n", leaf->value); cb(leaf, ctx); - iterate_ll(leaf->next, cb, ctx); + + if (*(int*)ctx == 0) { + for (int i = 0; i < leaf->leaf_count; i++) { + free(leaf->leafs[i]); + } + free(leaf); + return 1; + } + + uint64_t sum = 0; + + (*(int*)ctx)--; + for (int i = 0; i < leaf->leaf_count; i++) { + sum += call_on_leaf(leaf->leafs[i], cb, ctx); + } + (*(int*)ctx)++; + + free(leaf); + + return sum; } void blink(stone_t *leaf, void* ctx) { if (leaf->value == 0) { - leaf->value = 1; + stone_t *next = calloc(1, sizeof(next[0])); + next->value = 1; + add_leaf(leaf, next); } else { // Split in two char buf[64]; @@ -112,20 +112,15 @@ void blink(stone_t *leaf, void* ctx) { memcpy(right, buf + len / 2, len / 2); right[len / 2] = '\0'; stone_t *left_stone = calloc(1, sizeof(left_stone[0])); + stone_t *right_stone = calloc(1, sizeof(right_stone[0])); sscanf(left, "%lu", &left_stone->value); - sscanf(right, "%lu", &leaf->value); - if (leaf->prev) { - left_stone->prev = leaf->prev; - leaf->prev->next = left_stone; - } - leaf->prev = left_stone; - left_stone->next = leaf; + sscanf(right, "%lu", &right_stone->value); + add_leaf(leaf, left_stone); + add_leaf(leaf, right_stone); } else { - leaf->value *= 2024; + stone_t *next = calloc(1, sizeof(next[0])); + next->value = leaf->value * 2024; + add_leaf(leaf, next); } } } - -void count(stone_t *leaf, void* ctx) { - (*(uint64_t*)ctx)++; -}