C23, day6 bigboy in 111 ms
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
typedef struct {HANDLE f_, m_; char* begin, *end; } MmFile;
MmFile Map(const char* s) {
MmFile f = {0, NULL, 0, 0};
do {
f.f_ = CreateFile(s, GENERIC_READ, FILE_SHARE_READ,
0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (f.f_ == INVALID_HANDLE_VALUE) break;
LARGE_INTEGER z;
if (!GetFileSizeEx(f.f_, &z)) break;
f.m_ = CreateFileMapping(f.f_, 0, PAGE_READONLY, 0, 0, 0);
if (f.m_ == NULL) break;
f.begin = (char*)MapViewOfFile(f.m_, FILE_MAP_READ, 0, 0, 0);
if (!f.begin) break;
f.end = f.begin + z.QuadPart;
} while (0);
return f;
}
void UnMap(MmFile* f) {
if (f->begin) UnmapViewOfFile(f->begin);
if (f->m_ != NULL) CloseHandle(f->m_);
if (f->f_ != INVALID_HANDLE_VALUE) CloseHandle(f->f_);
}
#include<stdio.h>
int main(int argc, char** args) {
if (argc != 2) return puts("Missing filename");
auto in = Map(args[1]);
size_t w = 0; auto a = in.begin;
for (auto it = in.begin; it != in.end; ++it)
if (*it == '\n') { w = it - in.begin + 1; break; }
if (!w) return puts("No end line!");
size_t size = in.end - in.begin, p1 = 0, p2 = 0;
for (size_t e = size - w + (a[size - 1] != '\n'), x = size; x-- > e;) {
int o = a[x];
if (o < '*') continue;
size_t r = o == '*';
for (auto y = x - e; y < e; y += w) {
size_t n = 0, l = 0;
for (auto i = y; i < e; ++i) {
int c = a[i]; unsigned d = c - '0';
if (d <= 9) n = n * 10 + d, ++l;
else if (n && c <= ' ') break;
}
if (l) { if(o == '*') r *= n; else r += n; }
}
p1 += r;
}
for (size_t o = 0, r = 0, x = 0; x < w; ++x) {
if (a[x] == '\n') { p2 += r; break; }
size_t n = 0, l = 0;
for (auto y = x; y < size; y += w) {
int c = a[y]; unsigned d = c - '0';
if (d <= 9) n = n * 10 + d, ++l;
else if (c >= '*') p2 += r, r = c == '*', o = c;
}
if (l) { if (o == '*') r *= n; else r += n; }
}
printf("%llu\n%llu", p1, p2);
UnMap(&in);
}