From 413d4d4631bef22b040b241fc8cc19ed0af7270f Mon Sep 17 00:00:00 2001 From: Bill Rossi Date: Wed, 4 Dec 2024 05:51:19 -0500 Subject: [PATCH] c 2024 day 4 part 1 --- c/2024/4/ceres_search.c | 111 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 c/2024/4/ceres_search.c diff --git a/c/2024/4/ceres_search.c b/c/2024/4/ceres_search.c new file mode 100644 index 0000000..4561463 --- /dev/null +++ b/c/2024/4/ceres_search.c @@ -0,0 +1,111 @@ +#include +#include +#include +#include + +#include "../../lib/aoc.h" + +char *target_string = "XMAS"; +#define TARGET_STRING_LENGTH 4 + +typedef struct Puzzle { + char *text; + int width; + int height; +} Puzzle; + +char puzzle_char_at(Puzzle *puzzle, int row, int column) { + return puzzle->text[column + (puzzle->width * row)]; +} + +bool puzzle_inbounds(Puzzle *puzzle, int row, int column) { + return row < puzzle->height && row >= 0 && column >= 0 && column < puzzle->width; +} + +int target_string_count(Puzzle *puzzle, int index) { + if (puzzle->text[index] != target_string[0]) return 0; + int count = 0; + int row = index / puzzle->width; + int column = index % puzzle->width; + + // right + for (int i = 1; i < TARGET_STRING_LENGTH; i++) { + if (!puzzle_inbounds(puzzle, row, column + i)) break; + if (puzzle_char_at(puzzle, row, column + i) != target_string[i]) break; + if (i == TARGET_STRING_LENGTH - 1) count += 1; + } + + // down right + for (int i = 1; i < TARGET_STRING_LENGTH; i++) { + if (!puzzle_inbounds(puzzle, row + i, column + i)) break; + if (puzzle_char_at(puzzle, row + i, column + i) != target_string[i]) break; + if (i == TARGET_STRING_LENGTH - 1) count += 1; + } + + // down + for (int i = 1; i < TARGET_STRING_LENGTH; i++) { + if (!puzzle_inbounds(puzzle, row + i, column)) break; + if (puzzle_char_at(puzzle, row + i, column) != target_string[i]) break; + if (i == TARGET_STRING_LENGTH - 1) count += 1; + } + + // down left + for (int i = 1; i < TARGET_STRING_LENGTH; i++) { + if (!puzzle_inbounds(puzzle, row + i, column - i)) break; + if (puzzle_char_at(puzzle, row + i, column - i) != target_string[i]) break; + if (i == TARGET_STRING_LENGTH - 1) count += 1; + } + + // left + for (int i = 1; i < TARGET_STRING_LENGTH; i++) { + if (!puzzle_inbounds(puzzle, row, column - i)) break; + if (puzzle_char_at(puzzle, row, column - i) != target_string[i]) break; + if (i == TARGET_STRING_LENGTH - 1) count += 1; + } + + // up left + for (int i = 1; i < TARGET_STRING_LENGTH; i++) { + if (!puzzle_inbounds(puzzle, row - i, column - i)) break; + if (puzzle_char_at(puzzle, row - i, column - i) != target_string[i]) break; + if (i == TARGET_STRING_LENGTH - 1) count += 1; + } + + // up + for (int i = 1; i < TARGET_STRING_LENGTH; i++) { + if (!puzzle_inbounds(puzzle, row - i, column)) break; + if (puzzle_char_at(puzzle, row - i, column) != target_string[i]) break; + if (i == TARGET_STRING_LENGTH - 1) count += 1; + } + + // up right + for (int i = 1; i < TARGET_STRING_LENGTH; i++) { + if (!puzzle_inbounds(puzzle, row - i, column + i)) break; + if (puzzle_char_at(puzzle, row - i, column + i) != target_string[i]) break; + if (i == TARGET_STRING_LENGTH - 1) count += 1; + } + + return count; +} + +int main() { + char *input = aoc_read_input(); + int width = strchr(input, '\n') - input + 1; + int height = strlen(input) / width; + + Puzzle p; + p.text = input; + p.width = width; + p.height = height; + + int sum = 0; + + for (int i = 0; i < strlen(input); i++) { + sum += target_string_count(&p, i); + } + + printf("Part 1: %d\n", sum); + // printf("Part 2: %d\n", cond_sum); + + aoc_free(); + return 0; +}