aboutsummaryrefslogtreecommitdiff
path: root/advent-of-code/2023/04/part2.c
diff options
context:
space:
mode:
Diffstat (limited to 'advent-of-code/2023/04/part2.c')
-rw-r--r--advent-of-code/2023/04/part2.c81
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;
+}