#include #include #include #include #include #include "../libs/buffered_reader.h" #include "../libs/data_structures.h" int decodeA(const char *str); int decodeB(const char *str); char getnumber(const char *str); list *fl; list *bl; int main(int argc, char *argv[]) { if (argc < 3) { printf("usage: day1 INPUT_FILE a|b\n"); exit(1); } filelines *lines = flines(argv[1]); if (lines == NULL) { printf("Failed to read file"); exit(1); } if (argv[2][0] == 'b') { initList(&fl); initList(&bl); } int sum = 0; for (int i = 0; i < lines->size; i++) { if (argv[2][0] == 'b') { sum += decodeB(lines->lines[i]); } else if (argv[2][0] == 'a') { sum += decodeA(lines->lines[i]); } } printf("%d\n", sum); return 0; } int decodeB(const char *str) { int tens = -1; int ones = -1; int len = strlen(str); clears(fl); clears(bl); for (int i = 0; i < len; i++) { int front = str[i]; int back = str[len - 1 - i]; char num; if (tens < 0) { if (isalpha(front)) { pushs(fl, front); char *fw = contents(fl); num = getnumber(fw); free(fw); if (num > 0) { tens = num - 48; } } else { tens = front - 48; } } if (ones < 0) { if (isalpha(back)) { pushs(bl, back); char *bw = contentb(bl); num = getnumber(bw); free(bw); if (num > 0) { ones = num - 48; } } else { ones = back - 48; } } // printf("front %c, tens %d, back %d, ones %d\n", front, tens, back, ones); } return tens * 10 + ones; } int decodeA(const char *str) { int tens = -1; int ones = -1; int len = strlen(str); for (int i = 0; i < len; i++) { int front = str[i]; int back = str[len - 1 - i]; if (!isalpha(front) && tens < 0) { tens = front - 48; } if (!isalpha(back) && ones < 0) { ones = back - 48; } // printf("front %c, tens %d, back %d, ones %d\n", front, tens, back, ones); } return tens * 10 + ones; } char getnumber(const char *str) { if (strstr(str, "one") != NULL) { return '1'; } if (strstr(str, "two") != NULL) { return '2'; } if (strstr(str, "three") != NULL) { return '3'; } if (strstr(str, "four") != NULL) { return '4'; } if (strstr(str, "five") != NULL) { return '5'; } if (strstr(str, "six") != NULL) { return '6'; } if (strstr(str, "seven") != NULL) { return '7'; } if (strstr(str, "eight") != NULL) { return '8'; } if (strstr(str, "nine") != NULL) { return '9'; } return -1; }