diff options
Diffstat (limited to 'advent-of-code/2023/04/part2.c')
| -rw-r--r-- | advent-of-code/2023/04/part2.c | 81 |
1 files changed, 0 insertions, 81 deletions
diff --git a/advent-of-code/2023/04/part2.c b/advent-of-code/2023/04/part2.c deleted file mode 100644 index 5e67ead..0000000 --- a/advent-of-code/2023/04/part2.c +++ /dev/null @@ -1,81 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#include <math.h> -#include <string.h> - -#include "vec.h" -#include "str.h" - -typedef struct { - void *win_nums; - void *nums; -} card_t; - -void *parse_input() { - FILE *fp = fopen("./input", "r"); - void *cards = new_vec(); - char *line; - while ((line = fgetline(fp)) != NULL) { - line = str_strip(line); - line = vec_get(str_split(line, ':'), 1); - line = str_strip(line); - void *splited = str_split(line, '|'); - char *win_str = str_strip(vec_get(splited, 0)); - char *num_str = str_strip(vec_get(splited, 1)); - void *winnums_str = str_split(win_str, ' '); - void *nums_str = str_split(num_str, ' '); - - card_t *card = malloc(sizeof(card_t)); - card->win_nums = new_vec(); - card->nums = new_vec(); - for (int i = 0; i < vec_size(winnums_str); i++) { - int *n = malloc(sizeof(int)); - *n = strtol(vec_get(winnums_str, i), NULL, 10); - vec_push_back(card->win_nums, n); - } - for (int i = 0; i < vec_size(nums_str); i++) { - int *n = malloc(sizeof(int)); - *n = strtol(vec_get(nums_str, i), NULL, 10); - vec_push_back(card->nums, n); - } - vec_push_back(cards, card); - } - return cards; -} - -int win_count(card_t *card) { - int win_count = 0; - for (int i = 0; i < vec_size(card->nums); i++) { - int num = *(int*)vec_get(card->nums, i); - for (int j = 0; j < vec_size(card->win_nums); j++) { - if (num == *(int*)vec_get(card->win_nums, j)) { - win_count++; - break; - } - } - } - return win_count; -} - -int process_card(int *card_cnt, void *cards, int i) { - int card_num = vec_size(cards); - int win_cnt = win_count(vec_get(cards, i)); - for (int j = i + 1; j < card_num && j < i + 1 + win_cnt; j++) { - card_cnt[j] += card_cnt[i]; - } - return card_cnt[i]; -} - -int main() { - void *cards = parse_input(); - int sum = 0; - int *card_cnt = malloc(sizeof(int) * vec_size(cards)); - for (int i = 0; i < vec_size(cards); i++) { - card_cnt[i] = 1; - } - for (int i = 0; i < vec_size(cards); i++) { - sum += process_card(card_cnt, cards, i); - } - printf("%d\n", sum); - return 0; -} |
