Index: aoc2024.c ================================================================== --- aoc2024.c +++ aoc2024.c @@ -4,10 +4,63 @@ #include #include #include #include "aocdailies.h" #include "aocutils.h" + +/* === aoc202409 ======================================================= + WOW! input consists of a 20,000 long string of numbers! +===================================================================== */ + +void aoc202409(char *data, size_t len) { + (void)len; // unused argument + int *disk = malloc(512 * sizeof *disk); + size_t rdisk = 512; + size_t ndisk = 0; + int fileid = 0; + while (*data) { + for (int k = 0; k < *data - '0'; k++) { + if (ndisk == rdisk) { + // assume it works + rdisk = (13*rdisk)/8; + disk = realloc(disk, rdisk * sizeof *disk); + } + disk[ndisk++] = fileid; + } + fileid++; + data++; + if (*data) { + for (int k = 0; k < *data - '0'; k++) { + if (ndisk == rdisk) { + // assume it works + rdisk = (13*rdisk)/8; + disk = realloc(disk, rdisk * sizeof *disk); + } + disk[ndisk++] = -1; + } + data++; + } + } + int *left = disk, *right = disk + ndisk; + for (;;) { + while (*left != -1) left++; + if (left >= right) break; + while (right[-1] == -1) right--; + // swap *left and right[-1] + int tmp = *--right; + *right = *left; + *left++ = tmp; + } + unsigned long long chksum = 0; + size_t index = 0; + while (disk[index] >= 0) { + chksum += (size_t)disk[index] * index; + index++; + } + printf("%llu\n", chksum); + free(disk); +} /* === aoc202408 ======================================================= Oh! another square of text! Idea: for all points p with an antenna find all points q>p with a corresponding frequency. For each such pair calculate the 2 antinodes Index: aocdailies.c ================================================================== --- aocdailies.c +++ aocdailies.c @@ -5,10 +5,11 @@ aocfunc *p; switch (y * 100 + d) { default: p = NULL; break; // YYYYdd ==> aocYYYYdd + case 202409: p = aoc202409; break; case 202408: p = aoc202408; break; case 202407: p = aoc202407; break; case 202406: p = aoc202406; break; case 202405: p = aoc202405; break; case 202404: p = aoc202404; break; Index: aocdailies.h ================================================================== --- aocdailies.h +++ aocdailies.h @@ -4,10 +4,11 @@ #include typedef void aocfunc(char *, size_t); aocfunc *aocselect(unsigned, unsigned); +aocfunc aoc202409; aocfunc aoc202408; aocfunc aoc202407; aocfunc aoc202406; aocfunc aoc202405; aocfunc aoc202404;