Project

General

Profile

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

distorted-objectlib / src / main / java / org / distorted / objectlib / scrambling / ScrambleStateLocallyBandaged.java @ a0ef8a1d

1 10b7e306 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2022 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6 babb7b08 Leszek Koltunski
// 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 10b7e306 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
9
10
package org.distorted.objectlib.scrambling;
11
12 97a75106 leszek
import org.distorted.objectlib.signature.ObjectSignature;
13 e342c3f7 Leszek Koltunski
14 10b7e306 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
15 3d4cd65e leszek
// Info about a scramble state of any bandaged cuboids or pyraminxes.
16 1d581993 Leszek Koltunski
17 3d4cd65e leszek
public class ScrambleStateLocallyBandaged
18 10b7e306 Leszek Koltunski
{
19 818bca37 Leszek Koltunski
  public static int MAX_SUPPORTED_SIZE = 7;
20 0e311558 Leszek Koltunski
  public static final int AXIS_NONE = -1;
21
22 1d581993 Leszek Koltunski
  private final ObjectSignature[] mMoves;
23
  private final ObjectSignature mSignature;
24 3d4cd65e leszek
  private final int[] mLayer, mTurns, mSize, mStart;
25 1d581993 Leszek Koltunski
  private final int mNumMoves;
26
  private final boolean[][] mIsUnblocked;
27 3d4cd65e leszek
  private final int mNumAxis;
28 10b7e306 Leszek Koltunski
29
///////////////////////////////////////////////////////////////////////////////////////////////////
30
31 3d4cd65e leszek
  public ScrambleStateLocallyBandaged(int[] numLayers, ObjectSignature signature, BlacklistedSignatures blacklisted)
32 10b7e306 Leszek Koltunski
    {
33 3d4cd65e leszek
    mNumAxis = numLayers.length;
34 1d581993 Leszek Koltunski
35 3d4cd65e leszek
    mLayer = new int[mNumAxis];
36
    mTurns = new int[mNumAxis];
37
    mSize  = new int[mNumAxis];
38
    mStart = new int[mNumAxis+1];
39 1d581993 Leszek Koltunski
40 3d4cd65e leszek
    mIsUnblocked = new boolean[mNumAxis][MAX_SUPPORTED_SIZE];
41 1d581993 Leszek Koltunski
42 53c7b8dd leszek
    for(int a=0; a<mNumAxis; a++)
43
      {
44
      mLayer[a] = numLayers[a];
45
      }
46
47 3d4cd65e leszek
    if( mNumAxis==3 )
48
      {
49
      mTurns[0] = (mLayer[1]==mLayer[2] ? 3 : 1);
50
      mTurns[1] = (mLayer[0]==mLayer[2] ? 3 : 1);
51
      mTurns[2] = (mLayer[0]==mLayer[1] ? 3 : 1);
52
      }
53
    else if( mNumAxis==4 )
54
      {
55
      mTurns[0] = 2;
56
      mTurns[1] = 2;
57
      mTurns[2] = 2;
58
      mTurns[3] = 2;
59
      }
60 3ede7593 leszek
    else if( mNumAxis==6 )
61
      {
62
      mTurns[0] = 4;
63
      mTurns[1] = 4;
64
      mTurns[2] = 4;
65
      mTurns[3] = 4;
66
      mTurns[4] = 4;
67
      mTurns[5] = 4;
68
      }
69 1d581993 Leszek Koltunski
70 3d4cd65e leszek
    int numMoves = 0;
71 338e42aa Leszek Koltunski
72 3d4cd65e leszek
    for(int a=0; a<mNumAxis; a++)
73
      {
74
      mSize[a] = (mLayer[a]>1 ? mLayer[a] : 0);
75
      int tmp = mTurns[a]*mSize[a];
76
      numMoves += tmp;
77 1d581993 Leszek Koltunski
78 3d4cd65e leszek
      if( a==0 ) mStart[a] = 0;
79
      else       mStart[a] = mStart[a-1] + tmp;
80
      }
81 1d581993 Leszek Koltunski
82 3d4cd65e leszek
    mStart[mNumAxis] = numMoves;
83
    mNumMoves = numMoves;
84 1d581993 Leszek Koltunski
85
    mSignature = signature;
86 e342c3f7 Leszek Koltunski
    mMoves = createMoves(blacklisted);
87 10b7e306 Leszek Koltunski
    }
88
89
///////////////////////////////////////////////////////////////////////////////////////////////////
90
91 1d581993 Leszek Koltunski
  public ObjectSignature getSignature()
92 5f54927b Leszek Koltunski
    {
93 1d581993 Leszek Koltunski
    return mSignature;
94 5f54927b Leszek Koltunski
    }
95
96
///////////////////////////////////////////////////////////////////////////////////////////////////
97
98 1d581993 Leszek Koltunski
  public ObjectSignature getMove(int index)
99 5f54927b Leszek Koltunski
    {
100 1d581993 Leszek Koltunski
    return (index>=0 && index<mNumMoves) ? mMoves[index] : null;
101 5f54927b Leszek Koltunski
    }
102
103
///////////////////////////////////////////////////////////////////////////////////////////////////
104
105 1d581993 Leszek Koltunski
  public void removeMoves(ObjectSignature signature)
106 5f54927b Leszek Koltunski
    {
107 1d581993 Leszek Koltunski
    for(int m=0; m<mNumMoves; m++)
108 671a53a2 Leszek Koltunski
      if( mMoves[m]!=null && signature.isEqual(mMoves[m]) ) mMoves[m]=null;
109 5f54927b Leszek Koltunski
    }
110
111
///////////////////////////////////////////////////////////////////////////////////////////////////
112
113 0e311558 Leszek Koltunski
  public int numAxis()
114 5f54927b Leszek Koltunski
    {
115
    int num = 0;
116
117 3d4cd65e leszek
    for(int a=0; a<mNumAxis; a++)
118
      for(int x=mStart[a]; x<mStart[a+1]; x++)
119
        if( mMoves[x]!=null ) { num++; break; }
120 5f54927b Leszek Koltunski
121
    return num;
122
    }
123
124 0e311558 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
125
126 3d4cd65e leszek
  private int numMovesInAx(int ax)
127 0e311558 Leszek Koltunski
    {
128
    int num=0;
129 3d4cd65e leszek
    for(int x=mStart[ax]; x<mStart[ax+1]; x++) if( mMoves[x]!=null ) num++;
130 0e311558 Leszek Koltunski
    return num;
131
    }
132
133
///////////////////////////////////////////////////////////////////////////////////////////////////
134
135 3d4cd65e leszek
  private int numMovesInAx(int ax, int excludedLayer)
136 0e311558 Leszek Koltunski
    {
137
    int num=0;
138 3d4cd65e leszek
    for(int x=mStart[ax]; x<mStart[ax+1]; x++)
139
      if( mMoves[x]!=null && (x-mStart[ax])%mLayer[ax]!=excludedLayer ) num++;
140
141 0e311558 Leszek Koltunski
    return num;
142
    }
143
144
///////////////////////////////////////////////////////////////////////////////////////////////////
145
146 3d4cd65e leszek
  private int numAllMoves()
147 0e311558 Leszek Koltunski
    {
148
    int num=0;
149 3d4cd65e leszek
    for(int x=0; x<mNumMoves; x++) if( mMoves[x]!=null ) num++;
150 0e311558 Leszek Koltunski
    return num;
151
    }
152
153
///////////////////////////////////////////////////////////////////////////////////////////////////
154
155 3d4cd65e leszek
  private int numAllMoves(int excludedLayer)
156 0e311558 Leszek Koltunski
    {
157 3d4cd65e leszek
    int num=0;
158 0e311558 Leszek Koltunski
159 3d4cd65e leszek
    for(int a=0; a<mNumAxis; a++)
160
      for(int x=mStart[a]; x<mStart[a+1]; x++)
161
        if( mMoves[x]!=null && (x-mStart[a])%mLayer[a]!=excludedLayer ) num++;
162 0e311558 Leszek Koltunski
163 3d4cd65e leszek
    return num;
164 0e311558 Leszek Koltunski
    }
165
166
///////////////////////////////////////////////////////////////////////////////////////////////////
167
168 3d4cd65e leszek
  public int numMoves(int excludedAxis)
169 0e311558 Leszek Koltunski
    {
170 3d4cd65e leszek
    if( excludedAxis>=0 && excludedAxis<mNumAxis )
171
      return numAllMoves() - numMovesInAx(excludedAxis);
172 0e311558 Leszek Koltunski
173 3d4cd65e leszek
    return numAllMoves();
174 10b7e306 Leszek Koltunski
    }
175
176 3a5aa558 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
177
178 3d4cd65e leszek
  public int numMoves(int excludedAxis, int excludedLayer)
179 3a5aa558 Leszek Koltunski
    {
180 3d4cd65e leszek
    if( excludedAxis>=0 && excludedAxis<mNumAxis )
181
      return numAllMoves(excludedLayer) - numMovesInAx(excludedAxis, excludedLayer);
182 3a5aa558 Leszek Koltunski
183 3d4cd65e leszek
    return numAllMoves(excludedLayer);
184 3a5aa558 Leszek Koltunski
    }
185
186
///////////////////////////////////////////////////////////////////////////////////////////////////
187
188 3d4cd65e leszek
  public int getNthMove(int n, int excludedAxis)
189 3a5aa558 Leszek Koltunski
    {
190 3d4cd65e leszek
    int num = 0;
191 3a5aa558 Leszek Koltunski
192 3d4cd65e leszek
    for(int a=0; a<mNumAxis; a++)
193
      if( excludedAxis!=a )
194
        {
195
        for(int m=mStart[a]; m<mStart[a+1]; m++)
196
          if( mMoves[m]!=null )
197
            {
198
            if( num==n ) return m;
199
            num++;
200
            }
201
        }
202 3a5aa558 Leszek Koltunski
203 3d4cd65e leszek
    return -1;
204 3a5aa558 Leszek Koltunski
    }
205
206
///////////////////////////////////////////////////////////////////////////////////////////////////
207
208
  public int getNthMove(int n, int excludedAxis, int excludedLayer)
209
    {
210
    int num = 0;
211
212 3d4cd65e leszek
    for(int a=0; a<mNumAxis; a++)
213
      if( excludedAxis!=a )
214
        {
215
        for(int m=mStart[a]; m<mStart[a+1]; m++)
216
          if( mMoves[m]!=null && (m-mStart[a])%mLayer[a]!=excludedLayer )
217
            {
218
            if( num==n ) return m;
219
            num++;
220
            }
221
        }
222 3a5aa558 Leszek Koltunski
223
    return -1;
224
    }
225
226 10b7e306 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
227
228 e342c3f7 Leszek Koltunski
  private ObjectSignature[] createMoves(BlacklistedSignatures blacklisted)
229 10b7e306 Leszek Koltunski
    {
230 1d581993 Leszek Koltunski
    ObjectSignature[] ret = new ObjectSignature[mNumMoves];
231 10b7e306 Leszek Koltunski
    int index = 0;
232
233 3d4cd65e leszek
    for(int axis=0; axis<mNumAxis; axis++)
234 1d581993 Leszek Koltunski
      for(int layer=0; layer<mLayer[axis]; layer++)
235 efeca8ef Leszek Koltunski
        {
236 1d581993 Leszek Koltunski
        mIsUnblocked[axis][layer] = mSignature.isUnblockedFromLeft(axis,layer);
237 efeca8ef Leszek Koltunski
        }
238 10b7e306 Leszek Koltunski
239 3d4cd65e leszek
    for(int axis=0; axis<mNumAxis; axis++)
240 1d581993 Leszek Koltunski
      if( mLayer[axis]>1 )
241 338e42aa Leszek Koltunski
        for(int turn=1; turn<=mTurns[axis]; turn++)
242 10b7e306 Leszek Koltunski
          {
243 1d581993 Leszek Koltunski
          boolean allLayersLocked = true;
244 e342c3f7 Leszek Koltunski
          int begIndex = index;
245 1d581993 Leszek Koltunski
246
          for(int layer=0; layer<mLayer[axis]; layer++)
247
            {
248
            if( mIsUnblocked[axis][layer] )
249
              {
250
              if( layer>0 ) allLayersLocked = false;
251
              ret[index] = mSignature.turn(axis,layer,turn);
252
              }
253
            else
254
              {
255
              ret[index] = ret[index-1].turn(axis,layer,turn);
256
              ret[index-1] = null;
257
              }
258
259
            index++;
260
            }
261
262 e342c3f7 Leszek Koltunski
          for(int i=begIndex; i<index; i++)
263
            {
264
            if( ret[i]!=null && blacklisted.contains(ret[i]) ) ret[i]=null;
265
            }
266
267 1d581993 Leszek Koltunski
          if( allLayersLocked ) ret[index-1] = null;
268 10b7e306 Leszek Koltunski
          }
269
270
    return ret;
271
    }
272
273 338e42aa Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
274
275
  public void fillOutScramble(int[] scramble, int moveIndex)
276
    {
277 3d4cd65e leszek
    for(int axis=0; axis<mNumAxis; axis++)
278 338e42aa Leszek Koltunski
      {
279
      int size = mTurns[axis]*mSize[axis];
280
281
      if( moveIndex<size )
282
        {
283
        scramble[0] = axis;
284 0cdd9b6c Leszek Koltunski
        scramble[1] = moveIndex % mSize[axis];
285 338e42aa Leszek Koltunski
286 bc6b4c0b leszek
        switch( mTurns[axis] )
287 3d4cd65e leszek
          {
288 bc6b4c0b leszek
          case 2: switch(moveIndex/mSize[axis])
289
                    {
290
                    case 0: scramble[2] =-1; break;
291
                    case 1: scramble[2] = 1; break;
292
                    }
293
                  break;
294
          case 3: switch(moveIndex/mSize[axis])
295
                    {
296
                    case 0: scramble[2] =-1; break;
297
                    case 1: scramble[2] = 2; break;
298
                    case 2: scramble[2] = 1; break;
299
                    }
300
                  break;
301
          case 4: switch(moveIndex/mSize[axis])
302
                    {
303
                    case 0: scramble[2] =-1; break;
304
                    case 1: scramble[2] =-2; break;
305
                    case 2: scramble[2] = 2; break;
306
                    case 3: scramble[2] = 1; break;
307
                    }
308
                  break;
309
          default:scramble[2] = 1;
310
                  android.util.Log.e("D", "ScrambleStateLocallyBandaged: unsupported turns: "+mTurns[axis]);
311 3d4cd65e leszek
          }
312 bc6b4c0b leszek
313 338e42aa Leszek Koltunski
        return;
314
        }
315
316
      moveIndex -= size;
317
      }
318
319
    android.util.Log.e("D", "ERROR in fillOutScramble moveIndex="+moveIndex);
320
    }
321
322 5f54927b Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
323
324 d12d901a Leszek Koltunski
  private void printMoves()
325 10b7e306 Leszek Koltunski
    {
326 1d581993 Leszek Koltunski
    for(int i=0; i<mNumMoves; i++)
327 d12d901a Leszek Koltunski
      {
328 efeca8ef Leszek Koltunski
      android.util.Log.e("D", "move "+i+" : "+(mMoves[i]!=null ? " "+mMoves[i].getString() : " NULL") );
329 d12d901a Leszek Koltunski
      }
330 10b7e306 Leszek Koltunski
    }
331
332
///////////////////////////////////////////////////////////////////////////////////////////////////
333
334 d12d901a Leszek Koltunski
  private static String printBits(long id)
335 10b7e306 Leszek Koltunski
    {
336 d12d901a Leszek Koltunski
    String ret = "[";
337
    boolean first = true;
338 10b7e306 Leszek Koltunski
339 d12d901a Leszek Koltunski
    for(int i=0; i<64; i++)
340 10b7e306 Leszek Koltunski
      {
341 d12d901a Leszek Koltunski
      if( ( (id>>i)&0x1)==1 )
342
        {
343
        String num = (i<10 ? " "+i : ""+i);
344
345
        if( first ) { ret += num; first=false; }
346
        else          ret += (","+num);
347
        }
348 10b7e306 Leszek Koltunski
      }
349
350 d12d901a Leszek Koltunski
    return ret + "]";
351 10b7e306 Leszek Koltunski
    }
352
}