Project

General

Profile

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

distorted-objectlib / src / main / java / org / distorted / objectlib / tablebases / TBCube2.java @ 5b9e0ba4

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 org.distorted.library.type.Static3D;
13
import org.distorted.objectlib.R;
14
import org.distorted.objectlib.helpers.OperatingSystemInterface;
15

    
16
///////////////////////////////////////////////////////////////////////////////////////////////////
17

    
18
public class TBCube2 extends TablebasesPruning
19
{
20
  private final int[][][] mQuatsMap =
21
    {
22
     { { 0,21,13},  { 1, 6,18},  { 3,17, 7},  { 2,12,22},  {14, 4, 9},  { 5,10,15},  { 8,20,23},  {11,16,19} },
23
     { { 3,18, 4},  { 0,22,10},  { 2,13,20},  { 1, 7,16},  { 5,23,21},  {11, 9, 6},  {14,19,17},  { 8,15,12} },
24
     { { 1, 9,17},  { 2,15,21},  { 0,23,12},  { 3,19, 6},  { 8,13,10},  {14,18,16},  {11, 7, 4},  { 5,22,20} },
25
     { { 2,10,23},  { 3,16, 9},  { 1, 4,19},  { 0,20,15},  {11,17,18},  { 8,21,22},  { 5,12,13},  {14, 6, 7} },
26
     { {14, 7, 6},  { 5,13,12},  { 8,22,21},  {11,18,17},  { 0,15,20},  { 1,19, 4},  { 3, 9,16},  { 2,23,10} },
27
     { { 5,20,22},  {11, 4, 7},  {14,16,18},  { 8,10,13},  { 3, 6,19},  { 0,12,23},  { 2,21,15},  { 1,17, 9} },
28
     { { 8,12,15},  {14,17,19},  {11, 6, 9},  { 5,21,23},  { 1,16, 7},  { 2,20,13},  { 0,10,22},  { 3, 4,18} },
29
     { {11,19,16},  { 8,23,20},  { 5,15,10},  {14, 9, 4},  { 2,22,12},  { 3, 7,17},  { 1,18, 6},  { 0,13,21} },
30
    };
31

    
32
///////////////////////////////////////////////////////////////////////////////////////////////////
33

    
34
  public TBCube2()
35
    {
36
    super();
37
    }
38

    
39
///////////////////////////////////////////////////////////////////////////////////////////////////
40

    
41
  public TBCube2(OperatingSystemInterface os)
42
    {
43
    super(os, new int[] {R.raw.cube_2_pruning4,R.raw.cube_2_pruning5}, new int[] {R.raw.cube_2_pruning11} );
44
    }
45

    
46
///////////////////////////////////////////////////////////////////////////////////////////////////
47

    
48
  int[][] getBasicAngles()
49
    {
50
    int[] tmp = {4,4};
51
    return new int[][] { tmp,tmp,tmp };
52
    }
53

    
54
///////////////////////////////////////////////////////////////////////////////////////////////////
55

    
56
  Static3D[] getRotationAxis()
57
    {
58
    return new Static3D[]
59
         {
60
           new Static3D(1,0,0),
61
           new Static3D(0,1,0),
62
           new Static3D(0,0,1)
63
         };
64
    }
65

    
66
///////////////////////////////////////////////////////////////////////////////////////////////////
67

    
68
  float[][] getPosition()
69
    {
70
    return new float[][]
71
      {
72
        { -0.5f, -0.5f, -0.5f },
73
        { -0.5f, -0.5f,  0.5f },
74
        { -0.5f,  0.5f, -0.5f },
75
        { -0.5f,  0.5f,  0.5f },
76
        {  0.5f, -0.5f, -0.5f },
77
        {  0.5f, -0.5f,  0.5f },
78
        {  0.5f,  0.5f, -0.5f },
79
        {  0.5f,  0.5f,  0.5f },
80
      };
81
    }
82

    
83
///////////////////////////////////////////////////////////////////////////////////////////////////
84

    
85
  float[][] getCuts()
86
    {
87
    return new float[][] { {0.0f}, {0.0f}, {0.0f} };
88
    }
89

    
90
///////////////////////////////////////////////////////////////////////////////////////////////////
91

    
92
  boolean[][] getRotatable()
93
    {
94
    return new boolean[][] { {false,true},{false,true},{true,false} };
95
    }
96

    
97
///////////////////////////////////////////////////////////////////////////////////////////////////
98
// specifically for the tablebase
99
///////////////////////////////////////////////////////////////////////////////////////////////////
100
// 7!*3^6 --> https://www.jaapsch.net/puzzles/cube2.htm
101

    
102
  int getSize()
103
    {
104
    return 3674160;
105
    }
106

    
107
///////////////////////////////////////////////////////////////////////////////////////////////////
108

    
109
  int getMinScramble()
110
    {
111
    return 9;
112
    }
113

    
114
///////////////////////////////////////////////////////////////////////////////////////////////////
115

    
116
  int[] getMidPruningLevels()
117
    {
118
    return new int[] {4,5};
119
    }
120

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

    
123
  int[] getHighPruningLevels()
124
    {
125
    return new int[] {11};
126
    }
127

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

    
130
  int getGodsNumber()
131
    {
132
    return 11;
133
    }
134

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

    
137
  boolean moveCanProceed(int lastA, int lastR, int currA, int currR)
138
    {
139
    return lastA!=currA;
140
    }
141

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

    
144
  public static int[] shrinkPerm(int[] perm8)
145
    {
146
    int[] perm7 = new int[7];
147

    
148
    int tmp = perm8[0];
149
    perm7[0] = tmp>1 ? tmp-1 : tmp;
150
    tmp = perm8[2];
151
    perm7[1] = tmp>1 ? tmp-1 : tmp;
152
    tmp = perm8[3];
153
    perm7[2] = tmp>1 ? tmp-1 : tmp;
154
    tmp = perm8[4];
155
    perm7[3] = tmp>1 ? tmp-1 : tmp;
156
    tmp = perm8[5];
157
    perm7[4] = tmp>1 ? tmp-1 : tmp;
158
    tmp = perm8[6];
159
    perm7[5] = tmp>1 ? tmp-1 : tmp;
160
    tmp = perm8[7];
161
    perm7[6] = tmp>1 ? tmp-1 : tmp;
162

    
163
    return perm7;
164
    }
165

    
166
///////////////////////////////////////////////////////////////////////////////////////////////////
167

    
168
  private static int[] growPerm(int[] perm7)
169
    {
170
    int[] perm8 = new int[8];
171
    int tmp = perm7[0];
172
    perm8[0] = tmp>=1 ? tmp+1 : tmp;
173
    perm8[1] = 1;
174
    tmp = perm7[1];
175
    perm8[2] = tmp>=1 ? tmp+1 : tmp;
176
    tmp = perm7[2];
177
    perm8[3] = tmp>=1 ? tmp+1 : tmp;
178
    tmp = perm7[3];
179
    perm8[4] = tmp>=1 ? tmp+1 : tmp;
180
    tmp = perm7[4];
181
    perm8[5] = tmp>=1 ? tmp+1 : tmp;
182
    tmp = perm7[5];
183
    perm8[6] = tmp>=1 ? tmp+1 : tmp;
184
    tmp = perm7[6];
185
    perm8[7] = tmp>=1 ? tmp+1 : tmp;
186

    
187
    return perm8;
188
    }
189

    
190
///////////////////////////////////////////////////////////////////////////////////////////////////
191

    
192
  private int[] getPerm(int permNum)
193
    {
194
    int[] perm7 = new int[7];
195
    TablebaseHelpers.getPermutationFromNum(perm7,7,permNum);
196
    return growPerm(perm7);
197
    }
198

    
199
///////////////////////////////////////////////////////////////////////////////////////////////////
200

    
201
  private int[] getTwist(int twistNum)
202
    {
203
    int[] twist = new int[8];
204
    twist[0] = twistNum%3;
205
    twist[1] = 0;
206
    twistNum /=3;
207
    twist[2] = twistNum%3;
208
    twistNum /=3;
209
    twist[3] = twistNum%3;
210
    twistNum /=3;
211
    twist[4] = twistNum%3;
212
    twistNum /=3;
213
    twist[5] = twistNum%3;
214
    twistNum /=3;
215
    twist[6] = twistNum%3;
216

    
217
    int total = (twist[0]+twist[2]+twist[3]+twist[4]+twist[5]+twist[6])%3;
218
    if( total==0 ) twist[7] = 0;
219
    else twist[7] = 3-total;
220

    
221
    return twist;
222
    }
223

    
224
///////////////////////////////////////////////////////////////////////////////////////////////////
225

    
226
  public int[] getQuats(int index)
227
    {
228
    int twistNum = index%729;
229
    int permuNum = index/729;
230

    
231
    int[] twist = getTwist(twistNum);
232
    int[] perm  = getPerm(permuNum);
233

    
234
    int[] quats = new int[8];
235
    for(int i=0; i<8; i++) quats[i] = mQuatsMap[i][perm[i]][twist[i]];
236

    
237
    return quats;
238
    }
239

    
240
///////////////////////////////////////////////////////////////////////////////////////////////////
241

    
242
  private void extractTwistAndPerm(int quat, int[][] map, int[] twist, int[] perm, int index)
243
    {
244
    for(int i=0; i<8; i++)
245
      for(int j=0; j<3; j++)
246
        if( map[i][j]==quat )
247
          {
248
          twist[index] = j;
249
          perm[index] = i;
250
          break;
251
          }
252
    }
253

    
254
///////////////////////////////////////////////////////////////////////////////////////////////////
255

    
256
  public int getIndex(int[] quats)
257
    {
258
    int[] twist = new int[8];
259
    int[] perm8 = new int[8];
260

    
261
    for(int i=0; i<8; i++) extractTwistAndPerm(quats[i],mQuatsMap[i],twist,perm8,i);
262

    
263
    int[] perm7 = shrinkPerm(perm8);
264
    int twistNum = twist[0] + 3*(twist[2] + 3*(twist[3] + 3*(twist[4] + 3*(twist[5] + 3*twist[6]))));
265
    int permNum  = TablebaseHelpers.computePermutationNum(perm7);
266

    
267
    return twistNum + 729*permNum;
268
    }
269
}  
270

    
(3-3/19)