SHARE
TWEET

Untitled

a guest Mar 19th, 2019 48 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top