Add C day 2
parent
edcc3caf91
commit
66706d26f2
|
@ -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
|
|
@ -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
|
|
@ -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;
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
|
@ -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);
|
Loading…
Reference in New Issue