part2.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <string.h>
  5. #include "vec.h"
  6. #include "str.h"
  7. typedef struct {
  8. void *win_nums;
  9. void *nums;
  10. } card_t;
  11. void *parse_input() {
  12. FILE *fp = fopen("./input", "r");
  13. void *cards = new_vec();
  14. char *line;
  15. while ((line = fgetline(fp)) != NULL) {
  16. line = str_strip(line);
  17. line = vec_get(str_split(line, ':'), 1);
  18. line = str_strip(line);
  19. void *splited = str_split(line, '|');
  20. char *win_str = str_strip(vec_get(splited, 0));
  21. char *num_str = str_strip(vec_get(splited, 1));
  22. void *winnums_str = str_split(win_str, ' ');
  23. void *nums_str = str_split(num_str, ' ');
  24. card_t *card = malloc(sizeof(card_t));
  25. card->win_nums = new_vec();
  26. card->nums = new_vec();
  27. for (int i = 0; i < vec_size(winnums_str); i++) {
  28. int *n = malloc(sizeof(int));
  29. *n = strtol(vec_get(winnums_str, i), NULL, 10);
  30. vec_push_back(card->win_nums, n);
  31. }
  32. for (int i = 0; i < vec_size(nums_str); i++) {
  33. int *n = malloc(sizeof(int));
  34. *n = strtol(vec_get(nums_str, i), NULL, 10);
  35. vec_push_back(card->nums, n);
  36. }
  37. vec_push_back(cards, card);
  38. }
  39. return cards;
  40. }
  41. int win_count(card_t *card) {
  42. int win_count = 0;
  43. for (int i = 0; i < vec_size(card->nums); i++) {
  44. int num = *(int*)vec_get(card->nums, i);
  45. for (int j = 0; j < vec_size(card->win_nums); j++) {
  46. if (num == *(int*)vec_get(card->win_nums, j)) {
  47. win_count++;
  48. break;
  49. }
  50. }
  51. }
  52. return win_count;
  53. }
  54. int process_card(int *card_cnt, void *cards, int i) {
  55. int card_num = vec_size(cards);
  56. int win_cnt = win_count(vec_get(cards, i));
  57. for (int j = i + 1; j < card_num && j < i + 1 + win_cnt; j++) {
  58. card_cnt[j] += card_cnt[i];
  59. }
  60. return card_cnt[i];
  61. }
  62. int main() {
  63. void *cards = parse_input();
  64. int sum = 0;
  65. int *card_cnt = malloc(sizeof(int) * vec_size(cards));
  66. for (int i = 0; i < vec_size(cards); i++) {
  67. card_cnt[i] = 1;
  68. }
  69. for (int i = 0; i < vec_size(cards); i++) {
  70. sum += process_card(card_cnt, cards, i);
  71. }
  72. printf("%d\n", sum);
  73. return 0;
  74. }