#include "common.h" #include namespace aoc2022 { struct cube { int dx; int dy; int dz; char* ds = nullptr; char& get(int x, int y, int z) { static char none{0}; bool bx = x >= 0 && x < dx; bool by = y >= 0 && y < dy; bool bz = z >= 0 && z < dz; return (bx && by && bz) ? *(ds + z * (dx * dy) + y * dx + x) : none; } cube(int x, int y, int z) : dx(x), dy(y), dz(z) { ds = (char*)malloc(x * y * z); memset(ds, 0, x * y * z); } template void traverse(F&& f, Args&&... args) { for (int z = 0; z < dz; z++) { for (int y = 0; y < dy; y++) { for (int x = 0; x < dx; x++) { f(x, y, z, std::forward(args)...); } } } } }; struct droplet { int x = 0; int y = 0; int z = 0; void get_number(const char** pp, int* d) { const char* p = *pp; while (*p >= '0' && *p <= '9') { *d = *d * 10 + *p - '0'; p++; } *pp = p; } void print() const noexcept { printf("%d,%d,%d\n", x, y, z); } friend bool operator<(droplet d1, droplet d2) { return d1.z < d2.z ? true : d1.z > d2.z ? false : d1.y < d2.y ? true : d1.y > d2.y ? false : d1.x < d2.x; } droplet(int xx, int yy, int zz) : x(xx), y(yy), z(zz) {} droplet(line_view lv) { const char* p = lv.line; int* ds[] = {&x, &y, &z}; int i{0}; while (p < lv.line + lv.length) { get_number(&p, ds[i++]); p++; } } }; std::pair day18(line_view); } // namespace aoc2022