#define RT_CORE_IMPLEMENTATION #include "rtcore.h" #include "aoc.h" global_variable i64 _exponents[12] = { 100000000000, /* 10^11 */ 10000000000, /* 10^10 */ 1000000000, /* 10^9 */ 100000000, /* 10^8 */ 10000000, /* 10^7 */ 1000000, /* 10^6 */ 100000, /* 10^5 */ 10000, /* 10^4 */ 1000, /* 10^3 */ 100, /* 10^2 */ 10, /* 10^1 */ 1, /* 10^0 */ }; int main(int argc, char **argv) { (void)_exponents; arena arena = CreateArena(); dataset ds = ParseDatasetOption(argc, argv); s8 input = {0}; if (ds == DS_FULL) input = ReadEntireFileS8(S8("inputs/day03_full"), &arena); else if (ds == DS_DEMO) input = ReadEntireFileS8(S8("inputs/day03_demo"), &arena); if (!input.data) return 1; split_result split = S8Split(input, '\n'); i64 total = 0; while (split.second.data) { s8 bank = S8Trim(split.first); assert(bank.length >= 12); printf("%.*s - ", (int)bank.length, bank.data); i64 max = 0; s8 workbank = bank; isize selected[12] = {}; i64 val = 0; memset(selected, -1, sizeof(selected)); for (isize digit = 0; digit < 12; ++digit) { /* 11 - digit is the number of digits that need to * fit into the remaining string */ isize limit = workbank.length - (11 - digit); i32 max = -1; for (isize i = 0; i < limit; ++i) { i32 v = workbank.data[i] - '0'; if (v > max) { max = v; selected[digit] = i; } } workbank.data += selected[digit] + 1; workbank.length -= selected[digit] + 1; if (digit > 0) selected[digit] += selected[digit - 1] + 1; val += _exponents[digit] * (bank.data[selected[digit]] - '0'); } printf("%ld\n", val); total += val; #if 0 i32 max = 0; for (isize first = 0; first < bank.length - 1; ++first) { i32 tens = (i32)(bank.data[first] - '0') * 10; for (isize second = first + 1; second < bank.length; ++second) { i32 ones = (i32)(bank.data[second] - '0'); i32 joltage = tens + ones; if (joltage > max) max = joltage; } } printf("%d\n", max); #endif total += max; split = S8Split(split.second, '\n'); } printf("Answer: %ld\n", total); return 0; }