From 9d0085321d22cbaa54f3c32cabddacbe5dfc8bd0 Mon Sep 17 00:00:00 2001 From: dobiadi Date: Fri, 13 Dec 2024 14:25:51 +0100 Subject: [PATCH] Day11 --- day11/c/day11 | Bin 0 -> 16000 bytes day11/c/day11.c | 131 +++++++++++++++++++++++++++++++++++++++++++++++ day11/input.txt | 1 + day11/sample.txt | 1 + 4 files changed, 133 insertions(+) create mode 100755 day11/c/day11 create mode 100644 day11/c/day11.c create mode 100644 day11/input.txt create mode 100644 day11/sample.txt diff --git a/day11/c/day11 b/day11/c/day11 new file mode 100755 index 0000000000000000000000000000000000000000..0417e22dd75d881046fbd35f62a7c504fc9dfb32 GIT binary patch literal 16000 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 +#include +#include +#include + +#define MAX_CHARS 1024 +#define MAX_INITIAL_STONES 1024 +#define MAX_LEAF_COUNT 16 + +typedef struct stone { + uint64_t value; + struct stone *prev; + struct stone *next; +} stone_t; + +void deallocate_ll(stone_t *leaf); +void iterate_ll(stone_t *, 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; + + buf = calloc(MAX_CHARS, sizeof(buf[0])); + p = buf; + + while ((c = getchar()) != EOF) { + *p++ = c; + } + + size_t in = p - buf; + + int stone_count = 0; + uint64_t *stones = calloc(MAX_INITIAL_STONES, sizeof(stones[0])); + for (size_t i = 0; i < in;) { + p = buf + i; + sscanf(p, "%lu", &stones[stone_count++]); + + do { + i++; + } while(i < in && *(buf+i) != ' '); + i++; + } + + stone_t *head; + + for (int i = 0; i < stone_count; i++) { + stone_t *stone = calloc(1, sizeof(stone[0])); + stone->value = stones[i]; + if (i == 0) { + head = stone; + continue; + } + 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); +} + +void deallocate_ll(stone_t *leaf) { + if (leaf == NULL) { + return; + } + stone_t* next = leaf->next; + free(leaf); + deallocate_ll(next); +} + +void iterate_ll(stone_t *leaf, void (*cb)(stone_t*, void*), void* ctx) { + if (leaf == NULL) { + return; + } + + cb(leaf, ctx); + iterate_ll(leaf->next, cb, ctx); +} + +void blink(stone_t *leaf, void* ctx) { + if (leaf->value == 0) { + leaf->value = 1; + } else { + // Split in two + char buf[64]; + sprintf(buf, "%lu", leaf->value); + size_t len = strlen(buf); + if (len % 2 == 0) { + char left[32]; + memcpy(left, buf, len / 2); + left[len / 2] = '\0'; + char right[32]; + memcpy(right, buf + len / 2, len / 2); + right[len / 2] = '\0'; + stone_t *left_stone = calloc(1, sizeof(left_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; + } else { + leaf->value *= 2024; + } + } +} + +void count(stone_t *leaf, void* ctx) { + (*(uint64_t*)ctx)++; +} diff --git a/day11/input.txt b/day11/input.txt new file mode 100644 index 0000000..bbc2705 --- /dev/null +++ b/day11/input.txt @@ -0,0 +1 @@ +112 1110 163902 0 7656027 83039 9 74 diff --git a/day11/sample.txt b/day11/sample.txt new file mode 100644 index 0000000..9b26c84 --- /dev/null +++ b/day11/sample.txt @@ -0,0 +1 @@ +125 17