Day4 C
This commit is contained in:
88
day4/c/day4.c
Normal file
88
day4/c/day4.c
Normal file
@@ -0,0 +1,88 @@
|
||||
#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);
|
||||
}
|
||||
Reference in New Issue
Block a user