Project

General

Profile

Download (9.15 KB) Statistics
| Branch: | Revision:

distorted-objectlib / src / main / java / org / distorted / objectlib / tablebases / TBJing.java @ e1e92738

1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2023 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6
// Magic Cube is proprietary software licensed under an EULA which you should have received      //
7
// along with the code. If not, check https://distorted.org/magic/License-Magic-Cube.html        //
8
///////////////////////////////////////////////////////////////////////////////////////////////////
9

    
10
package org.distorted.objectlib.tablebases;
11

    
12
import static org.distorted.objectlib.main.TwistyObject.SQ2;
13
import static org.distorted.objectlib.main.TwistyObject.SQ3;
14
import static org.distorted.objectlib.main.TwistyObject.SQ6;
15
import static org.distorted.objectlib.objects.TwistyJing.F;
16

    
17
import org.distorted.library.type.Static3D;
18
import org.distorted.objectlib.R;
19
import org.distorted.objectlib.helpers.OperatingSystemInterface;
20

    
21
///////////////////////////////////////////////////////////////////////////////////////////////////
22

    
23
public class TBJing extends TablebasesPruning
24
{
25
  static final int[][][] QUATS_EDGE = new int[][][]
26
      {
27
          { { 0,10},{ 5, 3},{ 8, 4},{ 6, 2},{ 7, 1},{ 9,11} },
28
          { { 6, 4},{ 0,11},{ 3, 1},{ 5, 7},{ 9,10},{ 2, 8} },
29
          { { 7, 3},{ 4, 2},{ 0, 9},{11,10},{ 8, 6},{ 5, 1} },
30
          { { 5, 1},{ 6, 8},{11,10},{ 0, 9},{ 2, 4},{ 7, 3} },
31
          { { 8, 2},{ 9,10},{ 7, 5},{ 1, 3},{ 0,11},{ 4, 6} },
32
          { { 9,11},{ 1, 7},{ 6, 2},{ 8, 4},{ 3, 5},{ 0,10} }
33
      };
34

    
35
///////////////////////////////////////////////////////////////////////////////////////////////////
36

    
37
  public TBJing()
38
    {
39
    super();
40
    }
41

    
42
///////////////////////////////////////////////////////////////////////////////////////////////////
43

    
44
  public TBJing(OperatingSystemInterface os)
45
    {
46
    super(os, new int[] {R.raw.jing_2_pruning4 ,R.raw.jing_2_pruning5 },
47
              new int[] {R.raw.jing_2_pruning11,R.raw.jing_2_pruning12} );
48
    }
49

    
50
///////////////////////////////////////////////////////////////////////////////////////////////////
51

    
52
  int[][] getBasicAngles()
53
    {
54
    int[] tmp = {3,3};
55
    return new int[][] { tmp,tmp,tmp,tmp };
56
    }
57

    
58
///////////////////////////////////////////////////////////////////////////////////////////////////
59

    
60
  Static3D[] getRotationAxis()
61
    {
62
    return new Static3D[]
63
         {
64
           new Static3D(     0,-SQ3/3,-SQ6/3),
65
           new Static3D(     0,-SQ3/3, SQ6/3),
66
           new Static3D( SQ6/3, SQ3/3,     0),
67
           new Static3D(-SQ6/3, SQ3/3,     0),
68
         };
69
    }
70

    
71
///////////////////////////////////////////////////////////////////////////////////////////////////
72

    
73
  float[][] getPosition()
74
    {
75
    return new float[][]
76
         {
77
           { 0.000f, -SQ2/2, 1.000f },
78
           { 0.000f, -SQ2/2,-1.000f },
79
           {-1.000f,  SQ2/2, 0.000f },
80
           { 1.000f,  SQ2/2, 0.000f },
81

    
82
           { 0.000f, -SQ2/2, 0.000f },
83
           {-0.500f, 0.000f, 0.500f },
84
           { 0.500f, 0.000f, 0.500f },
85
           {-0.500f, 0.000f,-0.500f },
86
           { 0.500f, 0.000f,-0.500f },
87
           { 0.000f,  SQ2/2, 0.000f },
88

    
89
           { 0.000f,  SQ2/6, 1.0f/3 },
90
           { 0.000f,  SQ2/6,-1.0f/3 },
91
           {-1.0f/3, -SQ2/6, 0.000f },
92
           { 1.0f/3, -SQ2/6, 0.000f },
93
         };
94
    }
95

    
96
///////////////////////////////////////////////////////////////////////////////////////////////////
97

    
98
  float[][] getCuts()
99
    {
100
    float[] cut = { (F-0.5f)*(SQ6/3) };
101
    return new float[][] { cut,cut,cut,cut };
102
    }
103

    
104
///////////////////////////////////////////////////////////////////////////////////////////////////
105

    
106
  boolean[][] getRotatable()
107
    {
108
    boolean[] tmp = new boolean[] {false,true};
109
    return new boolean[][] { tmp,tmp,tmp,tmp };
110
    }
111

    
112
///////////////////////////////////////////////////////////////////////////////////////////////////
113
// specifically for the tablebase
114
///////////////////////////////////////////////////////////////////////////////////////////////////
115

    
116
  int getSize()
117
    {
118
    return 3732480;  // see https://www.jaapsch.net/puzzles/pyraminx.htm
119
    }
120

    
121
///////////////////////////////////////////////////////////////////////////////////////////////////
122

    
123
  int getMinScramble()
124
    {
125
    return 9;
126
    }
127

    
128
///////////////////////////////////////////////////////////////////////////////////////////////////
129

    
130
  int[] getMidPruningLevels()
131
    {
132
    return new int[] {4,5};
133
    }
134

    
135
///////////////////////////////////////////////////////////////////////////////////////////////////
136

    
137
  int[] getHighPruningLevels()
138
    {
139
    return new int[] {11,12};
140
    }
141

    
142
///////////////////////////////////////////////////////////////////////////////////////////////////
143

    
144
  int getGodsNumber()
145
    {
146
    return 12;
147
    }
148

    
149
///////////////////////////////////////////////////////////////////////////////////////////////////
150

    
151
  boolean moveCanProceed(int lastA, int lastR, int currA, int currR)
152
    {
153
    return lastA!=currA;
154
    }
155

    
156
///////////////////////////////////////////////////////////////////////////////////////////////////
157

    
158
  public static void getEdgePermTwist(int[] perm, int[] twist, int[] quats, int index)
159
    {
160
    for(int i=0; i<6; i++)
161
      {
162
      int quat = quats[i+index];
163

    
164
      for(int j=0; j<6; j++)
165
        {
166
        int[] edge = QUATS_EDGE[i][j];
167
        if( quat==edge[0] ) { perm[i]=j; twist[i]=0; break; }
168
        if( quat==edge[1] ) { perm[i]=j; twist[i]=1; break; }
169
        }
170
      }
171
    }
172

    
173
///////////////////////////////////////////////////////////////////////////////////////////////////
174

    
175
  private int getVertexTwist(int[] quats)
176
    {
177
    int twist = 0;
178

    
179
    if( quats[3]==5 ) twist += 1;
180
    if( quats[3]==6 ) twist += 2;
181
    twist *= 3;
182
    if( quats[2]==7 ) twist += 1;
183
    if( quats[2]==8 ) twist += 2;
184
    twist *= 3;
185
    if( quats[1]==1 ) twist += 1;
186
    if( quats[1]==2 ) twist += 2;
187
    twist *= 3;
188
    if( quats[0]==3 ) twist += 1;
189
    if( quats[0]==4 ) twist += 2;
190

    
191
    return twist;
192
    }
193

    
194
///////////////////////////////////////////////////////////////////////////////////////////////////
195

    
196
  private void getVertexQuats(int twist, int[] output)
197
    {
198
    switch(twist%3)
199
      {
200
      case 0: output[0]=0; break;
201
      case 1: output[0]=3; break;
202
      case 2: output[0]=4; break;
203
      }
204
    twist /= 3;
205

    
206
    switch(twist%3)
207
      {
208
      case 0: output[1]=0; break;
209
      case 1: output[1]=1; break;
210
      case 2: output[1]=2; break;
211
      }
212
    twist /= 3;
213

    
214
    switch(twist%3)
215
      {
216
      case 0: output[2]=0; break;
217
      case 1: output[2]=7; break;
218
      case 2: output[2]=8; break;
219
      }
220
    twist /= 3;
221

    
222
    switch(twist%3)
223
      {
224
      case 0: output[3]=0; break;
225
      case 1: output[3]=5; break;
226
      case 2: output[3]=6; break;
227
      }
228
    }
229

    
230
///////////////////////////////////////////////////////////////////////////////////////////////////
231

    
232
  private void getEdgeQuats(int twist, int[] perm, int[] output)
233
    {
234
    int totalTwist = 0;
235

    
236
    for(int i=0; i<5; i++)
237
      {
238
      int p = perm[i];
239
      int t = (twist%2);
240
      twist/=2;
241
      output[i+4] = QUATS_EDGE[i][p][t];
242

    
243
      totalTwist += t;
244
      }
245

    
246
    int p = perm[5];
247
    int t = (totalTwist%2)==0 ? 0:1;
248
    output[9] = QUATS_EDGE[5][p][t];
249
    }
250

    
251
///////////////////////////////////////////////////////////////////////////////////////////////////
252

    
253
  public int[] getQuats(int index)
254
    {
255
    int green_face = (index%4);
256
    index /= 4;
257
    int vertexTwist = (index%81);
258
    index /= 81;
259
    int edgeTwist = (index%32);
260
    int perm_num = index/32;
261

    
262
    int[] quats = new int[14];
263

    
264
    getVertexQuats(vertexTwist,quats);
265
    int[] permutation = new int[6];
266
    TablebaseHelpers.getEvenPermutationFromNum(permutation,perm_num);
267
    getEdgeQuats(edgeTwist,permutation,quats);
268

    
269
    // we don't need to care about the values of the last 3 quats, but do include them.
270
    switch(green_face)
271
      {
272
      case 0: quats[10] = 0; break;
273
      case 1: quats[10] = 5; break;
274
      case 2: quats[10] = 4; break;
275
      case 3: quats[10] = 3; break;
276
      }
277

    
278
    return quats;
279
    }
280

    
281
///////////////////////////////////////////////////////////////////////////////////////////////////
282

    
283
  public int getIndex(int[] quats)
284
    {
285
    int vertexTwist = getVertexTwist(quats);
286
    int[] permutation = new int[6];
287
    int[] twist = new int[6];
288
    getEdgePermTwist(permutation,twist,quats,4);
289

    
290
    int edgeTwist = twist[0]+ 2*(twist[1]+ 2*(twist[2]+ 2*(twist[3]+ 2*twist[4])));
291
    int perm_num = TablebaseHelpers.computeEvenPermutationNum(permutation);
292

    
293
    int green_face = -1;
294
    switch(quats[10])
295
      {
296
      case  0: case  1: case  2: green_face=0; break;
297
      case  5: case  8: case 10: green_face=1; break;
298
      case  4: case  7: case 11: green_face=2; break;
299
      case  3: case  6: case  9: green_face=3; break;
300
      }
301
/*
302
for(int i=0; i<6; i++) android.util.Log.e("D", "edge perm = "+permutation[i]);
303
android.util.Log.e("D", "ret: green_face="+green_face+" vertTwist="+vertexTwist+" edgeTwist="+edgeTwist+" perm: "+perm_num);
304
*/
305
    return green_face + 4*(vertexTwist + 81*(edgeTwist + 32*perm_num));
306
    }
307
}  
308

    
(10-10/19)