Add C day 2

main
Bram van den Heuvel 2023-12-30 18:51:29 +01:00
parent edcc3caf91
commit 66706d26f2
6 changed files with 373 additions and 0 deletions

7
c/02/Makefile Normal file
View File

@ -0,0 +1,7 @@
both: p1 p2
p1:
gcc -o main1 part_1.c -lcs50 -I../include ../include/parse.c
p2:
gcc -o main2 part_2.c -lcs50 -I../include ../include/parse.c

100
c/02/input.txt Normal file
View File

@ -0,0 +1,100 @@
Game 1: 7 blue, 6 green, 3 red; 3 red, 5 green, 1 blue; 1 red, 5 green, 8 blue; 3 red, 1 green, 5 blue
Game 2: 9 green, 1 blue, 12 red; 1 blue, 18 green, 8 red; 2 blue, 6 green, 13 red; 3 blue, 13 red, 7 green; 5 blue, 4 red, 4 green; 6 blue, 7 green, 4 red
Game 3: 5 blue, 9 red, 14 green; 10 green, 3 blue; 11 red, 2 blue, 8 green; 5 red, 2 blue; 5 blue, 7 green, 8 red
Game 4: 2 red, 3 blue, 2 green; 17 green, 6 blue, 1 red; 3 blue, 5 green, 1 red; 4 red, 1 blue, 16 green; 5 red, 4 blue, 13 green; 14 green, 5 blue, 6 red
Game 5: 3 red, 17 green, 10 blue; 9 blue, 5 green; 14 green, 9 blue, 11 red
Game 6: 4 green, 18 blue, 3 red; 6 green, 8 blue, 9 red; 4 green, 9 blue, 7 red; 9 red, 1 green, 12 blue
Game 7: 1 blue, 14 green; 1 red, 4 blue, 15 green; 3 blue, 6 green; 3 blue, 2 green, 1 red; 1 red, 3 green, 1 blue
Game 8: 10 red, 3 blue, 3 green; 5 blue, 7 red, 3 green; 3 red, 3 green, 11 blue; 1 red, 7 green, 10 blue; 13 blue, 5 green, 5 red; 1 green, 17 blue, 3 red
Game 9: 1 blue, 6 green; 7 green, 2 red; 3 red, 2 green; 1 blue, 4 red, 3 green; 7 green, 1 blue, 1 red
Game 10: 14 green, 6 blue, 1 red; 8 green, 5 red, 1 blue; 8 green, 5 blue, 5 red; 2 green, 3 blue, 5 red
Game 11: 1 blue, 2 green; 1 blue, 1 green, 7 red; 1 blue, 4 green, 7 red; 2 red, 2 green, 1 blue
Game 12: 5 blue, 12 green, 12 red; 11 green, 3 red; 14 green, 3 blue, 18 red
Game 13: 2 green, 6 red; 6 red, 5 blue; 7 red, 3 blue, 8 green; 7 red, 8 green; 3 blue, 2 green, 3 red; 1 blue, 8 red, 6 green
Game 14: 18 green, 6 blue, 5 red; 5 blue, 15 red, 19 green; 7 green, 11 blue, 20 red; 5 red, 18 green, 7 blue
Game 15: 3 red, 16 green, 1 blue; 11 green, 6 red, 1 blue; 12 green, 2 red; 17 green, 1 blue, 14 red
Game 16: 3 red, 2 green, 5 blue; 1 green, 6 blue, 1 red; 1 green, 2 blue, 3 red; 1 blue, 1 red; 5 blue, 1 green, 2 red
Game 17: 3 blue, 6 red; 1 blue, 2 red; 1 blue, 1 green, 7 red; 1 green, 7 red, 2 blue; 7 red, 1 blue; 1 green, 8 red, 1 blue
Game 18: 6 green, 10 red; 6 red, 7 green; 10 red, 11 green; 10 red, 2 blue, 5 green
Game 19: 2 blue; 1 blue, 4 green, 6 red; 7 green, 6 red, 2 blue; 2 blue, 5 red, 4 green; 1 green, 10 red
Game 20: 6 red, 5 green, 10 blue; 5 blue, 5 green, 9 red; 7 blue, 3 green, 3 red; 9 blue, 12 red, 1 green
Game 21: 4 red, 18 blue, 14 green; 3 green, 14 blue, 5 red; 5 green, 12 blue; 1 blue, 2 red, 1 green; 5 red, 11 green, 7 blue; 17 green, 4 red, 15 blue
Game 22: 1 blue, 14 green, 4 red; 7 green, 10 red; 9 green, 1 blue, 9 red; 1 blue, 8 green, 5 red
Game 23: 4 blue, 5 green, 2 red; 6 blue, 8 red, 4 green; 4 blue, 17 red, 14 green
Game 24: 3 green, 8 blue; 3 blue, 5 green, 13 red; 17 red, 4 green
Game 25: 19 red, 9 blue, 1 green; 3 green, 18 red, 6 blue; 1 green, 7 red, 7 blue; 8 blue, 1 red
Game 26: 10 green, 12 blue, 2 red; 9 red; 10 blue, 12 green, 9 red
Game 27: 2 blue, 8 green, 6 red; 5 green, 9 red; 4 red, 11 green
Game 28: 10 blue, 20 red; 14 blue, 3 green, 2 red; 9 red, 12 blue, 1 green
Game 29: 4 red, 1 blue, 2 green; 1 green, 6 red, 1 blue; 15 red
Game 30: 1 red, 13 blue, 6 green; 3 blue, 4 green; 19 blue, 11 green; 1 red, 11 green, 14 blue
Game 31: 10 red, 12 green; 12 green, 10 red; 2 blue, 15 red, 12 green; 2 green, 2 blue, 15 red; 9 green, 5 red, 2 blue
Game 32: 5 blue, 5 green, 8 red; 5 green, 6 red; 5 blue, 8 red, 4 green; 5 green, 3 blue, 6 red
Game 33: 1 red, 9 green, 5 blue; 17 green, 4 blue; 3 green, 2 blue; 10 green, 2 blue; 1 blue, 4 green; 2 green, 9 blue
Game 34: 11 blue, 11 red, 9 green; 13 red, 3 blue, 5 green; 9 green, 12 blue, 5 red; 13 red, 8 blue, 5 green
Game 35: 1 green, 3 red, 7 blue; 1 red, 3 green, 9 blue; 1 blue, 2 green, 1 red; 11 blue, 5 red, 6 green
Game 36: 4 blue, 12 green, 16 red; 7 blue, 11 green; 8 green, 5 blue, 1 red; 14 green, 3 red
Game 37: 13 red, 5 blue, 9 green; 1 red, 10 blue, 14 green; 1 green, 2 blue, 10 red; 13 red, 10 blue; 1 blue, 8 green
Game 38: 3 red, 4 blue, 8 green; 1 red, 11 blue, 4 green; 13 blue, 8 green; 3 red, 3 green, 10 blue; 1 red, 1 blue, 1 green; 1 green, 2 red, 10 blue
Game 39: 9 red, 7 blue, 1 green; 15 red, 4 green, 1 blue; 2 green, 8 blue, 7 red; 6 blue, 11 red; 12 red, 2 blue, 7 green
Game 40: 13 red, 3 green, 1 blue; 3 green, 10 red; 16 red
Game 41: 1 blue, 3 red; 7 blue, 5 red, 3 green; 4 red, 3 blue, 2 green; 2 blue, 5 red, 1 green; 3 green, 4 red, 3 blue; 5 blue, 2 red
Game 42: 1 red, 4 green; 11 red, 4 green; 13 red; 1 blue, 10 red; 1 blue, 2 red, 4 green
Game 43: 11 green, 13 red, 1 blue; 11 green, 9 red, 2 blue; 7 green; 13 green, 15 red; 1 blue, 14 green
Game 44: 5 green, 14 blue, 15 red; 13 blue, 15 green; 9 green, 15 red, 6 blue
Game 45: 16 red, 8 blue; 1 green, 4 blue, 6 red; 4 blue, 8 red; 12 red, 3 blue, 3 green; 2 green, 4 red, 4 blue; 2 green, 8 blue, 10 red
Game 46: 12 blue, 3 green, 12 red; 9 red, 9 blue; 3 green, 12 red; 10 red, 6 green; 2 red, 7 blue
Game 47: 9 green, 6 red; 1 blue, 7 red, 10 green; 1 green, 2 red; 1 red, 3 green
Game 48: 9 blue, 5 green, 13 red; 14 green, 4 red; 15 red, 9 green, 1 blue; 4 blue, 6 red, 13 green; 9 green, 8 blue, 8 red
Game 49: 5 blue, 3 red; 1 green, 2 red, 5 blue; 1 green, 7 blue; 3 green
Game 50: 8 red, 6 green; 10 blue, 4 green, 6 red; 8 green, 11 blue, 9 red
Game 51: 5 blue; 13 blue; 1 red, 2 blue, 1 green; 1 red, 8 blue
Game 52: 7 blue; 1 red, 2 green, 12 blue; 1 red, 5 blue; 2 red, 7 blue, 4 green; 3 green, 2 red, 2 blue
Game 53: 10 blue, 12 red; 3 green, 5 blue, 3 red; 14 red, 4 green, 7 blue; 1 red, 14 blue
Game 54: 2 blue, 14 red, 3 green; 3 green, 7 red; 2 blue, 3 green, 9 red; 3 green, 7 red; 1 green, 14 red, 1 blue
Game 55: 3 green, 9 red, 12 blue; 5 blue, 5 green, 2 red; 7 green, 14 red, 12 blue
Game 56: 1 blue, 3 red, 4 green; 5 red, 8 green, 1 blue; 3 green, 1 blue, 2 red
Game 57: 8 blue, 13 red, 2 green; 3 blue, 5 red; 7 red, 2 green; 2 red, 5 blue, 3 green; 1 green, 4 blue
Game 58: 4 green, 3 red, 2 blue; 5 green, 2 blue, 10 red; 11 green, 1 red, 2 blue; 4 red, 5 green
Game 59: 5 green; 4 green, 2 blue; 1 red, 9 green; 7 green, 2 blue; 16 green, 1 blue
Game 60: 6 green, 5 blue, 1 red; 5 blue, 3 green, 6 red; 1 green, 5 blue, 14 red; 6 red, 4 blue, 3 green
Game 61: 2 green, 6 red, 6 blue; 6 blue, 3 red; 1 green, 2 red, 2 blue; 1 red, 2 green; 5 red, 1 green, 2 blue; 2 green, 6 red, 6 blue
Game 62: 18 green, 8 blue, 1 red; 8 green, 4 red; 13 blue, 1 red, 3 green; 7 blue, 2 green, 4 red; 4 blue, 12 green, 5 red; 12 green, 11 blue
Game 63: 2 red, 3 blue; 10 green, 13 red, 1 blue; 11 red, 3 green, 4 blue
Game 64: 1 green, 16 red; 17 blue, 9 red, 1 green; 14 red, 7 blue
Game 65: 7 blue, 11 red, 11 green; 7 red, 11 green; 3 blue, 13 red, 11 green; 5 green, 6 blue; 11 blue, 8 red, 3 green
Game 66: 3 blue, 1 green, 3 red; 5 blue, 2 green, 5 red; 1 blue, 2 green, 7 red; 2 blue, 6 red; 7 red, 2 green, 2 blue; 2 red
Game 67: 1 blue, 6 red, 2 green; 1 blue, 10 green, 6 red; 8 red, 2 blue, 4 green; 7 green, 9 red, 1 blue; 8 red, 7 green; 5 green, 1 blue
Game 68: 15 blue, 8 green, 2 red; 6 blue, 2 green; 5 red, 6 green, 8 blue; 6 red, 11 green, 7 blue; 1 red, 3 blue; 5 red, 6 green, 5 blue
Game 69: 5 blue, 4 green; 1 green, 11 red, 9 blue; 4 green, 15 blue, 6 red; 11 blue, 4 green, 5 red; 8 red, 3 green; 5 blue, 8 red
Game 70: 5 blue, 4 red, 8 green; 6 blue, 6 green; 14 blue, 7 red, 1 green; 2 green, 6 blue, 3 red; 7 red, 11 blue, 3 green
Game 71: 13 red, 6 blue, 10 green; 7 red, 12 green; 9 green, 14 red, 2 blue
Game 72: 9 red, 3 green, 3 blue; 8 red, 7 blue, 5 green; 3 blue, 2 green, 1 red; 1 red, 2 blue, 2 green; 10 red, 7 green, 6 blue
Game 73: 4 green, 3 red; 1 red; 2 red, 2 blue, 2 green; 1 blue, 3 red, 1 green; 2 blue, 3 red, 2 green; 1 red, 1 blue
Game 74: 12 green, 4 red, 4 blue; 3 red, 13 green; 1 red, 13 green, 1 blue; 1 red, 3 blue, 6 green; 6 blue, 5 red, 4 green; 7 blue, 5 green, 1 red
Game 75: 11 red, 1 green; 12 blue, 1 red; 2 blue, 1 green, 4 red; 11 red; 12 red, 6 green, 10 blue; 4 green, 5 blue, 7 red
Game 76: 2 blue, 5 red, 6 green; 1 red, 10 green, 11 blue; 7 red, 11 green; 4 red, 10 blue, 10 green; 7 blue, 16 green, 2 red
Game 77: 2 blue, 11 red, 4 green; 6 green, 3 blue, 2 red; 2 blue, 2 red, 7 green; 8 red, 14 blue, 5 green; 5 green, 2 blue, 18 red
Game 78: 9 red, 7 green, 6 blue; 12 blue, 6 red; 1 red, 15 blue, 7 green; 3 blue, 11 green, 1 red
Game 79: 3 blue; 1 blue; 1 red, 1 blue, 1 green; 3 blue; 5 blue, 1 red; 1 blue, 1 green, 1 red
Game 80: 18 blue, 13 green, 7 red; 18 blue, 3 green, 3 red; 2 red, 9 blue, 14 green
Game 81: 11 blue, 6 green, 3 red; 8 green, 12 red, 10 blue; 5 red, 4 blue, 13 green
Game 82: 2 blue, 3 red; 4 blue, 17 red; 9 red; 12 red; 1 green, 6 blue, 7 red; 20 red
Game 83: 1 blue, 1 red; 3 red, 1 blue; 3 red, 5 green; 1 blue, 2 green, 4 red; 5 green, 3 blue, 2 red
Game 84: 4 red, 2 blue, 2 green; 8 red, 10 blue; 1 green, 15 red, 8 blue
Game 85: 15 green; 11 red, 2 blue, 5 green; 8 red, 2 blue, 12 green; 15 red, 10 green; 10 red, 15 green; 17 red, 1 blue, 11 green
Game 86: 6 blue, 1 red; 2 green, 1 red, 8 blue; 2 green, 10 blue; 10 blue, 2 green; 1 red, 5 blue
Game 87: 4 red, 4 blue; 18 red, 8 blue; 16 red; 4 red, 1 green, 3 blue; 14 red, 9 blue
Game 88: 11 green, 7 blue, 4 red; 3 red; 2 blue, 12 red, 19 green; 13 red, 3 blue, 2 green
Game 89: 1 green, 1 red; 1 blue, 1 red, 6 green; 6 green, 3 red; 5 green, 2 red, 6 blue; 7 blue, 2 red, 8 green; 1 red, 2 blue
Game 90: 3 green, 3 red, 3 blue; 5 green, 2 blue, 3 red; 1 blue, 2 red; 11 green, 1 blue, 2 red; 1 green, 3 blue, 4 red
Game 91: 7 blue, 2 red; 2 blue, 1 red, 1 green; 6 blue, 1 red; 1 red, 7 blue
Game 92: 11 green, 16 blue; 17 red, 7 blue, 9 green; 11 green, 3 blue, 12 red; 2 blue, 1 green, 6 red
Game 93: 6 red, 1 blue, 3 green; 1 blue, 8 red, 7 green; 3 red, 5 green; 1 red, 2 green; 3 red, 7 green; 2 green, 15 red, 1 blue
Game 94: 7 blue, 2 red, 2 green; 9 blue, 4 red, 2 green; 9 blue, 5 red, 3 green; 1 blue, 4 red, 3 green; 4 red, 1 green, 7 blue; 9 blue, 3 green, 3 red
Game 95: 1 blue, 2 green, 2 red; 6 green, 6 red, 1 blue; 3 blue, 5 red, 2 green; 1 blue; 5 green, 2 red, 2 blue
Game 96: 3 blue, 6 red, 5 green; 5 blue, 8 green, 9 red; 2 red, 5 green, 1 blue; 6 green, 4 blue, 3 red; 2 green, 2 blue; 6 blue, 4 green
Game 97: 6 green, 8 blue, 5 red; 9 green, 6 blue; 3 green, 3 blue; 2 blue, 10 green, 4 red
Game 98: 11 blue, 1 green, 9 red; 5 green, 1 blue, 6 red; 13 blue, 6 green, 10 red; 6 blue, 4 green, 9 red
Game 99: 4 red, 3 green, 3 blue; 6 blue, 4 green, 11 red; 3 green, 15 red; 1 blue, 6 green, 14 red
Game 100: 14 green, 6 blue, 12 red; 2 green, 1 blue, 2 red; 12 red, 7 blue, 3 green; 1 blue, 12 red, 8 green

