C, bigboy: https://0x0.st/KJ12.txt
Memory mapping + custom parsing instead division/modulus:
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
typedef struct { HANDLE f_, m_; PBYTE begin, end; } MemFile;
void Map(const char* s, MemFile* o) {
o->m_ = NULL, o->begin = o->end = 0;
o->f_ = CreateFile(s, GENERIC_READ, FILE_SHARE_READ,
0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (o->f_ == INVALID_HANDLE_VALUE) return;
LARGE_INTEGER z;
if (!GetFileSizeEx(o->f_, &z)) return;
o->m_ = CreateFileMapping(o->f_, 0, PAGE_READONLY, 0, 0, 0);
if (o->m_ == NULL) return;
o->begin = (const PBYTE)MapViewOfFile(o->m_, FILE_MAP_READ, 0, 0, 0);
if (!o->begin) return;
o->end = o->begin + z.QuadPart;
}
void UnMap(MemFile* o) {
if (o->begin) UnmapViewOfFile(o->begin);
if (o->m_ != NULL) CloseHandle(o->m_);
if (o->f_ != INVALID_HANDLE_VALUE) CloseHandle(o->f_);
}
#include<stdio.h>
typedef unsigned long long N;
N getN(const unsigned char* buf, int n) {
N res = 0;
for (int i = 0; i < n; ++i) res = res * 10 + buf[i];
return res;
}
int main(int argc, char** args) {
if (argc < 2) return puts("Missing filename");
MemFile in; Map(args[1], &in);
N silver = 0, gold = 0, g = 0, n = 0;
unsigned d = 0, u = 0, c = 0, m = 0, dial = 50, left = 0;
const N max = 10'000'000'000'000'000'000ull;
unsigned char buf[24];
for (auto it = in.begin; it != in.end; ++it)
c = *it, u = c - '0',
u <= 9 ?
buf[d++] = u :
c == '\n' ?
u = d < 3 ? 0 : d - 2,
n = getN(buf, u),
m = getN(buf + u, d - u),
gold += n,
gold += dial && (left ? dial <= m : dial + m >= 100),
gold >= max && (gold -= max, ++g),
dial += left ? 100 - m : m,
dial >= 100 && (dial -= 100),
silver += dial == 0,
m = d = n = 0 :
!d && (left = c == 'L');
printf("%llu\n%llu%llu", silver, g, gold);
UnMap(&in);
}