77 lines
1.8 KiB
C
77 lines
1.8 KiB
C
//
|
|
// Created by Lennart on 02/12/2023.
|
|
//
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <stdbool.h>
|
|
|
|
#include "input_handler.h"
|
|
|
|
int find_digits(FILE *f, bool replace_letters);
|
|
int solve(const char *fileName, bool replace_letters);
|
|
|
|
char *buffer;
|
|
int bufferLen;
|
|
|
|
const char* digitsAsLetters[] = {
|
|
"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"
|
|
};
|
|
|
|
int main() {
|
|
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
|
|
read_line(f, &buffer, &bufferLen);
|
|
|
|
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;
|
|
}
|