Advertisement
Guest User

Untitled

a guest
Mar 19th, 2019
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.11 KB | None | 0 0
  1. import std.stdio;
  2. import std.math;
  3.  
  4. class tarray
  5. {
  6. private size_t arr_size;
  7. private size_t arr0_size;
  8. private size_t arr1_size;
  9. private size_t arr2_size;
  10. private size_t index_max;
  11.  
  12. private size_t[] arr;
  13.  
  14. this(size_t size)
  15. {
  16. arr_size = size;
  17. arr0_size = size - 1;
  18. arr1_size = size - 2;
  19. arr2_size = size / 2;
  20. arr.length = index_max = (size * size) / 2;
  21.  
  22. }
  23.  
  24. bool safe(size_t x, size_t y)
  25. {
  26. if (x > y)
  27. if (x < arr_size)
  28. if (y < arr_size)
  29. return true;
  30. return false;
  31. }
  32.  
  33. size_t get_index(size_t x, size_t y)
  34. {
  35. if (y >= arr2_size)
  36. return (arr_size * (arr1_size - y)) + (arr0_size - x);
  37. return (arr_size * y) + x;
  38. }
  39.  
  40. bool get_index_xy(size_t index, ref size_t x, ref size_t y)
  41. {
  42. if (index >= index_max)
  43. return false;
  44.  
  45. y = index / arr_size;
  46. x = index % arr_size;
  47. if(x < y || x == y)
  48. {
  49. x = arr0_size - x;
  50. y = arr1_size - y;
  51. }
  52. return true;
  53. }
  54.  
  55. auto insert(size_t x, size_t y, size_t value)
  56. {
  57. if (!safe(x, y))
  58. return size_t.max;
  59.  
  60. auto index = get_index(x, y);
  61. debug writeln("index for(", x, ", ", y, ") = ", index);
  62. arr[index] = value;
  63. return index;
  64. }
  65.  
  66. auto get(size_t x, size_t y)
  67. {
  68. if (!safe(x, y))
  69. return size_t.max;
  70.  
  71. return arr[get_index(x, y)];
  72. }
  73.  
  74. auto get(size_t index)
  75. {
  76. if (index >= arr.length)
  77. return size_t.max;
  78.  
  79. return arr[index];
  80. }
  81.  
  82. void print()
  83. {
  84. for (size_t y = 0; y < arr2_size; ++y)
  85. {
  86. auto start = arr_size * y;
  87. auto end = arr_size * (y + 1);
  88. writeln(arr[start .. end]);
  89. }
  90. }
  91. }
  92.  
  93. void main()
  94. {
  95. size_t size = 70;
  96. tarray ta = new tarray(size);
  97.  
  98. auto sx = 1;
  99. auto k = 1;
  100. for (size_t y = 0; y < size; ++y)
  101. {
  102. for (size_t x = sx; x < size; ++x)
  103. {
  104. if (ta.insert(x, y, k))
  105. k++;
  106. }
  107. sx++;
  108. }
  109.  
  110. ta.print();
  111.  
  112. //test 1
  113. size_t tx = 2;
  114. size_t ty = 0;
  115. size_t rx, ry;
  116. auto index = ta.get_index(tx, ty);
  117. ta.get_index_xy(index, rx, ry);
  118. if(rx != tx || ry != ty)
  119. {
  120. writeln("WTF!? (index=",index,") x=",rx," y=", ry);
  121. }
  122.  
  123. //test 2
  124. tx = 4;
  125. ty = 3;
  126. index = ta.get_index(tx, ty);
  127. ta.get_index_xy(index, rx, ry);
  128. if(rx != tx || ry != ty)
  129. {
  130. writeln("WTF!? (index=",index,") x=",rx," y=", ry);
  131. }
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement