fork(1) download
  1. #include <iostream>
  2. #include <cstdint>
  3. #include <vector>
  4. #include <algorithm>
  5. #include <tuple>
  6. #include <random>
  7.  
  8. typedef std::uint8_t Word;
  9. typedef std::vector<Word> DType;
  10. typedef std::vector<DType> DTypes;
  11. typedef std::tuple<DType, std::size_t> Data;
  12.  
  13. Data BlockSort_Enc(const DType& In) {
  14. std::vector<std::tuple<Word, std::size_t>> D;
  15.  
  16. for (std::size_t i = 0; i < In.size(); i++) {
  17. D.push_back({ In[i],i });
  18. }
  19.  
  20. auto DD = D;
  21. auto A = D;
  22. auto B = D;
  23. auto& X = D;
  24.  
  25. std::stable_sort(D.begin(), D.end(), [&](auto& AA, auto& BB) {
  26. std::rotate(A.begin(), A.begin() + (std::get<1>(AA) % A.size()), A.end());
  27. std::rotate(B.begin(), B.begin() + (std::get<1>(BB) % B.size()), B.end());
  28.  
  29. for (std::size_t i = 0; i < X.size(); i++) {
  30. if (std::get<0>(A[i]) != std::get<0>(B[i])) {
  31. auto AR = std::get<0>(A[i]);
  32. auto BR = std::get<0>(B[i]);
  33. A = B = DD;
  34. return std::isless(AR, BR);
  35. }
  36. }
  37. A = B = DD;
  38. return false;
  39. });
  40.  
  41. DType R;
  42. std::size_t L = 0;
  43.  
  44. for (std::size_t i = 0; i < D.size(); i++) {
  45. R.push_back(In[(std::get<1>(D[i]) + In.size() - 1) % In.size()]);
  46. if (std::get<1>(D[i]) == 0) { L = i; }
  47. }
  48.  
  49. return { R,L };
  50.  
  51. }
  52.  
  53.  
  54. DType BlockSort_Dec(const DType& D, std::size_t N, const DType& O, const Data& A) {
  55. std::vector<std::tuple<Word, std::size_t>> V;
  56. DType R;
  57.  
  58. for (std::size_t i = 0; i < D.size(); i++) {
  59. V.push_back({ { D[i] }, i });
  60. }
  61.  
  62. std::stable_sort(V.begin(), V.end(), [](auto& A, auto& B) {return std::isless(std::get<0>(A), std::get<0>(B)); });
  63.  
  64. for (std::size_t i = 0; i < V.size(); i++) {
  65. N = std::get<1>(V[N]);
  66. R.push_back(D[N]);
  67. }
  68. //std::rotate(R.begin(), R.begin()+1, R.end());
  69. //std::rotate(R.begin(), R.end()-N, R.end());
  70. //std::reverse(R.begin(), R.end());
  71.  
  72. return R;
  73. }
  74.  
  75. DType MakeCacao() {
  76. DType R = { 'c','a','c','a','o' };
  77.  
  78. return R;
  79. }
  80.  
  81. DType Make_cdebaaaa() {
  82. DType R = { 'c','d','e','b','a','a','a','a' };
  83.  
  84. return R;
  85. }
  86. DType MakePapaya() {
  87. DType R = { 'p','a','p','a','y','a', };
  88.  
  89. return R;
  90. }
  91. DType MakeBanana() {
  92. DType R = { 'b','a','n','a','n','a', };
  93.  
  94. return R;
  95. }
  96. DType MakeVecor(std::size_t L, unsigned int S = 0) {
  97. DType R;
  98. std::mt19937 mt(S);
  99. std::uniform_int_distribution<int> ui(0, 255);
  100. for (std::size_t i = 0; i < L; i++) {
  101. R.push_back(ui(mt));
  102. }
  103.  
  104. return R;
  105. }
  106. DType MakeVecor2(std::size_t L, unsigned int S = 0) {
  107. DType R;
  108. std::mt19937 mt(S);
  109. std::uniform_int_distribution<int> ui('A', 'z');
  110. for (std::size_t i = 0; i < L; i++) {
  111. R.push_back(ui(mt));
  112. }
  113.  
  114. return R;
  115. }
  116.  
  117. bool Show(const DType& In) {
  118. for (auto& o : In) {
  119. std::cout << o << ',';
  120. }
  121.  
  122. std::cout << std::endl;
  123.  
  124. return true;
  125. }
  126. int main() {
  127. //auto D = MakeCacao();
  128. //auto D = Make_cdebaaaa();
  129. //auto D = MakePapaya();
  130. //auto D = MakeBanana();
  131. auto D = MakeVecor2(8, 2);
  132. //auto D = MakeVecor2(128);
  133.  
  134. Show(D);
  135. std::cout << std::endl;
  136.  
  137. auto A = BlockSort_Enc(D);
  138.  
  139. Show(std::get<0>(A));
  140. std::cout << std::endl;
  141.  
  142. auto B = BlockSort_Dec(std::get<0>(A), std::get<1>(A), D, A);
  143.  
  144. Show(B);
  145. std::cout << std::endl;
  146. if (D == B) {
  147. std::cout << std::endl << "good" << std::endl;
  148. }
  149. else {
  150. std::cout << std::endl << "Bad" << std::endl;
  151. }
  152.  
  153. return 0;
  154.  
  155.  
  156.  
  157. }
Success #stdin #stdout 0.01s 5520KB
stdin
Standard input is empty
stdout
Z,K,B,w,`,w,Z,],

K,Z,],w,Z,w,`,B,

Z,K,B,w,`,w,Z,],


good