feat: add day 4

This commit is contained in:
2023-12-06 23:01:11 +01:00
parent 52784ef81a
commit 14dc992bbc
4 changed files with 344 additions and 2 deletions

125
day_4.c Normal file
View File

@@ -0,0 +1,125 @@
//
// Created by lennart on 12/6/23.
//
#include <ctype.h>
#include <stdlib.h>
#include "input_handler.h"
typedef struct {
int countWinningNumbers;
int winningNumbers[10];
int countGivenNumbers;
int givenNumbers[25];
int copies;
} Card;
#define LIST_NAME CardList
#define LIST_PREFIX clist
#define ELEMENT_TYPE Card
#include "list.h"
CardList* load_cards(const char *file_name);
int main() {
CardList *cards = load_cards("day_4.txt");
// Part 1 - Iterate over given numbers and linearly check for matches
int sum = 0;
int sum2 = 0; // Part 2
for(int i = 0; i < cards->length; i++) {
Card card = cards->data[i];
int won = 0;
for(int j = 0; j < card.countGivenNumbers; j++) {
int given = card.givenNumbers[j];
for(int k = 0; k < card.countWinningNumbers; k++) {
if(card.winningNumbers[k] == given) {
won += 1;
continue;
}
}
}
sum += (1 << won) >> 1;
// Part 2 - Begin (register copies won)
sum2 += card.copies;
for(int j = 1; j <= won && (i + j) < cards->length; j++) {
cards->data[i + j].copies += card.copies;
}
// Part 2 - End
}
printf("Result #1: %i\n", sum);
printf("Result #2: %i\n", sum2);
clist_free(cards);
}
CardList* load_cards(const char *file_name) {
FILE *f = fopen(file_name, "r");
if(f == NULL) {
printf("Error! Missing input file");
exit(1);
}
CardList *list = clist_create(16);
char* buffer = NULL;
int bufferLen = 0;
while(!feof(f)) {
char *line = read_line(f, &buffer, &bufferLen);
if(strlen(line) < strlen("Game 1: ")) {
continue;
}
line = &line[strlen("Game ")];
while(*line == ' ') line++;
int gameId = (int) strtol(line, &line, 10);
Card card;
card.countWinningNumbers = 0;
card.countGivenNumbers = 0;
card.copies = 1;
// Find the winning numbers
line += 2;
while(*line != '|') {
if(*line == 0) {
printf("Error! Unexpected end of line: %s", buffer);
exit(1);
}
if(!isdigit(*line)) {
line++;
continue;
}
if(card.countWinningNumbers >= 10) {
printf("Error! Given numbers out of bounds in: %s", buffer);
exit(1);
}
int num = (int) strtol(line, &line, 10);
card.winningNumbers[card.countWinningNumbers++] = num;
}
// Find the given numbers
line += 2;
while(*line != 0) {
if(card.countGivenNumbers >= 25) {
printf("Error! Given numbers out of bounds in: %s", buffer);
exit(1);
}
if(!isdigit(*line)) {
line++;
continue;
}
int num = (int) strtol(line, &line, 10);
card.givenNumbers[card.countGivenNumbers++] = num;
}
clist_add(list, card);
}
free(buffer);
return list;
}