89 lines
2.4 KiB
C
89 lines
2.4 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#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);
|
|
}
|