package cs.threephase;
import java.util.*;
import static cs.threephase.Moves.*;
import static cs.threephase.Util.*;
class EdgeCube {
private static final int[] epmv = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1};
static int[][] EdgeColor = {{F, U}, {L, U}, {B, U}, {R, U}, {B, D}, {L, D}, {F, D}, {R, D}, {F, L}, {B, L}, {B, R}, {F, R}};
static int[] EdgeMap = {F2, L2, B2, R2, B8, L8, F8, R8, F4, B6, B4, F6, U8, U4, U2, U6, D8, D4, D2, D6, L6, L4, R6, R4};
byte[] ep = new byte[24];
EdgeCube() {
for (byte i=0; i<24; i++) {
ep[i] = i;
}
}
EdgeCube(EdgeCube c) {
copy(c);
}
EdgeCube(Random r) {
this();
for (int i=0; i<23; i++) {
int t = i + r.nextInt(24-i);
if (t != i) {
byte m = ep[i];
ep[i] = ep[t];
ep[t] = m;
}
}
}
EdgeCube(int[] moveseq) {
this();
for (int m=0; m<moveseq.length; m++) {
move(m);
}
}
int getParity() {
return Util.parity(ep);
}
void copy(EdgeCube c) {
for (int i=0; i<24; i++) {
this.ep[i] = c.ep[i];
}
}
void print() {
for (int i=0; i<24; i++) {
System.out.print(ep[i]);
System.out.print('\t');
}
System.out.println();
}
void fill333Facelet(char[] facelet) {
for (int i=0; i<24; i++) {
facelet[EdgeMap[i]] = colorMap4to3[EdgeColor[ep[i] % 12][ep[i] / 12]];
}
}
boolean checkEdge() {
int ck = 0;
boolean parity = false;
for (int i=0; i<12; i++) {
ck |= 1 << ep[i];
parity = parity != ep[i] >= 12;
}
ck &= ck >> 12;
return ck == 0 && !parity;
}
/*
Edge Cubies:
14 2
1 15
13 3
0 12
1 13 0 12 3 15 2 14
9 20 20 11 11 22 22 9
21 8 8 23 23 10 10 21
17 5 18 6 19 7 16 4
18 6
5 19
17 7
4 16
Center Cubies:
0 1
3 2
20 21 8 9 16 17 12 13
23 22 11 10 19 18 15 14
4 5
7 6
* |************|
* |*U1**U2**U3*|
* |************|
* |*U4**U5**U6*|
* |************|
* |*U7**U8**U9*|
* |************|
* ************|************|************|************|
* *L1**L2**L3*|*F1**F2**F3*|*R1**R2**F3*|*B1**B2**B3*|
* ************|************|************|************|
* *L4**L5**L6*|*F4**F5**F6*|*R4**R5**R6*|*B4**B5**B6*|
* ************|************|************|************|
* *L7**L8**L9*|*F7**F8**F9*|*R7**R8**R9*|*B7**B8**B9*|
* ************|************|************|************|
* |************|
* |*D1**D2**D3*|
* |************|
* |*D4**D5**D6*|
* |************|
* |*D7**D8**D9*|
* |************|
*/
void move(int m) {
int key = m % 3;
m /= 3;
switch (m) {
case 0: //U
swap(ep, 0, 1, 2, 3, key);
swap(ep, 12, 13, 14, 15, key);
break;
case 1: //R
swap(ep, 11, 15, 10, 19, key);
swap(ep, 23, 3, 22, 7, key);
break;
case 2: //F
swap(ep, 0, 11, 6, 8, key);
swap(ep, 12, 23, 18, 20, key);
break;
case 3: //D
swap(ep, 4, 5, 6, 7, key);
swap(ep, 16, 17, 18, 19, key);
break;
case 4: //L
swap(ep, 1, 20, 5, 21, key);
swap(ep, 13, 8, 17, 9, key);
break;
case 5: //B
swap(ep, 2, 9, 4, 10, key);
swap(ep, 14, 21, 16, 22, key);
break;
case 6: //u
swap(ep, 0, 1, 2, 3, key);
swap(ep, 12, 13, 14, 15, key);
swap(ep, 9, 22, 11, 20, key);
break;
case 7: //r
swap(ep, 11, 15, 10, 19, key);
swap(ep, 23, 3, 22, 7, key);
swap(ep, 2, 16, 6, 12, key);
break;
case 8: //f
swap(ep, 0, 11, 6, 8, key);
swap(ep, 12, 23, 18, 20, key);
swap(ep, 3, 19, 5, 13, key);
break;
case 9: //d
swap(ep, 4, 5, 6, 7, key);
swap(ep, 16, 17, 18, 19, key);
swap(ep, 8, 23, 10, 21, key);
break;
case 10://l
swap(ep, 1, 20, 5, 21, key);
swap(ep, 13, 8, 17, 9, key);
swap(ep, 14, 0, 18, 4, key);
break;
case 11://b
swap(ep, 2, 9, 4, 10, key);
swap(ep, 14, 21, 16, 22, key);
swap(ep, 7, 15, 1, 17, key);
break;
}
}
}