1
0
advent-of-code-2025/day03.c
2025-12-12 11:29:07 +01:00

101 lines
2.2 KiB
C

#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;
}