advent-of-code-2024/day-04/main.c

65 lines
2.3 KiB
C

#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);
}