#include #include #include #define LINE_MAX_LENGTH 256 #define MAX_WINNING_NUMBERS 16 #define MAX_SCRATCHED_NUMBERS 64 #define MAX_FORESIGHT (MAX_WINNING_NUMBERS+1) #define NUM_0_CHARCODE 48 #define NUM_9_CHARCODE NUM_0_CHARCODE + 9 int read_numbers(char *p, char endchar, int dest[]) { int count = 0; while (*p != endchar && *(p+1) != endchar) { // Advance till first digit while (*p < NUM_0_CHARCODE || *p > NUM_9_CHARCODE) p++; // Read number sscanf(p, "%i", &dest[count]); count++; // Advance till endchar or separator while (*p != ' ' && *p != endchar) p++; } return count; } int main() { char *p, *buf, c; int card_id; int part1 = 0; buf = (char *)malloc(LINE_MAX_LENGTH); memset(buf, 0, LINE_MAX_LENGTH); p = buf; int winning_numbers[MAX_WINNING_NUMBERS], winning_numbers_num = 0; int scratched_numbers[MAX_SCRATCHED_NUMBERS], scratched_numbers_num = 0; int foresight[MAX_FORESIGHT], sum_scratchcards = 0; memset(foresight, 0, MAX_FORESIGHT * sizeof(foresight[0])); while ((c = getchar()) != EOF) { *p++ = c; if (c == '\n') { p = buf; sscanf(p, "Card %i", &card_id); int num_cards = 1 + foresight[0]; sum_scratchcards += num_cards; for (int i = 0; i < MAX_FORESIGHT-1; i++) { foresight[i] = foresight[i+1]; } // Advance till ':' while (*p++ != ':'); winning_numbers_num = read_numbers(p, '|', winning_numbers); while (*p++ != '|'); scratched_numbers_num = read_numbers(p, '\n', scratched_numbers); int points = 0; int scratchcards_won = 0; for (int i = 0; i < scratched_numbers_num; i++) { for (int j = 0; j < winning_numbers_num; j++) { if (scratched_numbers[i] == winning_numbers[j]) { points = points ? points * 2 : 1; scratchcards_won++; } } } for (int i = 0; i < scratchcards_won; i++) { foresight[i] += num_cards; } part1 += points; memset(buf, 0, LINE_MAX_LENGTH); p = buf; } } free(buf); printf("%i\n", part1); printf("%i\n", sum_scratchcards); }