#include "allocator.h" #include "aoc.h" #include "dvec_s.h" #include "util.h" #include #include static void deck_cut(struct dvec *deck, struct dvec *table, ssize_t in) { int *src, *dst; size_t i, split, n; n = deck->len; split = in < 0 ? (size_t) ((ssize_t) deck->len + in) : (size_t) in; src = deck->data; dst = table->data; for (i = 0; i < split; i++) dst[i + n - split] = src[i]; for (i = split; i < n; i++) dst[i - split] = src[i]; dvec_swap(deck, table); } static void deal_increment(struct dvec *deck, struct dvec *table, size_t inc) { int *src, *dst; size_t i, n, p; n = deck->len; src = deck->data; dst = table->data; p = 0; for (i = 0; i < n; i++) { dst[p] = src[i]; p = (p + inc) % n; } dvec_swap(deck, table); } static void deal_new_stack(struct dvec *deck, struct dvec *table) { int *src, *dst; size_t i, n; n = deck->len - 1; src = deck->data; dst = table->data; for (i = 0; i <= n; i++) dst[n - i] = src[i]; dvec_swap(deck, table); } static size_t find_card(struct dvec *deck, int card) { int *data; size_t i, n; n = deck->len; data = deck->data; for (i = 0; i < n; i++) { if (data[i] == card) return i; } return 0; } void part1(void) { char line[256]; const char *lpos, *lend; struct dvec deck, table; size_t i, count; size_t answer; ssize_t val; int target; int *data; if (!strcmp(aoc.inputfile, "input")) { count = 10007; target = 2019; } else { count = 10; target = 9; } dvec_init(&deck, sizeof(int), count, &stdlib_strict_heap_allocator); dvec_init(&table, sizeof(int), count, &stdlib_strict_heap_allocator); dvec_add_slots(&deck, count); dvec_add_slots(&table, count); data = deck.data; for (i = 0; i < count; i++) data[i] = (int) i; lpos = aoc.input; lend = lpos + aoc.input_size; while (readtok(line, sizeof(line), '\n', &lpos, lend)) { if (sscanf(line, "deal with increment %li", &val) == 1) { deal_increment(&deck, &table, (size_t) val); } else if (sscanf(line, "cut %li", &val) == 1) { deck_cut(&deck, &table, val); } else if (!strcmp(line, "deal into new stack")) { deal_new_stack(&deck, &table); } else if (strspn(line, " \n\r\t\v") == strlen(line)) { continue; } else { assert(false); } aoc_debug("%i pos: %lu\n", target, find_card(&deck, target)); } answer = find_card(&deck, target); aoc.answer = aprintf("%lu", answer); aoc.solution = "7171"; dvec_deinit(&table); dvec_deinit(&deck); }