#include "aoc.h" int main(int argc, char **argv) { Arena *arena = make_arena(Megabytes(1)); str input = read_file(arena, argv[1]); Grid grid = parse_grid(input, arena); i32 directions[][2] = { { 1, 0 }, // horizontally forwards { -1, 0 }, // horizontally backwards { 0, 1 }, // vertically downwards { 0, -1 }, // vertically upwards { 1, 1 }, // diagonally down-right { -1, -1 }, // diagonally up-left { 1, -1 }, // diagonally up-right { -1, 1 }, // diagonally down-left }; char XMAS[] = "XMAS"; i32 part_1 = 0; for (i32 y = 0; y < grid.height; y++) { for (i32 x = 0; x < grid.width; x++) { for (usize direction_index = 0; direction_index < ARRAY_SIZE(directions); direction_index++) { i32 dx = directions[direction_index][0]; i32 dy = directions[direction_index][1]; i32 end_x = x + 3 * dx; i32 end_y = y + 3 * dy; if (end_x < 0 || end_x >= grid.width || end_y < 0 || end_y >= grid.height) { continue; } bool found = true; for (i32 i = 0; i < 4; i++) { if (grid_at(&grid, x + i * dx, y + i * dy) != XMAS[i]) { found = false; break; } } part_1 += found; } } } i32 part_2 = 0; for (i32 y = 1; y < grid.height - 1; y++) { for (i32 x = 1; x < grid.width - 1; x++) { if (grid_at(&grid, x, y) != 'A') { continue; } bool first_diagonal = ((grid_at(&grid, x - 1, y - 1) == 'M') && (grid_at(&grid, x + 1, y + 1) == 'S')) || ((grid_at(&grid, x - 1, y - 1) == 'S') && (grid_at(&grid, x + 1, y + 1) == 'M')); bool second_diagonal = ((grid_at(&grid, x + 1, y - 1) == 'M') && (grid_at(&grid, x - 1, y + 1) == 'S')) || ((grid_at(&grid, x + 1, y - 1) == 'S') && (grid_at(&grid, x - 1, y + 1) == 'M')); part_2 += first_diagonal && second_diagonal; } } printf("%d\n", part_1); printf("%d\n", part_2); }