QUOTE: Enjoy small things, cherish moments.

aoc

Advent of Code challenges

aoc_2024_4_1.c (1413B)


      1#include <stdbool.h>
      2#include <string.h>
      3
      4#define NELEMS(x) (int) (sizeof(x) / sizeof((x)[0]))
      5#define MATCH "XMAS"
      6
      7typedef struct {
      8  int y;
      9  int x;
     10} dir_t;
     11
     12const dir_t DIRS[8] = {
     13  {  1,  0 },
     14  { -1,  0 },
     15  {  0,  1 },
     16  {  0, -1 },
     17  {  1,  1 },
     18  {  1, -1 },
     19  { -1,  1 },
     20  { -1, -1 },
     21};
     22
     23long perform(char *data) {
     24  int len = strlen(data);
     25  int rows = 0;
     26  int cols = 0;
     27  for (int i = 0; i < len; i++) {
     28    char c = data[i];
     29    if (c == '\n') {
     30      if (rows == 0) {
     31        cols = i;
     32      }
     33      rows++;
     34    }
     35  }
     36  char grid[rows][cols];
     37  for (int i = 0; i < len; i++) {
     38    char c = data[i];
     39    if (c == '\n') {
     40      continue;
     41    }
     42    int y = i / (cols + 1);
     43    int x = i % (cols + 1);
     44    grid[y][x] = data[i];
     45  }
     46  int count = 0;
     47  for (int y = 0; y < rows; y++) {
     48    for (int x = 0; x < cols; x++) {
     49      for (int i = 0; i < NELEMS(DIRS); i++) {
     50        dir_t dir = DIRS[i];
     51        bool is_match = true;
     52        for (int j = 0; j < (int) strlen(MATCH); j++) {
     53          int ry = y + j * dir.y;
     54          int rx = x + j * dir.x;
     55          if (ry < 0 || ry >= rows || rx < 0 || rx >= cols) {
     56            is_match = false;
     57            break;
     58          }
     59          char c = grid[ry][rx];
     60          if (c != MATCH[j]) {
     61            is_match = false;
     62            break;
     63          }
     64        }
     65        if (is_match) {
     66          count++;
     67        }
     68      }
     69    }
     70  }
     71  return count;
     72}