Files
adventofcode2023/day4/c/day4.c
dobiadi 3335442a3f Day4 C
2023-12-06 20:50:43 +01:00

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);
}