#include using namespace std; class Directory; struct File{ string name; long size; }; class Directory{ public: Directory* parent; string name; vector subdirectories; vector files; long container_size; ~Directory(){ for(auto d : subdirectories){ delete d; } subdirectories.clear(); for(auto f : files){ delete f; } files.clear(); } Directory (Directory* parent, const string& name) : parent(parent), name(name){ subdirectories.clear(); files.clear(); container_size = 0; } Directory* getDirectoryPointerFromSubdirectories(const string& s) const{ for(auto d : subdirectories){ if(d->name == s){ return d; } } return nullptr; } long getContainerSize(){ if(container_size > 0){ // Risky assumption, but then again this is just playground code right return container_size; } long result = 0; for(auto f : files){ result += f->size; } for(auto s : subdirectories){ result += s->getContainerSize(); } container_size = result; return result; } long getAnswer(long max_size){ long result = 0; long c = getContainerSize(); if(c <= max_size){ result += c; } for(auto d : subdirectories){ result += d->getAnswer(max_size); } return result; } long getAnswerPartTwo(long max_size){ } }; using ChangeDirectory = string; using List = vector; using Command = variant; int main(){ ifstream input_file("input.txt"); string line; vector commands; List current_list; bool reading_list = false; // Parsing the input so it is nicer to handle later on while(getline(input_file, line)){ if(line[0] == '$'){ if(reading_list){ commands.push_back(current_list); current_list.clear(); reading_list = false; } stringstream ss(line); string _, comm; ss >> _ >> comm; if(comm == "cd"){ ChangeDirectory dir; ss >> dir; commands.push_back(dir); } else{ reading_list = true; } } else{ current_list.push_back(line); } } if(reading_list){ commands.push_back(current_list); reading_list = false; } // Setting up initial, empty directory Directory main_directory(nullptr, "root"); Directory* cur_dir = &main_directory; // Mapping out the file directory from all the commands for(auto c : commands){ if(c.index() == 0){ // So it is cd command ChangeDirectory dir = get<0>(c); if(dir == "/"){ continue; } else if(dir == ".."){ if(cur_dir->name != "root"){ cur_dir = cur_dir->parent; } } else{ auto p = cur_dir->getDirectoryPointerFromSubdirectories(dir); if(p){ cur_dir = p; } } } else{ // So it is a ls command List& listing = get<1>(c); for(auto s : listing){ stringstream ss(s); string first, second; ss >> first >> second; if(first == "dir"){ Directory* child = new Directory(cur_dir, second); cur_dir->subdirectories.push_back(child); } else{ File* f = new File{second, stol(first)}; cur_dir->files.push_back(f); } } } } // long result = main_directory.getContainerSize(); long result = main_directory.getAnswer(100000); cout << result << endl; // Printing parsed commands // for(auto c : commands){ // if(c.index() == 0){ // cout << "$ cd " << get<0>(c) << '\n'; // } else{ // cout << "$ ls\n"; // for(auto s : get<1>(c)){ // cout << s << '\n'; // } // } // } // Printing generated tree // cout << "- / (dir)" << endl; // for(auto d : main_directory.subdirectories){ // cout << "\t- " << d->name << "(dir)\n"; // } // for(auto f : main_directory.files){ // cout << "\t- " << f->name << " (file, size=" << f->size << ")\n"; // } // delete cur_dir; return 0; }