// // Created by Lennart on 02/12/2023. // #include #include #include #include int find_digits(FILE *f, bool replace_letters); int solve(const char *fileName, bool replace_letters); char *buffer; int bufferLen = 64; const char* digitsAsLetters[] = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" }; int main() { buffer = malloc(bufferLen * sizeof (char)); printf("Result #1: %i\n", solve("day_1.txt", false)); printf("Result #2: %i\n", solve("day_1.txt", true)); free(buffer); return 0; } int solve(const char *fileName, bool replace_letters) { FILE *f = fopen(fileName, "r"); if(f == NULL) { printf("Error! Missing input file!"); exit(-1); } int sum = 0; while(!feof(f)) { sum += find_digits(f, replace_letters); } fclose(f); return sum; } // Read all digits form the next line in a file int find_digits(FILE *f, bool replace_letters) { int first = -1, last = 10; // Use first=-1 to detect unset value and last=10 to return 0 (-10 + 10) when no values are set // Read the entire line as a string int position = 0; do { if(position >= bufferLen - 1) { buffer = realloc(buffer, 2 * sizeof(char) * bufferLen); bufferLen *= 2; } fgets(&buffer[position], bufferLen - position, f); position = bufferLen - 1; } while(buffer[strlen(buffer) - 1] != '\n' && !feof(f)); for(int i = 0; i < bufferLen; i++) { if(buffer[i] == 0) { break; } int digit = -1; if(sscanf(&buffer[i], "%1d", &digit) != 1 && replace_letters) { for(int j = 1; j < 10; j++) { if(strncmp(&buffer[i], digitsAsLetters[j], strlen(digitsAsLetters[j])) == 0) { digit = j; break; } } } if(digit >= 0) { if(first == -1) { first = digit; } last = digit; } } return first * 10 + last; }