part1.c 1.9 KB

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