76
c/02/part_1.c Normal file
View File

@ -0,0 +1,76 @@
#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <parse.h>
// 1957 is too low
// The amount of games expected
const int games = 100;
// How many of each cube are allowed
const int allowed_red = 12;
const int allowed_green = 13;
const int allowed_blue = 14;
// How many letter each color takes up
const int chars_red = strlen("red");
const int chars_green = strlen("green");
const int chars_blue = strlen("blue");
// Pre-defined functions
int game_score(char *text);
int main(void) {
int sum = 0;
char *inputs[games];
for (int i = 0; i < games; i++) {
inputs[i] = get_string("");
}
for (int i = 0; i < games; i++) {
sum += game_score(inputs[i]);
}
printf("%i\n", sum);
return 0;
}
/* Determine a game's score.
*/
int game_score(char *text) {
int value = 0;
int game;
int *cursor = &value;
parse_token(text, cursor, "Game ");
parse_int(text, cursor, &game);
parse_token(text, cursor, ":");
do
{
int number;
parse_token(text, cursor, " ");
parse_int(text, cursor, &number);
parse_token(text, cursor, " ");
if (parse_token(text, cursor, "red")) {
if (number > allowed_red) {
return 0;
}
} else if (parse_token(text, cursor, "green")) {
if (number > allowed_green) {
return 0;
}
} else if (parse_token(text, cursor, "blue")) {
if (number > allowed_blue) {
return 0;
}
}
}
while (parse_token(text, cursor, ";") || parse_token(text, cursor, ","));
return game;
}

