fork download
  1. #include <ctime>
  2. #include <iostream>
  3. #include <vector>
  4.  
  5. // テスト用のmix(この関数は遅いよ!これより早いの作ってね!)
  6. uint32_t mix_test(uint16_t a, uint16_t b) {
  7. uint32_t o = 0;
  8. for (int i = 0; i < 16; i++) {
  9. if (a & (1 << i)) o |= 1 << (i * 2 + 0);
  10. if (b & (1 << i)) o |= 1 << (i * 2 + 1);
  11. }
  12. return o;
  13. }
  14.  
  15. std::vector<uint32_t> A_MASTER(1<<16, (uint32_t)-1);
  16. std::vector<uint32_t> B_MASTER(1<<16, (uint32_t)-1);
  17.  
  18. // mixはaとbのbitを交互に詰めて返す。aが下位に来る。
  19. // (例)
  20. // a : 1111111111111111
  21. // b : 0000000000000000
  22. // o : 01010101010101010101010101010101
  23. uint32_t mix(uint16_t a, uint16_t b) {
  24. // ここに実装
  25. uint32_t result_a;
  26. uint32_t result_b;
  27.  
  28. if (A_MASTER[a] == (uint32_t)-1) {
  29. result_a = 0;
  30. for (int i = 0; i < 16; i++) {
  31. if (a & (1 << i)) {
  32. result_a |= 1 << (i * 2 + 0);
  33. }
  34. }
  35. A_MASTER[a] = result_a;
  36. } else {
  37. result_a = A_MASTER[a];
  38. }
  39.  
  40. if (B_MASTER[b] == (uint32_t)-1) {
  41. result_b = 0;
  42. for (int i = 0; i < 16; i++) {
  43. if (b & (1 << i)) {
  44. result_b |= 1 << (i * 2 + 1);
  45. }
  46. }
  47. B_MASTER[b] = result_b;
  48. } else {
  49. result_b = B_MASTER[b];
  50. }
  51.  
  52. return result_a | result_b;
  53. }
  54.  
  55. // テスト
  56. void test(uint32_t(*func)(uint16_t, uint16_t)) {
  57. std::cout << "test...";
  58. for (int i = 0; i < 100; i++) {
  59. uint16_t a = rand(), b = rand();
  60. if (func(a, b) != mix_test(a, b)) {
  61. std::cout << "failed" << std::endl;
  62. exit(EXIT_FAILURE);
  63. }
  64. }
  65. std::cout << "passed!" << std::endl;
  66. }
  67.  
  68. // ベンチマーク
  69. void benchmark(uint32_t (*func)(uint16_t, uint16_t)) {
  70. std::cout << "benchmark...";
  71. uint32_t dammy = 0;
  72. double start = clock();
  73. for (int i = 0; i < 50000000; i++) dammy ^= func(rand(), rand());
  74. double end = clock();
  75. std::cout << "end! elapsed:" << (end - start) / CLOCKS_PER_SEC << "s " << dammy << std::endl;
  76. }
  77.  
  78. int main() {
  79. test(mix);
  80. benchmark(mix);
  81. return 0;
  82. }
Success #stdin #stdout 1.73s 5284KB
stdin
Standard input is empty
stdout
test...passed!
benchmark...end! elapsed:1.72091s 4192649710