diff --git a/d07.cc b/d07.cc index f65c674..5156595 100644 --- a/d07.cc +++ b/d07.cc @@ -2,6 +2,15 @@ #include #include +//#define BIGBOY +#if defined(BIGBOY) +#define TOTAL_SPACE 3000000000 +#define NEEDED_SPACE 700000000 +#else +#define TOTAL_SPACE 70000000 +#define NEEDED_SPACE 30000000 +#endif + using namespace std; enum FsNodeType { @@ -12,13 +21,26 @@ enum FsNodeType { struct FsNode { FsNodeType type; string name; - unsigned size; + size_t size; }; struct FsFile : FsNode { }; struct FsDir : FsNode { + ~FsDir() { + for (auto e : this->entries) { + FsNode *node = e.second; + if (node->type == NODE_DIR) { + FsDir *dir = (FsDir *)node; + delete dir; + } else if (node->type == NODE_FILE) { + FsFile *file = (FsFile *)node; + delete file; + } + } + this->entries.clear(); + } FsDir *parent; map entries; }; @@ -41,9 +63,9 @@ void print_node(FsNode *node, unsigned depth = 0) } } -unsigned calc_size(FsDir &dir) +size_t calc_size(FsDir &dir) { - unsigned size = 0; + size_t size = 0; for (auto e : dir.entries) { FsNode *node = e.second; @@ -76,7 +98,7 @@ FsDir parse() newdir->parent = dir; dir->entries[name] = newdir; } else { - unsigned size = stoi(first); + size_t size = stoll(first); FsFile *newfile = new FsFile; newfile->type = NODE_FILE; newfile->name = name; @@ -110,9 +132,9 @@ FsDir parse() return root; } -unsigned p1(const FsDir &dir) +size_t p1(const FsDir &dir) { - unsigned count = 0; + size_t count = 0; if (dir.size <= 100000) count += dir.size; for (auto e : dir.entries) { FsNode *node = e.second; @@ -121,42 +143,26 @@ unsigned p1(const FsDir &dir) return count; } -unsigned p2(const FsDir &dir, unsigned target = 0) +size_t p2(const FsDir &dir, size_t target = 0) { - if (!target) target = dir.size - 40000000; + if (!target) target = dir.size - (TOTAL_SPACE - NEEDED_SPACE); - unsigned smallest = 30000000; + size_t smallest = NEEDED_SPACE; if (dir.size >= target && dir.size < smallest) smallest = dir.size; for (auto e : dir.entries) { FsNode *node = e.second; if (node->type == NODE_DIR) { - unsigned size = p2(*(FsDir *)node, target); + size_t size = p2(*(FsDir *)node, target); if (size >= target && size < smallest) smallest = size; } } return smallest; } -void free_input(FsDir &dir) -{ - for (auto e : dir.entries) { - FsNode *node = e.second; - if (node->type == NODE_DIR) { - FsDir *dir = (FsDir *)node; - free_input(*dir); - delete dir; - } else if (node->type == NODE_FILE) { - FsFile *file = (FsFile *)node; - delete file; - } - } -} - int main() { auto input = parse(); cout << p1(input) << endl; cout << p2(input) << endl; - free_input(input); } diff --git a/d07_bigboy.txt.xz b/d07_bigboy.txt.xz new file mode 100644 index 0000000..1870660 Binary files /dev/null and b/d07_bigboy.txt.xz differ