Advertisement
Petrovi4

MakeJosephusPermutation

Aug 4th, 2022 (edited)
1,167
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.88 KB | None | 0 0
  1. #include <cassert>
  2. #include <iostream>
  3. #include <numeric>
  4. #include <vector>
  5. #include <list>
  6. #include <utility>
  7.  
  8. using namespace std;
  9.  
  10. template <typename RandomIt>
  11. void MakeJosephusPermutation(RandomIt first, RandomIt last, uint32_t step_size) {    
  12.     std::list<typename RandomIt::value_type> pool;    
  13.     std::move(first, last, std::back_inserter(pool) );
  14.    
  15.     size_t cur_pos = 0;
  16.  
  17.     while (!pool.empty()) {
  18.         typename std::list<typename RandomIt::value_type>::iterator position = pool.begin();
  19.         std::advance(position, cur_pos);
  20.         *first = std::move(*position);
  21.         std::advance(first, 1);
  22.         pool.erase(position);
  23.         if (pool.empty()) {
  24.             break;
  25.         }
  26.         cur_pos = std::move((cur_pos + step_size - 1) % pool.size());
  27.     }    
  28. }
  29.  
  30. vector<int> MakeTestVector() {
  31.     vector<int> numbers(10);
  32.     iota(begin(numbers), end(numbers), 0);
  33.     return numbers;
  34. }
  35.  
  36. void TestIntVector() {
  37.     const vector<int> numbers = MakeTestVector();
  38.     {
  39.         vector<int> numbers_copy = numbers;
  40.         MakeJosephusPermutation(begin(numbers_copy), end(numbers_copy), 1);
  41.         assert(numbers_copy == numbers);
  42.     }
  43.     {
  44.         vector<int> numbers_copy = numbers;
  45.         MakeJosephusPermutation(begin(numbers_copy), end(numbers_copy), 3);
  46.         assert(numbers_copy == vector<int>({0, 3, 6, 9, 4, 8, 5, 2, 7, 1}));
  47.     }
  48.    
  49.     std::cerr << " OK" << std::endl;
  50. }
  51.  
  52. // Это специальный тип, который поможет вам убедиться, что ваша реализация
  53. // функции MakeJosephusPermutation не выполняет копирование объектов.
  54. // Сейчас вы, возможно, не понимаете как он устроен, однако мы расскажем
  55. // об этом далее в нашем курсе
  56.  
  57. struct NoncopyableInt {
  58.     int value;
  59.  
  60.     NoncopyableInt(const NoncopyableInt&) = delete;
  61.     NoncopyableInt& operator=(const NoncopyableInt&) = delete;
  62.  
  63.     NoncopyableInt(NoncopyableInt&&) = default;
  64.     NoncopyableInt& operator=(NoncopyableInt&&) = default;
  65. };
  66.  
  67. bool operator==(const NoncopyableInt& lhs, const NoncopyableInt& rhs) {
  68.     return lhs.value == rhs.value;
  69. }
  70.  
  71. ostream& operator<<(ostream& os, const NoncopyableInt& v) {
  72.     return os << v.value;
  73. }
  74.  
  75. void TestAvoidsCopying() {
  76.     vector<NoncopyableInt> numbers;
  77.     numbers.push_back({1});
  78.     numbers.push_back({2});
  79.     numbers.push_back({3});
  80.     numbers.push_back({4});
  81.     numbers.push_back({5});
  82.  
  83.     MakeJosephusPermutation(begin(numbers), end(numbers), 2);
  84.  
  85.     vector<NoncopyableInt> expected;
  86.     expected.push_back({1});
  87.     expected.push_back({3});
  88.     expected.push_back({5});
  89.     expected.push_back({4});
  90.     expected.push_back({2});
  91.  
  92.     assert(numbers == expected);
  93. }
  94.  
  95. int main() {
  96.     TestIntVector();
  97.     TestAvoidsCopying();
  98. }
Advertisement
Comments
  • giGii
    1 year
    # text 0.15 KB | 0 0
    1. Вот я припотел на этой задаче! Похоже сделал, но будто на интуиции. Сложно тема идет :(
Add Comment
Please, Sign In to add comment
Advertisement