Files
Dobos Ádám 3321301cec Day20
2022-12-23 00:13:58 +01:00

105 lines
2.9 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 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);
}