Advertisement
Guest User

[AOC 2024 - Day 09] C++ Implementation

a guest
Dec 9th, 2024
43
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.60 KB | Source Code | 0 0
  1. /* Advent of Code 2024
  2.  * Day 09
  3.  */
  4.  
  5. #include <vector>
  6. #include <unordered_map>
  7. #include <iostream>
  8. #include <algorithm>
  9. #include <sstream>
  10. #include <fstream>
  11.  
  12. std::vector<std::string> getLines(std::string filename)
  13. {
  14.     std::vector<std::string> puzzle;
  15.     std::string temp;
  16.     std::ifstream f(filename);
  17.     while (getline(f, temp))
  18.         puzzle.push_back(temp);
  19.     return puzzle;
  20. }
  21.  
  22. int charNumberToInt(char& character)
  23. {
  24.     int result = character - '0';
  25.     return result++;
  26. }
  27.  
  28. std::vector<int> createSpan(int pos, int length)
  29. {
  30.     std::vector<int> programPositions;
  31.     for (int i = pos; i < pos + length; i++)
  32.         programPositions.push_back(i);
  33.     return programPositions;
  34. }
  35.  
  36. void parseData(std::string& inputData, std::unordered_map<int, std::vector<int>>& fileSystem, std::vector<int>& freeSpace)
  37. {
  38.     int programID = 0;
  39.     std::vector<int> temp;
  40.     int length;
  41.     int free = 0;
  42.     for (int i = 0; i < inputData.length(); i++)
  43.     {
  44.         length = charNumberToInt(inputData[i]);
  45.         if ((i % 2) == 0) // every other is a file
  46.         {
  47.             fileSystem[programID] = createSpan(free, length);
  48.             if (fileSystem[programID].size() > 0)
  49.                 free = fileSystem[programID].back() + 1;
  50.             programID++;
  51.         }
  52.         else // every other is free
  53.         {
  54.             temp = createSpan(free, length);
  55.             if (temp.size() > 0)
  56.             {
  57.                 free = temp.back() + 1;
  58.                 freeSpace.insert(freeSpace.end(), temp.begin(), temp.end());
  59.             }
  60.  
  61.         }
  62.     }
  63. }
  64.  
  65. void defragment(std::unordered_map<int, std::vector<int>>& fileSystem, std::vector<int>& freeSpace)
  66. {
  67.     int free = freeSpace.front();
  68.     for (int i = fileSystem.size() - 1; i >= 0; i--)
  69.     {
  70.         for (int j = fileSystem[i].size() - 1; j >= 0; j--)
  71.         {
  72.             if (fileSystem[i][j] > free)
  73.             {
  74.                 fileSystem[i][j] = free;
  75.                 freeSpace.erase(freeSpace.begin());
  76.                 free = freeSpace.front();
  77.             }
  78.             else
  79.                 break;
  80.         }
  81.     }
  82. }
  83.  
  84. void parseData(std::string& inputData, std::unordered_map<int, std::vector<int>>& fileSystem, std::vector<std::vector<int>>& freeSpace)
  85. {
  86.     int programID = 0;
  87.     std::vector<int> temp;
  88.     int length;
  89.     int free = 0;
  90.     for (int i = 0; i < inputData.length(); i++)
  91.     {
  92.         length = charNumberToInt(inputData[i]);
  93.         if ((i % 2) == 0)
  94.         {
  95.             fileSystem[programID] = createSpan(free, length);
  96.             if (fileSystem[programID].size() > 0)
  97.                 free = fileSystem[programID].back() + 1;
  98.             programID++;
  99.         }
  100.         else
  101.         {
  102.             temp = createSpan(free, length);
  103.             if (temp.size() > 0)
  104.             {
  105.                 free = temp.back() + 1;
  106.                 freeSpace.push_back(temp);
  107.             }
  108.  
  109.         }
  110.     }
  111. }
  112.  
  113. std::vector<int> moveChunk(std::vector<int>& freeSector, std::vector<int>& chunk)
  114. {
  115.     for (int k = 0; k < chunk.size(); k++)
  116.         chunk[k] = freeSector[k];
  117.     freeSector.erase(freeSector.begin(), freeSector.begin() + (chunk.size()));
  118.     return freeSector;
  119. }
  120.  
  121. void defragmentChunks(std::unordered_map<int, std::vector<int>>& fileSystem, std::vector<std::vector<int>>& freeSpace, std::vector<int>& sortedPrograms)
  122. {
  123.     std::vector<int> free;
  124.     bool moved;
  125.     for (int sortedProgram : sortedPrograms)
  126.         for (int j = 0; j < freeSpace.size(); j++)
  127.             if (freeSpace[j].size() >= fileSystem[sortedProgram].size())
  128.                 if (fileSystem[sortedProgram][0] > freeSpace[j][0])
  129.                     freeSpace[j] = moveChunk(freeSpace[j], fileSystem[sortedProgram]);
  130.                 else
  131.                     break;
  132. }
  133.  
  134. long long calculateCheckSum(std::unordered_map<int, std::vector<int>>& fileSystem)
  135. {
  136.     long long checkSum = 0;
  137.     for (auto file : fileSystem)
  138.         for (int program : file.second)
  139.             checkSum += (file.first * program);
  140.     return checkSum;
  141. }
  142.  
  143. std::vector<int> getSortedKeys(std::unordered_map<int, std::vector<int>> unorderedMap)
  144. {
  145.     std::vector<int> sortedPrograms;
  146.     for (auto keyValuePair : unorderedMap)
  147.         sortedPrograms.push_back(keyValuePair.first);
  148.     std::sort(sortedPrograms.begin(), sortedPrograms.end());
  149.     std::reverse(sortedPrograms.begin(), sortedPrograms.end());
  150.     return sortedPrograms;
  151. }
  152.  
  153. int main()
  154. {
  155.  
  156.     std::vector<std::string> data = getLines("input.txt");
  157.     std::string inputData = data[0];
  158.     std::vector<int> freeSpace;
  159.     std::unordered_map<int, std::vector<int>> fileSystem;
  160.  
  161.     parseData(inputData, fileSystem, freeSpace);
  162.     defragment(fileSystem, freeSpace);
  163.  
  164.     long long checkSumPart1 = calculateCheckSum(fileSystem);
  165.  
  166.     // Part 2
  167.  
  168.     std::vector<std::vector<int>> freeChunks;
  169.     std::unordered_map<int, std::vector<int>> fileSystemPart2;
  170.  
  171.     parseData(inputData, fileSystemPart2, freeChunks);
  172.     std::vector<int> sortedPrograms = getSortedKeys(fileSystemPart2);
  173.     defragmentChunks(fileSystemPart2, freeChunks, sortedPrograms);
  174.  
  175.     long long checkSumPart2 = calculateCheckSum(fileSystemPart2);
  176.  
  177.     std::cout << checkSumPart1 << std::endl;
  178.     std::cout << checkSumPart2 << std::endl;
  179.  
  180.     return 0;
  181. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement