Advertisement
Guest User

Untitled

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