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

87 lines
1.9 KiB
C

#define RT_CORE_IMPLEMENTATION
#include "rtcore.h"
#include "aoc.h"
int
main(int argc, char **argv)
{
arena arena = CreateArena();
dataset ds = ParseDatasetOption(argc, argv);
s8 input = {0};
if (ds == DS_FULL)
input = ReadEntireFileS8(S8("inputs/day06_full"), &arena);
else if (ds == DS_DEMO)
input = ReadEntireFileS8(S8("inputs/day06_demo"), &arena);
if (!input.data)
return 1;
i64 *cells = (i64 *)arena.begin;
char *ops = NULL;
i32 idx = 0;
i32 columns = -1;
i32 rows = 0;
/* First parse the matrix. */
split_result line = S8Split(input, '\n');
while (line.first.data)
{
i32 cols = 0;
split_result fields = S8Split2(S8Trim(line.first), ' ');
while (fields.first.data)
{
if (fields.first.data[0] == '*' || fields.first.data[0] == '+')
{
if (cols == 0)
{
arena.begin += idx * sizeof(i64);
ops = alloc(&arena, char, columns);
}
ops[cols] = fields.first.data[0];
}
else
{
s8_parse_i64_result r = S8ParseI64(fields.first, 10);
if (!r.ok)
return 1;
cells[idx++] = r.i;
}
++cols;
fields = S8Split2(fields.second, ' ');
}
assert(columns == -1 || columns == cols);
columns = cols;
++rows;
line = S8Split(S8Trim(line.second), '\n');
}
--rows; /* Don't count the ops */
i64 *results = alloc(&arena, i64, columns);
for (i32 i = 0; i < columns; ++i)
{
if (ops[i] == '+')
{
results[i] = 0;
for (i32 j = 0; j < rows; ++j)
{
results[i] += cells[j * columns + i];
}
}
else if (ops[i] == '*')
{
results[i] = 1;
for (i32 j = 0; j < rows; ++j)
{
results[i] *= cells[j * columns + i];
}
}
}
i64 answer = 0;
for (i32 i = 0; i < columns; ++i)
answer += results[i];
printf("Answer: %ld\n", answer);
return 0;
}