77
c/02/part_2.c Normal file
View File

@ -0,0 +1,77 @@
#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <parse.h>
// 1957 is too low
// The amount of games expected
const int games = 100;
// How many of each cube are allowed
const int allowed_red = 12;
const int allowed_green = 13;
const int allowed_blue = 14;
// How many letter each color takes up
const int chars_red = strlen("red");
const int chars_green = strlen("green");
const int chars_blue = strlen("blue");
// Pre-defined functions
int game_score(char *text);
int main(void) {
int sum = 0;
char *inputs[games];
for (int i = 0; i < games; i++) {
inputs[i] = get_string("");
}
for (int i = 0; i < games; i++) {
sum += game_score(inputs[i]);
}
printf("%i\n", sum);
return 0;
}
/* Determine a game's score.
*/
int game_score(char *text) {
int value = 0;
int game;
int *cursor = &value;
int red = 0, green = 0, blue = 0;
parse_token(text, cursor, "Game ");
parse_int(text, cursor, &game);
parse_token(text, cursor, ":");
do
{
int number;
parse_token(text, cursor, " ");
parse_int(text, cursor, &number);
parse_token(text, cursor, " ");
if (parse_token(text, cursor, "red")) {
if (number > red) {
red = number;
}
} else if (parse_token(text, cursor, "green")) {
if (number > green) {
green = number;
}
} else if (parse_token(text, cursor, "blue")) {
if (number > blue) {
blue = number;
}
}
}
while (parse_token(text, cursor, ";") || parse_token(text, cursor, ","));
return red * green * blue;
}

