diff options
| author | Mistivia <i@mistivia.com> | 2024-01-27 14:02:35 +0800 |
|---|---|---|
| committer | Mistivia <i@mistivia.com> | 2024-01-27 14:02:35 +0800 |
| commit | 6580dcd9127f69aaa794472ec92bc46015dc4019 (patch) | |
| tree | dc2c7e102c75180f7bd98c2f3a14f8b55f83c0f2 /advent-of-code/2023/04/part2.c | |
init
Diffstat (limited to 'advent-of-code/2023/04/part2.c')
| -rw-r--r-- | advent-of-code/2023/04/part2.c | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/advent-of-code/2023/04/part2.c b/advent-of-code/2023/04/part2.c new file mode 100644 index 0000000..5e67ead --- /dev/null +++ b/advent-of-code/2023/04/part2.c @@ -0,0 +1,81 @@ +#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; +} |
