Advertisement
Guest User

aoc d5p2

a guest
Dec 5th, 2023
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.65 KB | Source Code | 0 0
  1. #include <algorithm>
  2. #include <boost/algorithm/string.hpp>
  3. #include <iostream>
  4. #include <string>
  5. #include <vector>
  6.  
  7. // VECtor Of VECtors
  8. typedef std::vector<std::vector<long int>> vecovec;
  9.  
  10. // Nx2 matrix containing seed ranges
  11. void make_seeds(vecovec *vec);
  12.  
  13. // Mx3 matrix containing maps
  14. void make_vector(vecovec *vec);
  15.  
  16. // function to sort a VecOVec acc. to given index of inner vectors
  17. void sort_vecovec(vecovec *vec, size_t index);
  18.  
  19. // find overlaps, apply conversions and store in new vectors
  20. // no reductions in ranges here
  21. void overlap(vecovec *v1, vecovec *v2, vecovec *newvec);
  22.  
  23. int main() {
  24.  
  25.   // Declaring v1 arrays
  26.   // Nx2 vecovecs to contain ranges of seeds, soils, etc
  27.   vecovec seeds;
  28.   vecovec soil;
  29.   vecovec fert;
  30.   vecovec water;
  31.   vecovec light;
  32.   vecovec temp;
  33.   vecovec humid;
  34.   vecovec loc;
  35.  
  36.   // Declaring v2 arrays
  37.   // Mx3 vecovecs to contain conversion maps
  38.   vecovec seed2soil;
  39.   vecovec soil2fert;
  40.   vecovec fert2water;
  41.   vecovec water2light;
  42.   vecovec light2temp;
  43.   vecovec temp2humid;
  44.   vecovec humid2loc;
  45.  
  46.   // Creating Nx2 vecovec for seeds ranges
  47.   make_seeds(&seeds);
  48.  
  49.   // Creating Mx3 maps
  50.   make_vector(&seed2soil);
  51.   make_vector(&soil2fert);
  52.   make_vector(&fert2water);
  53.   make_vector(&water2light);
  54.   make_vector(&light2temp);
  55.   make_vector(&temp2humid);
  56.   make_vector(&humid2loc);
  57.  
  58.   // Sorting vevecs by index
  59.   sort_vecovec(&seeds, 0);
  60.   sort_vecovec(&seed2soil, 1);
  61.   sort_vecovec(&soil2fert, 1);
  62.   sort_vecovec(&fert2water, 1);
  63.   sort_vecovec(&water2light, 1);
  64.   sort_vecovec(&light2temp, 1);
  65.   sort_vecovec(&temp2humid, 1);
  66.   sort_vecovec(&humid2loc, 1);
  67.  
  68.   // Checking Overlaps
  69.   overlap(&seeds, &seed2soil, &soil);
  70.   overlap(&soil, &soil2fert, &fert);
  71.   overlap(&fert, &fert2water, &water);
  72.   overlap(&water, &water2light, &light);
  73.   overlap(&light, &light2temp, &temp);
  74.   overlap(&temp, &temp2humid, &humid);
  75.   overlap(&humid, &humid2loc, &loc);
  76.  
  77.   // find the minimum of the starts of the ranges in loc
  78.   long int minimum{loc[0][0]};
  79.   for (auto i : loc) {
  80.     if (i[0] < minimum) {
  81.       minimum = i[0];
  82.     }
  83.   }
  84.   std::cout << "Minimum : " << minimum << std::endl;
  85.  
  86.   return 0;
  87. }
  88.  
  89. // FUNCTIONS
  90.  
  91. // take first line of input and extract seed ranges in a Nx2 vecovec
  92. void make_seeds(vecovec *vec) {
  93.   std::string sentence;
  94.   std::clog << "Enter the input" << std::endl;
  95.   // continue getting lines from input
  96.   while (std::getline(std::cin, sentence)) {
  97.     // until empty line encountered
  98.     if (sentence == " " || sentence == "") {
  99.       break;
  100.     }
  101.     // if seeds: found in the sentence
  102.     else if (sentence.find("seeds:") != std::string::npos) {
  103.       std::vector<std::string> words;
  104.       // split with empty space as delimiter and store in vector 'words'
  105.       boost::split(words, sentence, boost::is_any_of(" "),
  106.                    boost::token_compress_on);
  107.       // convert string to long int and push pair of range to a vecovec
  108.       for (unsigned long int i = 1; i < words.size(); i += 2) {
  109.         std::vector<long int> pair;
  110.         pair.push_back(stol(words[i]));
  111.         pair.push_back(stol(words[i + 1]));
  112.         // pair.push_back(stol(words[i]) + stol(words[i + 1]) - 1);
  113.         vec->push_back(pair);
  114.       }
  115.     }
  116.   }
  117. }
  118.  
  119. // make vecovec for conversion maps
  120. void make_vector(vecovec *vec) {
  121.   std::string sentence;
  122.   while (std::getline(std::cin, sentence)) {
  123.     if (sentence == " " || sentence == "") {
  124.       break;
  125.     } else if (sentence[sentence.length() - 1] == ':') {
  126.       continue;
  127.     } else {
  128.       std::vector<std::string> words;
  129.       boost::split(words, sentence, boost::is_any_of(" "),
  130.                    boost::token_compress_on);
  131.       std::vector<long int> v;
  132.       v.push_back(stol(words[0]));
  133.       v.push_back(stol(words[1]));
  134.       v.push_back(stol(words[2]));
  135.  
  136.       vec->push_back(v);
  137.     }
  138.   }
  139. }
  140.  
  141. // sort vecovec acc to index of inner vectors
  142. void sort_vecovec(vecovec *vec, size_t index) {
  143.   std::sort(
  144.       vec->begin(), vec->end(),
  145.       [index](const std::vector<long int> &a, const std::vector<long int> &b) {
  146.         return a[index] < b[index];
  147.       });
  148. }
  149.  
  150. void overlap(vecovec *v1, vecovec *v2, vecovec *newvec) {
  151.   // v1 is Nx2 ranges and v2 is Mx3 map
  152.   // newvec is the Nx2 vecovec filled based on overlaps and conversions
  153.  
  154.   for (auto i = 0UL; i < v1->size(); i++) {
  155.     long int v1_start{v1->at(i)[0]};
  156.     long int v1_range{v1->at(i)[1]};
  157.     long int v1_end{v1_start + v1_range - 1};
  158.  
  159.     // since v2 has continuous range
  160.     long int v2_smallest{v2->at(0)[1]};
  161.     long int v2_largest{v2->at(v2->size() - 1)[1] + v2->at(v2->size() - 1)[2] -
  162.                         1};
  163.     // if v1[i] completely outside v2 range
  164.     if (v1_start > v2_largest || v1_end < v2_smallest) {
  165.       // push v1[i] as it is
  166.       std::vector<long int> temp;
  167.       temp.push_back(v1_start);
  168.       temp.push_back(v1_range);
  169.       newvec->push_back(temp);
  170.       continue;
  171.     }
  172.     // if v1[i] has partial overlap at v2 's beginning
  173.     else if (v1_start < v2_smallest && v1_end >= v2_smallest) {
  174.       // push the outside part as it is
  175.       std::vector<long int> temp;
  176.       temp.push_back(v1_start);
  177.       temp.push_back(v2_smallest - v1_start);
  178.       newvec->push_back(temp);
  179.     }
  180.     // if v1[i] has partial overlap at v2 's end
  181.     else if (v1_start <= v2_largest && v1_end > v2_largest) {
  182.       // push the outside part as it is
  183.       std::vector<long int> temp;
  184.       temp.push_back(v2_largest + 1);
  185.       temp.push_back(v1_end - v2_largest);
  186.       newvec->push_back(temp);
  187.     }
  188.     // deal with any overlaps now
  189.     for (auto j = 0UL; j < v2->size(); j++) {
  190.       // conversion factor of v2[j]
  191.       long int conversion_factor{v2->at(j)[0] - v2->at(j)[1]};
  192.       long int v2_start{v2->at(j)[1]};
  193.       long int v2_range{v2->at(j)[2]};
  194.       long int v2_end{v2_start + v2_range - 1};
  195.  
  196.       // if end of v1[i] is less than start of a v2[j]
  197.       // break because v2 is sorted and will get bigger
  198.       if (v1_end < v2_start) {
  199.         break;
  200.       }
  201.  
  202.       // if start of v1[i] is greater than v2[j] skip to next j
  203.       // since v2 is sorted
  204.       else if (v1_start > v2_end) {
  205.         continue;
  206.       }
  207.  
  208.       // if v1[i] overlaps with v2[j]
  209.       else {
  210.         long int overlap_start{std::max(v1_start, v2_start)};
  211.         long int overlap_end{std::min(v1_end, v2_end)};
  212.         long int overlap_range{overlap_end - overlap_start + 1};
  213.  
  214.         // create a temporary vector to then push into the vecovec
  215.         std::vector<long int> temp;
  216.         temp.push_back(overlap_start + conversion_factor);
  217.         temp.push_back(overlap_range);
  218.         newvec->push_back(temp);
  219.       }
  220.     }
  221.   }
  222. }
  223.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement