Index: aoc2024.c ================================================================== --- aoc2024.c +++ aoc2024.c @@ -5,19 +5,65 @@ #include #include #include "aocdailies.h" #include "aocutils.h" + +static size_t rcmap(unsigned size, unsigned row, unsigned col) { + return row * (size + 1) + col; +} + +static bool masat(char *data, unsigned size, unsigned row, unsigned col, int drow, int dcol) { + int maxrow = (int)row + 3*drow; + int maxcol = (int)col + 3*dcol; + if ((0 <= maxrow) && (maxrow < (int)size) && (0 <= maxcol) && (maxcol < (int)size)) { + if (data[rcmap(size, (unsigned)((int)row + drow), (unsigned)((int)col + dcol))] != 'M') return false; + if (data[rcmap(size, (unsigned)((int)row + 2*drow), (unsigned)((int)col + 2*dcol))] != 'A') return false; + if (data[rcmap(size, (unsigned)((int)row + 3*drow), (unsigned)((int)col + 3*dcol))] != 'S') return false; + } else { + return false; + } + return true; +} + +static unsigned xmasat(char *data, unsigned size, unsigned row, unsigned col) { + unsigned finds = 0; + if (data[rcmap(size, row, col)] != 'X') return 0; + if (masat(data, size, row, col, -1, -1)) finds++; + if (masat(data, size, row, col, -1, 0)) finds++; + if (masat(data, size, row, col, -1, +1)) finds++; + if (masat(data, size, row, col, 0, -1)) finds++; + if (masat(data, size, row, col, 0, +1)) finds++; + if (masat(data, size, row, col, +1, -1)) finds++; + if (masat(data, size, row, col, +1, 0)) finds++; + if (masat(data, size, row, col, +1, +1)) finds++; + return finds; +} void aoc202404(char *data, size_t len) { (void)len; // unused argument // assume data is well-formatted and has the same number of rows and columns - unsigned cols = strchr(data, '\n') - data, rows = cols; + unsigned size = strchr(data, '\n') - data; + #if 0 // check assumption + printf("data has %u cols, first three rows start with %c%c, %c%c, and %c%c.\n", + size, data[0], data[1], + data[1*(size+1)], data[1*(size+1)+1], + data[2*(size+1)], data[2*(size+1)+1]); + printf("ends with %c%c.\n", data[(size-1)*(size+1) + size-2], data[(size-1)*(size+1)+size-1]); printf("data has %u cols, first three rows start with %c%c, %c%c, and %c%c.\n", - rows, data[0], data[1], - data[1*(cols+1)], data[1*(cols+1)+1], - data[2*(cols+1)], data[2*(cols+1)+1]); + size, data[rcmap(size, 0, 0)], data[rcmap(size, 0, 1)], + data[rcmap(size, 1, 0)], data[rcmap(size, 1, 1)], + data[rcmap(size, 2, 0)], data[rcmap(size, 2, 1)]); + printf("ends with %c%c.\n", data[rcmap(size, size-1, size-2)], data[rcmap(size, size-1, size-1)]); + #endif + unsigned xmascount = 0; + for (unsigned row = 0; row < size; row++) { + for (unsigned col = 0; col < size; col++) { + xmascount += xmasat(data, size, row, col); + } + } + printf("XMAS appears %u times in the little Elf's word search.\n", xmascount); } void aoc202403(char *data, size_t len) { (void)len; // unused argument unsigned sumproducts = 0, sumproducts2 = 0, term[2];