101 lines
2.2 KiB
C
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;
|
|
}
|