Advertisement
Guest User

--- Day 14: Docking Data ---

a guest
Dec 14th, 2020
323
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.03 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <sstream>
  4. #include <iterator>
  5. #include <string>
  6. #include <vector>
  7. #include <map>
  8.  
  9. std::map<unsigned long long, unsigned long long> result;
  10.  
  11. //void ApplyMask(unsigned long long address, unsigned long long value, std::string& mask)
  12. //{
  13. //  for (unsigned int i = 0; i < mask.size(); i++)
  14. //  {
  15. //      if (mask[i] == '1')
  16. //      {
  17. //          value |= 1ULL << (mask.size() - i - 1);
  18. //      }
  19. //      else if (mask[i] == '0')
  20. //      {
  21. //          value &= ~(1ULL << (mask.size() - i - 1));
  22. //      }
  23. //  }
  24. //
  25. //  result[address] = value;
  26. //}
  27.  
  28. void ApplyMask(unsigned long long address, unsigned long long value, std::string& mask)
  29. {
  30.     unsigned long long a = address;
  31.     for (unsigned int i = 0; i < mask.size(); i++)
  32.     {
  33.         if (mask[i] == '1')
  34.         {
  35.             a |= 1ULL << (mask.size() - i - 1);
  36.         }
  37.         else if (mask[i] == '0')
  38.         {
  39.             //a &= ~(1ULL << (mask.size() - i - 1));
  40.         }
  41.         else
  42.         {
  43.             mask[i] = '0';
  44.             a |= 1ULL << (mask.size() - i - 1);
  45.             ApplyMask(a, value, mask);
  46.             a &= ~(1ULL << (mask.size() - i - 1));
  47.             ApplyMask(a, value, mask);
  48.             mask[i] = 'X';
  49.         }
  50.     }
  51.  
  52.     result[a] = value;
  53. }
  54.  
  55. int main()
  56. {
  57.     std::string text;
  58.     std::ifstream ifs;
  59.     ifs.open("data.txt", std::ifstream::in);
  60.  
  61.     std::string mask;
  62.     unsigned long long answer = 0;
  63.     while (getline(ifs, text))
  64.     {
  65.         std::cout << text << std::endl;
  66.         std::istringstream iss(text);
  67.         std::vector<std::string> results((std::istream_iterator<std::string>(iss)), std::istream_iterator<std::string>());
  68.  
  69.         if (results[0] == "mask")
  70.         {
  71.             mask = results[2];
  72.         }
  73.         else
  74.         {
  75.             unsigned long long address = atoi(results[0].substr(4, results[0].size() - 3).c_str());
  76.             unsigned long long value = atoi(results[2].c_str());
  77.             ApplyMask(address, value, mask);
  78.         }
  79.     }
  80.  
  81.     for (std::map<unsigned long long, unsigned long long>::iterator i = result.begin(); i != result.end(); ++i)
  82.     {
  83.         std::cout << "Memory Address " << i->first << " = " << i->second << std::endl;
  84.         answer += i->second;
  85.     }
  86.  
  87.     std::cout << "Sum = " << answer << std::endl;
  88.  
  89.     return 0;
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement