Advertisement
Guest User

Untitled

a guest
Mar 27th, 2017
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.36 KB | None | 0 0
  1. #include <iostream>
  2. #include <random>
  3. #include <algorithm>
  4. #include <array>
  5. #include <numeric>
  6. #include <list>
  7. #include <string>
  8.  
  9. const size_t CARDS_COUNT = 250;
  10. const size_t DIGITS_COUNT = 16;
  11.  
  12. const size_t BUCKET_SIZE = 4;
  13. const size_t BUCKETS_PER_CARD = DIGITS_COUNT / BUCKET_SIZE;
  14.  
  15. typedef std::array<int, DIGITS_COUNT> CardDigits;
  16. typedef std::array<int, BUCKET_SIZE> CardBucket;
  17.  
  18. typedef std::vector<CardBucket> CardsVector;
  19.  
  20. CardsVector generate_cards()
  21. {
  22. CardsVector digits;
  23.  
  24. std::random_device rd;
  25. std::mt19937 gen(rd());
  26. std::uniform_int_distribution<int> dist(0, 9);
  27.  
  28. for (size_t i = 0; i < CARDS_COUNT * BUCKETS_PER_CARD; ++i)
  29. {
  30. digits.push_back(CardBucket());
  31. for (size_t j = 0; j < BUCKET_SIZE; ++j)
  32. digits.back()[j] = dist(gen);
  33. }
  34.  
  35. return digits;
  36. }
  37.  
  38. CardDigits get_card_digits(CardsVector::const_iterator first)
  39. {
  40. std::array<int, DIGITS_COUNT> digits;
  41.  
  42. for (size_t i = 0; i < BUCKETS_PER_CARD; ++i, ++first)
  43. for (size_t j = 0; j < BUCKET_SIZE; ++j)
  44. digits[i * BUCKET_SIZE + j] = first->at(j);
  45.  
  46. return digits;
  47. }
  48.  
  49. bool is_valid_card(CardDigits digits)
  50. {
  51. for (size_t i = 0; i < DIGITS_COUNT; i += 2)
  52. if (digits[i] *= 2 > 9)
  53. digits[i] -= 9;
  54.  
  55. return std::accumulate(digits.begin(), digits.end(), 0) % 10 == 0;
  56. }
  57.  
  58. void part2_print_valid(CardsVector& vecArr)
  59. {
  60. for (size_t i = 0; i < vecArr.size();)
  61. {
  62. CardsVector::const_iterator begin = vecArr.begin() + i;
  63.  
  64. CardDigits card = get_card_digits(begin);
  65.  
  66. if (is_valid_card(card))
  67. {
  68. std::cout << "card #" << i / BUCKETS_PER_CARD << "\t<";
  69. for (int digit : card)
  70. std::cout << digit;
  71. std::cout << "> - Ok\n";
  72.  
  73. vecArr.erase(begin, begin + BUCKETS_PER_CARD);
  74. }
  75. else
  76. i += BUCKETS_PER_CARD;
  77. }
  78.  
  79. std::cout << "Total number of fake cards equals to " << vecArr.size() / BUCKETS_PER_CARD << '\n';
  80. }
  81.  
  82. void part3_sort_and_print(CardsVector& vecArr)
  83. {
  84. std::sort(vecArr.begin(), vecArr.end(), [](const CardBucket& left, const CardBucket& right)
  85. {
  86. return std::accumulate(left.begin(), left.end(), 0) < std::accumulate(right.begin(), right.end(), 0);
  87. });
  88.  
  89. const size_t DISPLAY_ITEMS_COUNT = 7;
  90. if (vecArr.size() < DISPLAY_ITEMS_COUNT)
  91. std::cout << "VecArr size is less than " << DISPLAY_ITEMS_COUNT << '\n';
  92. else
  93. {
  94.  
  95. for (size_t i = 0; i < DISPLAY_ITEMS_COUNT; ++i)
  96. {
  97. std::cout << "VecArr[" << i << "]\t<";
  98. for (int digit : vecArr[i])
  99. std::cout << digit;
  100. std::cout << ">\n";
  101. }
  102.  
  103. std::cout << "... ... ...\n";
  104.  
  105. for (size_t i = vecArr.size() - DISPLAY_ITEMS_COUNT; i < vecArr.size(); ++i)
  106. {
  107. std::cout << "VecArr[" << i << "]\t<";
  108. for (int digit : vecArr[i])
  109. std::cout << digit;
  110. std::cout << ">\n";
  111. }
  112. }
  113. }
  114.  
  115. void part4_clear(CardsVector& vecArr)
  116. {
  117. vecArr.clear();
  118. vecArr.shrink_to_fit();
  119. }
  120.  
  121. void part5_list_and_move()
  122. {
  123. const char indicator = '*';
  124.  
  125. std::list<std::string> ListStr1{ "re*pr*esentative", "operati*o*n", "re*gr*et", "ex*am*ple", "lim*It*" };
  126. std::list<std::string> ListStr2;
  127.  
  128. while (!ListStr1.empty())
  129. {
  130. std::string& s = ListStr1.front();
  131.  
  132. size_t begin = s.find(indicator) + 1;
  133. size_t end = s.rfind(indicator);
  134.  
  135. s = s.substr(begin, end - begin);
  136.  
  137. ListStr2.splice(ListStr2.begin(), ListStr1, ListStr1.begin());
  138. }
  139.  
  140. std::cout << "Part 5 - moving from ListStr1 to ListStr2\nListStr1: (size = 0)\nListStr2: ";
  141. for (std::string& s : ListStr2)
  142. std::cout << s;
  143. std::cout << " (size = " << ListStr2.size() << ")\n";
  144. }
  145.  
  146. int main()
  147. {
  148. CardsVector vecArr = generate_cards();
  149. std::cout << "Part 1 - all elements of VecArr got the values\n";
  150.  
  151. std::cout << "Part 2 - valid card numbers\n";
  152. part2_print_valid(vecArr);
  153.  
  154. std::cout << "Part 3 - sorted vector\n";
  155. part3_sort_and_print(vecArr);
  156.  
  157. part4_clear(vecArr);
  158. std::cout << "Part 4 - the current size of VecArr[] equals to <" << vecArr.size() << ">\n";
  159.  
  160. part5_list_and_move();
  161.  
  162. std::cout.flush();
  163.  
  164. system("pause");
  165. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement