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