87 lines
1.9 KiB
C
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;
|
|
}
|