65 lines
2.3 KiB
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);
|
|
}
|