diff --git a/lib/libflint b/lib/libflint index 92a787a..80ce772 160000 --- a/lib/libflint +++ b/lib/libflint @@ -1 +1 @@ -Subproject commit 92a787a899621aa0290ef746035596ad3485c70e +Subproject commit 80ce772c9c9ae5e459c0c10e1fae20738ca2f949 diff --git a/src/2023/01.c b/src/2023/01.c index 36382ba..f2f7eb2 100644 --- a/src/2023/01.c +++ b/src/2023/01.c @@ -1,13 +1,97 @@ #include #include +#include +#include #include "lfinput.h" +#include "lfstring.h" + +static int part_one(char **lines, size_t sz) { + int p1 = 0; + int first = 0, last = 0; + + for (size_t i = 0; i < sz; ++i) { + for (size_t j = 0; j < strlen(lines[i]); ++j) { + if (isdigit(lines[i][j])) { + first = lines[i][j] - '0'; + break; + } + } + + for (int j = (int)strlen(lines[i]) - 1; j >= 0; --j) { + if (isdigit(lines[i][j])) { + last = lines[i][j] - '0'; + p1 += first * 10 + last; + break; + } + } + } + + return p1; +} + +#define numwords_sz 9 + +static char *numwords[numwords_sz] = { + "one", + "two", + "three", + "four", + "five", + "six", + "seven", + "eight", + "nine" +}; + +static int part_two(char **lines, size_t sz) { + int p2 = 0; + int first = 0, last = 0; + + for (size_t i = 0; i < sz; ++i) { + for (size_t j = 0; j < strlen(lines[i]); ++j) { + if (isdigit(lines[i][j])) { + first = lines[i][j] - '0'; + goto LAST_LOOP; + } + for (size_t k = 0; k < numwords_sz; ++k) { + const char *s = substr(lines[i], j, strlen(numwords[k])); + if (s != NULL && strcmp(s, numwords[k]) == 0) { + first = (int)k + 1; + free(s); + goto LAST_LOOP; + } + free(s); + } + } + + LAST_LOOP: + for (int j = (int)strlen(lines[i]) - 1; j >= 0; --j) { + if (isdigit(lines[i][j])) { + last = lines[i][j] - '0'; + goto NEXT_LINE; + } + for (size_t k = 0; k < numwords_sz; ++k) { + const char *s = substr(lines[i], j, strlen(numwords[k])); + if (s != NULL && strcmp(s, numwords[k]) == 0) { + last = (int)k + 1; + free(s); + goto NEXT_LINE; + } + free(s); + } + } + + NEXT_LINE: + p2 += first * 10 + last; + } + + return p2; +} void advent2023day01(void) { size_t sz = 0; char **lines = get_lines("input/2023/01", &sz); - - - + printf("%d\n%d\n", part_one(lines, sz), part_two(lines, sz)); del_lines(lines); }