#include "../include/color.h" #include "../include/useful_funcs.h" #include #include #include #include void printDiskMap(std::vector &diskmap) { std::string numC = BOLDGREEN; for (int i = 0; i < diskmap.size(); i++) { if (diskmap[i] == -1) { numC = BOLDYELLOW; std::clog << RED "." << RESET; } else { std::clog << numC << diskmap[i] << RESET; } } std::clog << RESET << std::endl; } int main() { std::ifstream inputfile("example"); unsigned long long res = 0; if (!inputfile.is_open()) { std::cerr << "Could not open the file" << std::endl; return ENOENT; } std::vector diskmap; // create the disk map { std::string line; inputfile >> line; int id = 0; std::vector lineSplited = std::vector(line.begin(), line.end()); for (int i = 0; i < lineSplited.size(); i++) { for (int j = 0; j < lineSplited[i] - '0'; j++) { if (i % 2 == 0) { diskmap.push_back(id); } else { diskmap.push_back(-1); } } if (i % 2 == 0) { id++; } } } printDiskMap(diskmap); { int dotFound; auto offset = diskmap.begin(); int block_count; while (std::find(diskmap.begin(), diskmap.end(), -1) != diskmap.end()) { // Removes empty blocks at the end if (diskmap.back() == -1) { diskmap.pop_back(); continue; } // counts how many blocks are in file block_count = std::count(diskmap.end(), diskmap.begin(), diskmap.back()); while (true) { dotFound = std::find(offset, diskmap.end(), -1) - diskmap.begin(); if (std::count(diskmap.begin() + dotFound, diskmap.begin() + dotFound + block_count, -1) == block_count) { std::fill(diskmap.begin() + dotFound, diskmap.begin() + dotFound + block_count, diskmap.back()); for (int i = 0; i < block_count; i++) { diskmap.pop_back(); } break; } else { offset = diskmap.begin() + dotFound + block_count; } } printDiskMap(diskmap); } } for (int i = 0; i < diskmap.size(); i++) { res += i * diskmap[i]; } std::cout << CYAN "\nfilesystem checksum is: " << BOLDYELLOW << res << RESET << std::endl; }