aoc2024/07/part1.c
2024-12-07 07:33:43 +01:00

66 lines
1.5 KiB
C

#include "_.h"
typedef struct node {
long result;
struct node *next_mul;
struct node *next_add;
} node_t;
void cal(char **nbrs, node_t *cur, long i) {
if (nbrs[i] == NULL)
return;
long nbr1 = atol(nbrs[i]);
cur->next_mul = calloc(1, sizeof(node_t));
cur->next_add = calloc(1, sizeof(node_t));
cur->next_mul->result = cur->result * nbr1;
cur->next_add->result = cur->result + nbr1;
cal(nbrs, cur->next_mul, i + 1);
cal(nbrs, cur->next_add, i + 1);
}
long dis(node_t *cur, long number_to_find) {
if (cur->next_add == NULL) {
//printf("cal: %ld\n", cur->result);
if (number_to_find == cur->result) {
return 1;
}
return 0;
}
long find = dis(cur->next_mul, number_to_find);
long find2 = dis(cur->next_add, number_to_find);
return find || find2;
}
int main(int argc, char **argv) {
if (argc != 2)
return 1;
char *input = argv[1];
char **inputs = str_split(strdup(input), '\n');
long add = 0;
for (long i = 0; inputs[i] != NULL; i++) {
char **split_space = str_split(strdup(inputs[i]), ' ');
long result = atol(split_space[0]);
node_t *head = calloc(1, sizeof(node_t));
head->result = atol(split_space[1]);
cal(split_space, head, 2);
//printf("result: %ld\n", result);
long find = dis(head, result);
//printf("find: %ld\n", find);
if (find)
add += result;
}
printf("add: %ld\n", add);
return 0;
}