Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdbool.h>
- #define SIZE 850
- #define COL 20
- int parse(FILE* file, long int* results, int items[][COL], int* sizes) {
- int index = 0;
- while (fscanf(file, "%ld: ", (results + index)) == 1) {
- int val;
- int offset = 0;
- char c;
- while (fscanf(file, "%d", &val) == 1) {
- items[index][offset++] = val;
- if ((c = fgetc(file)) != ' ') {
- // End of this string of values
- sizes[index] = offset;
- index++;
- offset = 0;
- break;
- }
- }
- }
- return index;
- }
- bool evaluate(long int result, long int current, int* items, int size_remaining, bool part_one) {
- if (size_remaining == 0) {
- return result == current;
- }
- if (evaluate(result, current + *items, items + 1, size_remaining - 1)) {
- return true;
- }
- if (evaluate(result, current * *items, items + 1, size_remaining - 1)) {
- return true;
- }
- if (part_one) {
- // Don't try ||
- return false;
- }
- int val = *items;
- // Get number of digits of val. shift current by that.
- do {
- val = val / 10;
- current *= 10;
- } while (val != 0);
- current += *items;
- bool concat = evaluate(result, current, items + 1, size_remaining - 1);
- return concat;
- }
- long int part_one(long int* results, int items[][COL], int* sizes, int size) {
- long int total = 0;
- for (size_t i = 0; i < size; i++) {
- long int res = *(results + i);
- int* values = items[i];
- int size = *(sizes + i);
- if (evaluate(res, *values, values + 1, size - 1, true)) {
- total += res;
- }
- }
- return total;
- }
- long int part_two(long int* results, int items[][COL], int* sizes, int size) {
- long int total = 0;
- for (size_t i = 0; i < size; i++) {
- long int res = *(results + i);
- int* values = items[i];
- int size = *(sizes + i);
- bool success = evaluate(res, *values, values + 1, size - 1, false);
- if (success) {
- total += res;
- }
- }
- return total;
- }
- int main() {
- FILE* file = fopen("2024-7.txt", "r");
- long int results[SIZE];
- int sizes[SIZE];
- int items[SIZE][COL];
- int size = parse(file, results, items, sizes);
- printf("Part one: %ld\n", part_one(results, items, sizes, size));
- printf("Part two: %ld\n", part_two(results, items, sizes, size));
- }
Advertisement
Add Comment
Please, Sign In to add comment