Advertisement
Guest User

tt

a guest
Aug 22nd, 2019
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5 5.08 KB | None | 0 0
  1. @SuppressWarnings("ALL")
  2. public class Dino {
  3.  
  4.     public int u = 0x1234;
  5.     public int e = 0x5678;
  6.     public int d = 0x9abc;
  7.  
  8.     public int index = 0;
  9.  
  10.     public Dino(){ /*pass*/ }
  11.  
  12.     public Dino(int index){
  13.         indexToState(index);
  14.     }
  15.  
  16.     public Dino(long fullState){
  17.         setState(fullState);
  18.         stateToIndex();
  19.     }
  20.  
  21.     public Dino(int u, int e, int d){
  22.         this.u = u;
  23.         this.e = e;
  24.         this.d = d;
  25.         stateToIndex();
  26.     }
  27.  
  28.     public static void main(String[] args) {
  29.         Dino d = new Dino(0);
  30.         System.out.println(d);
  31.     }
  32.  
  33.     public void setState(long aFullState){
  34.         d = (int) aFullState & 0xffff;
  35.         aFullState >>= 16;
  36.         e = (int) aFullState & 0xffff;
  37.         aFullState >>= 16;
  38.         u = (int) aFullState;
  39.     }
  40.  
  41.     public void stateToIndex() {
  42.         int uu = u;
  43.         int ee = e;
  44.         int dd = d;
  45.         byte[] permutation = new byte[12];
  46.         for (int i = 3; i >= 0; i--){
  47.             permutation[i + 8] = (byte) (dd & 0xF);
  48.             permutation[i + 4] = (byte) (ee & 0xF);
  49.             permutation[i + 0] = (byte) (uu & 0xF);
  50.  
  51.             uu >>= 0x4;
  52.             ee >>= 0x4;
  53.             dd >>= 0x4;
  54.         }
  55.  
  56.         index = 0;
  57.         for (int i = 0; i < permutation.length - 2; i++) {
  58.             index *= permutation.length - i;
  59.             for (int j = i + 1; j < permutation.length; j++) {
  60.                 if (permutation[i] > permutation[j]) {
  61.                     index++;
  62.                 }
  63.             }
  64.         }
  65.     }
  66.  
  67.     public void indexToState(int index) {
  68.         this.index = index;
  69.         int sum = 0;
  70.         byte[] permutation = new byte[12];
  71.  
  72.         permutation[12 - 1] = 1;
  73.         permutation[12 - 2] = 0;
  74.         for (int i = 12 - 3; i >= 0; i--) {
  75.             permutation[i] = (byte) (index % (12 - i));
  76.             sum += permutation[i];
  77.             index /= 12 - i;
  78.             for (int j = i + 1; j < 12; j++) {
  79.                 if (permutation[j] >= permutation[i]) {
  80.                     permutation[j]++;
  81.                 }
  82.             }
  83.         }
  84.  
  85.         if (sum % 2 != 0) {
  86.             byte tmp = permutation[permutation.length - 1];
  87.             permutation[permutation.length - 1] = permutation[permutation.length - 2];
  88.             permutation[permutation.length - 2] = tmp;
  89.         }
  90.  
  91.         u = 0x0; e = 0x0; d = 0x0;
  92.         for (int i = 0; i < 4; i++) {
  93.             u |= (permutation[i + 0] + 1);
  94.             e |= (permutation[i + 4] + 1);
  95.             d |= (permutation[i + 8] + 1);
  96.  
  97.             u <<= 0x4; e <<= 0x4; d <<= 0x4;
  98.         }
  99.  
  100.         u >>= 0x4; e >>= 0x4; d >>= 0x4;
  101.     }
  102.  
  103.     public int getPiece(int idx){
  104.         if (idx >= 0 && idx <= 3){
  105.             idx = 3 - idx;
  106.             return (u >> idx * 4) & 0b1111;
  107.         } else if (idx >= 4 && idx <= 7){
  108.             idx = (7 - idx) + 4;
  109.             return (e >> (idx - 4) * 4) & 0b1111;
  110.         } else {
  111.             idx = (11 - idx) + 8;
  112.             return (d >> (idx - 8) * 4) & 0b1111;
  113.         }
  114.     }
  115.  
  116.     public void setPiece(int idx, int piece){
  117.         if (idx >= 0 && idx <= 3){
  118.             idx = 3 - idx;
  119.             u &= ~(0b1111 << idx * 4);
  120.             u |= piece << idx * 4;
  121.         } else if (idx >= 4 && idx <= 7){
  122.             idx = (7 - idx) + 4;
  123.             e &= ~(0b1111 << (idx - 4) * 4);
  124.             e |= piece << (idx - 4) * 4;
  125.         } else {
  126.             idx = (11 - idx) + 8;
  127.             d &= ~(0b1111 << (idx - 8) * 4);
  128.             d |= piece << (idx - 8) * 4;
  129.         }
  130.     }
  131.  
  132.     public void applySequence(int... moves){
  133.         for (int m : moves){
  134.             doMove(m);
  135.         }
  136.     }
  137.  
  138.     public void doMove(int move) {
  139.         if (move < 0) {
  140.             doMove(move * -1);
  141.             doMove(move * -1);
  142.         }
  143.  
  144.         int idx1, idx2, idx3;
  145.  
  146.         switch (move) {
  147.             case 1: idx1 = 6;idx2 =  3;idx3 =  0;break;
  148.             case 2: idx1 = 1;idx2 =  7;idx3 =  0;break;
  149.             case 3: idx1 = 2;idx2 =  4;idx3 =  1;break;
  150.             case 4: idx1 = 3;idx2 =  5;idx3 =  2;break;
  151.             case 5: idx1 = 6;idx2 = 10;idx3 = 11;break;
  152.             case 6: idx1 = 7;idx2 = 10;idx3 =  9;break;
  153.             case 7: idx1 = 4;idx2 =  8;idx3 =  9;break;
  154.             case 8: idx1 = 5;idx2 = 11;idx3 =  8;break;
  155.  
  156.             default: idx1 = 0;idx2 = 0;idx3 = 0;
  157.         }
  158.  
  159.         int tmp = getPiece(idx1);
  160.         setPiece(idx1, getPiece(idx2));
  161.         setPiece(idx2, getPiece(idx3));
  162.         setPiece(idx3, tmp);
  163.  
  164.         stateToIndex();
  165.     }
  166.  
  167.     public long asLong(){
  168.         long fullDino = (u << 16 | e);
  169.         fullDino <<= 16;
  170.         return fullDino |= d;
  171.     }
  172.  
  173.     public void copy(Dino d){
  174.         this.u = d.u;
  175.         this.e = d.e;
  176.         this.d = d.d;
  177.         this.index = d.index;
  178.     }
  179.  
  180.     public String ph(int hex){
  181.         return "\t" + Integer.toHexString(hex);
  182.     }
  183.  
  184.     @Override
  185.     public String toString() {
  186.         return "\nState:\n" +
  187.                 ph(u) + "\n" + ph(e) + "\n" + ph(d) +
  188.                 "\nIndex: " + index;
  189.     }
  190. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement