Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- @SuppressWarnings("ALL")
- public class Dino {
- public int u = 0x1234;
- public int e = 0x5678;
- public int d = 0x9abc;
- public int index = 0;
- public Dino(){ /*pass*/ }
- public Dino(int index){
- indexToState(index);
- }
- public Dino(long fullState){
- setState(fullState);
- stateToIndex();
- }
- public Dino(int u, int e, int d){
- this.u = u;
- this.e = e;
- this.d = d;
- stateToIndex();
- }
- public static void main(String[] args) {
- Dino d = new Dino(0);
- System.out.println(d);
- }
- public void setState(long aFullState){
- d = (int) aFullState & 0xffff;
- aFullState >>= 16;
- e = (int) aFullState & 0xffff;
- aFullState >>= 16;
- u = (int) aFullState;
- }
- public void stateToIndex() {
- int uu = u;
- int ee = e;
- int dd = d;
- byte[] permutation = new byte[12];
- for (int i = 3; i >= 0; i--){
- permutation[i + 8] = (byte) (dd & 0xF);
- permutation[i + 4] = (byte) (ee & 0xF);
- permutation[i + 0] = (byte) (uu & 0xF);
- uu >>= 0x4;
- ee >>= 0x4;
- dd >>= 0x4;
- }
- index = 0;
- for (int i = 0; i < permutation.length - 2; i++) {
- index *= permutation.length - i;
- for (int j = i + 1; j < permutation.length; j++) {
- if (permutation[i] > permutation[j]) {
- index++;
- }
- }
- }
- }
- public void indexToState(int index) {
- this.index = index;
- int sum = 0;
- byte[] permutation = new byte[12];
- permutation[12 - 1] = 1;
- permutation[12 - 2] = 0;
- for (int i = 12 - 3; i >= 0; i--) {
- permutation[i] = (byte) (index % (12 - i));
- sum += permutation[i];
- index /= 12 - i;
- for (int j = i + 1; j < 12; j++) {
- if (permutation[j] >= permutation[i]) {
- permutation[j]++;
- }
- }
- }
- if (sum % 2 != 0) {
- byte tmp = permutation[permutation.length - 1];
- permutation[permutation.length - 1] = permutation[permutation.length - 2];
- permutation[permutation.length - 2] = tmp;
- }
- u = 0x0; e = 0x0; d = 0x0;
- for (int i = 0; i < 4; i++) {
- u |= (permutation[i + 0] + 1);
- e |= (permutation[i + 4] + 1);
- d |= (permutation[i + 8] + 1);
- u <<= 0x4; e <<= 0x4; d <<= 0x4;
- }
- u >>= 0x4; e >>= 0x4; d >>= 0x4;
- }
- public int getPiece(int idx){
- if (idx >= 0 && idx <= 3){
- idx = 3 - idx;
- return (u >> idx * 4) & 0b1111;
- } else if (idx >= 4 && idx <= 7){
- idx = (7 - idx) + 4;
- return (e >> (idx - 4) * 4) & 0b1111;
- } else {
- idx = (11 - idx) + 8;
- return (d >> (idx - 8) * 4) & 0b1111;
- }
- }
- public void setPiece(int idx, int piece){
- if (idx >= 0 && idx <= 3){
- idx = 3 - idx;
- u &= ~(0b1111 << idx * 4);
- u |= piece << idx * 4;
- } else if (idx >= 4 && idx <= 7){
- idx = (7 - idx) + 4;
- e &= ~(0b1111 << (idx - 4) * 4);
- e |= piece << (idx - 4) * 4;
- } else {
- idx = (11 - idx) + 8;
- d &= ~(0b1111 << (idx - 8) * 4);
- d |= piece << (idx - 8) * 4;
- }
- }
- public void applySequence(int... moves){
- for (int m : moves){
- doMove(m);
- }
- }
- public void doMove(int move) {
- if (move < 0) {
- doMove(move * -1);
- doMove(move * -1);
- }
- int idx1, idx2, idx3;
- switch (move) {
- case 1: idx1 = 6;idx2 = 3;idx3 = 0;break;
- case 2: idx1 = 1;idx2 = 7;idx3 = 0;break;
- case 3: idx1 = 2;idx2 = 4;idx3 = 1;break;
- case 4: idx1 = 3;idx2 = 5;idx3 = 2;break;
- case 5: idx1 = 6;idx2 = 10;idx3 = 11;break;
- case 6: idx1 = 7;idx2 = 10;idx3 = 9;break;
- case 7: idx1 = 4;idx2 = 8;idx3 = 9;break;
- case 8: idx1 = 5;idx2 = 11;idx3 = 8;break;
- default: idx1 = 0;idx2 = 0;idx3 = 0;
- }
- int tmp = getPiece(idx1);
- setPiece(idx1, getPiece(idx2));
- setPiece(idx2, getPiece(idx3));
- setPiece(idx3, tmp);
- stateToIndex();
- }
- public long asLong(){
- long fullDino = (u << 16 | e);
- fullDino <<= 16;
- return fullDino |= d;
- }
- public void copy(Dino d){
- this.u = d.u;
- this.e = d.e;
- this.d = d.d;
- this.index = d.index;
- }
- public String ph(int hex){
- return "\t" + Integer.toHexString(hex);
- }
- @Override
- public String toString() {
- return "\nState:\n" +
- ph(u) + "\n" + ph(e) + "\n" + ph(d) +
- "\nIndex: " + index;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement