QUOTE: Be someone’s rainbow today.

aoc_2024_7_1.c - aoc - Advent of Code challenges

aoc

Advent of Code challenges
git clone git@soophie.de:/srv/git/aoc
log | files | refs

aoc_2024_7_1.c (1369B)


      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <stdbool.h>
      4 #include <ctype.h>
      5 #include <string.h>
      6 #include <math.h>
      7 
      8 #define VALUES_SIZE 25
      9 #define OP_SIZE 2
     10 
     11 typedef enum {
     12   OP_ADD = '+',
     13   OP_MUL = '*',
     14 } op_t;
     15 
     16 long perform(char *data) {
     17   size_t len = strlen(data);
     18   long sum = 0;
     19   long result;
     20   long values[VALUES_SIZE];
     21   int idx = 0;
     22   bool is_values = false;
     23   for (size_t i = 0; i < len;) {
     24     char c = data[i];
     25     if (c == '\n') {
     26       bool is_equal = false;
     27       int iter = pow(2, idx - 1);
     28       for (int i = 0; i < iter; i++) {
     29         long num = values[0];
     30         int k = 1;
     31         for (int j = idx - 1 - 1; j >= 0; j--) {
     32           op_t op = (i >> j) & 1 ? OP_ADD : OP_MUL;
     33           if (op == OP_ADD) {
     34             num += values[k];
     35           }
     36           if (op == OP_MUL) {
     37             num *= values[k];
     38           }
     39           k++;
     40         }
     41         if (num == result) {
     42           is_equal = true;
     43         }
     44       }
     45       if (is_equal) {
     46         sum += result;
     47       }
     48       idx = 0;
     49       is_values = false;
     50       i++;
     51       continue;
     52     }
     53     if (isdigit(c)) {
     54       char *end = NULL;
     55       long num = strtol(data + i, &end, 10);
     56       if (is_values) {
     57         values[idx++] = num;
     58       }
     59       else {
     60         result = num;
     61         is_values = true;
     62       }
     63       i += end - (data + i);
     64       continue;
     65     }
     66     i++;
     67   }
     68   return sum;
     69 }