#include #include #include // Finally a task that is favoring C #define BUFFER_SIZE 64 #define MAX_LINES 8192 // MIX_COUNT and DECRYPT_KEY is 1 for Part 1 #define MIX_COUNT 10 #define DECRYPT_KEY 811589153 int main() { char buf[BUFFER_SIZE], *p, c; memset(buf, 0, BUFFER_SIZE); p = buf; long long lines[MAX_LINES], line_count = 0; while ((c = getchar()) != EOF) { *p++ = c; if (c == '\n') { sscanf(buf, "%lli", &lines[line_count]); lines[line_count] *= DECRYPT_KEY; line_count++; memset(buf, 0, BUFFER_SIZE); p = buf; } } // Create an array of pointers to keep track of the original order long long **order = (long long**)malloc(line_count * sizeof(long long*)); for (int i = 0; i < line_count; i++) { order[i] = &lines[i]; }; long long *head = &lines[line_count-1]; // Shuffle for (int ll = 0; ll < MIX_COUNT; ll++) { for (int i = 0; i < line_count; i++) { // Remove element from its original position long long element = *order[i]; long long *q = order[i]; while (q != head) { // Shift elements back *q = *(q+1); q++; } // Shift pointers for (int j = 0; j < line_count; j++) { if (order[j] > order[i]) { order[j]--; } } // Move where we need to insert order[i] += element; // Wrap around at the end // I don't get this wrapping logic that's in the example // it doesn't make any sense that I can not shift an element to the // last position because it already wraps to the first element if (order[i] > head) { order[i] = &lines[(order[i] - head) % (line_count-1)]; } else if (order[i] <= lines) { order[i] = head - (lines - order[i]) % (line_count-1); } // Push every element back at insertion point q = head; while (q >= order[i] + 1) { // Shift elements *q = *(q-1); q--; } // Shift pointers for (int j = 0; j < line_count; j++) { if (order[j] >= order[i] && i != j) { order[j]++; } } // Insert element *order[i] = element; } } // Find 0 long long *q = lines; while (*q != 0) { q++; } long long *th[3]; th[0] = q + 1000; th[1] = q + 2000; th[2] = q + 3000; for (int i = 0; i < 3; i++) { if (th[i] > head) { th[i] = lines + ((th[i] - head) % line_count) - 1; } } printf("%lli\n", *(th[0])+*(th[1])+*(th[2])); free(order); }