91
c/include/parse.c Normal file
View File

@ -0,0 +1,91 @@
/* This parsing library aims to imitate how Elm parses strings.
In contrast to Elm, however, this function makes use of the side-effects that
C brings, allowing for impurity and a lack of need to return values.
Instead, every parser merely returns a boolean that expresses whether it had
parsed successfully.
*/
#include <parse.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const bool DEBUG = false;
/* Parse a single char and fetch the result.
*/
bool parse_char(char *text, int *cursor, char *c) {
int length = strlen(text);
if (DEBUG) printf("Parsing a char : ");
if (*cursor == length) {
if (DEBUG) printf("Reached end of string [FAIL]\n");
return false;
}
*c = text[*cursor];
*cursor = *cursor + 1;
if (DEBUG) printf("%c [Success]\n", *c);
return true;
}
/* Parse an integer.
*/
bool parse_int(char *text, int *cursor, int *output) {
int is_negative = parse_token(text, cursor, "-");
if (DEBUG) printf("Parsing int : ");
int answer = 0;
char c = text[*cursor];
if (c < '0' || c > '9') {
if (DEBUG) printf("%c [FAIL]\n", c);
return false;
}
do
{
if (DEBUG) printf("%c", c);
answer = (answer * 10) + (c - '0');
*cursor = *cursor + 1;
c = text[*cursor];
}
while (c >= '0' && c <= '9');
if (DEBUG) printf(" [Success ]\n");
if (is_negative) {
answer = -1 * answer;
}
*output = answer;
return true;
}
/* Parse a token of text.
*/
bool parse_token(char *text, int *cursor, char *token) {
int length = strlen(token), text_length = strlen(text);
if (DEBUG) printf("Parsing token \"%s\" : ", token);
if (text_length - *cursor < length) {
if (DEBUG) printf("Token too long, won't fit. [FAIL]\n");
return false;
}
for (int i = 0; i < length; i++) {
if (DEBUG) printf("%c", text[*cursor + i]);
if (text[*cursor + i] != token[i]) {
if (DEBUG) printf(" [FAIL]\n");
*cursor = *cursor + i;
return false;
}
}
if (DEBUG) printf(" [Success]\n");
*cursor = *cursor + length;
return true;
}

22
c/include/parse.h Normal file
View File

@ -0,0 +1,22 @@
/* This parsing library aims to imitate how Elm parses strings.
In contrast to Elm, however, this function makes use of the side-effects that
C brings, allowing for impurity and a lack of need to return values.
Instead, every parser merely returns a boolean that expresses whether it had
parsed successfully.
*/
#include <stdbool.h>
/* Parse a single char and fetch the result.
*/
bool parse_char(char *text, int *cursor, char *c);
/* Parse an integer.
*/
bool parse_int(char *text, int *cursor, int *output);
/* Parse a token of text.
*/
bool parse_token(char *text, int *cursor, char *token);