import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.util.Arrays;
import java.util.StringTokenizer;
public class CubeStats extends MathUtils{
public static void main(String[] args) {
long start = System.currentTimeMillis();
File out = new File("/home/spdqbr/Desktop/stats.txt");
try{
BufferedWriter bw = new BufferedWriter(new FileWriter(out));
/*
Scrambler scrambler = new Scrambler(Scrambler.CUBE3)
Cube3 puzzle = new Cube3();
int sides = 6;
int stickersPerFace = 8;
//int[] scrambleLengths = {200,500,1000};
int[] mins = {1,10,20,30,35,40,50,1,10,20,30,40};
int[] maxs = {10,20,30,40,45,50,60,20,30,40,50,60};
int trials = 1000000;
int[] totals;
Integer[] scrambled = null;
Integer[] scrambledNoCenters = null;
String scramble;
for(int z = 0; z<mins.length; z++){
totals = new int[stickersPerFace*sides*sides];
for(int i = 0; i<trials; i++){
puzzle.reset();
scramble = scrambler.generateScramble(mins[z],maxs[z]);
//scramble = Megaminx.WCAScrambleString(scrambleLengths[z]);
puzzle.applyScramble(scramble);
//puzzle.orient();
scrambled = puzzle.getState();
//scrambledNoCenters = stripCenters(scrambled);
for(int j = 0; j<scrambled.length; j++){
totals[j*sides+scrambled[j]] ++;
}
}*/
Scrambler[] scramblers = {new Scrambler(Scrambler.MEGAMINXDTSR),
new Scrambler(Scrambler.MEGAMINXDTVR), new Scrambler(Scrambler.MEGAMINXSR)};
int[][] lengths = {new int[] {500,1000,2000},new int[] {175,180,210,220,250,500,1000,2000},
new int[] {10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 125, 150, 175, 200, 500, 1000,2000}};
Megaminx puzzle = new Megaminx();
for(int si = 0; si < scramblers.length; si++){
Scrambler scrambler = scramblers[si];
bw.write("New scrambler "+scrambler.name+"\n");
bw.write("Sample scramble: "+scrambler.generateScramble()+"\n");
int sides = 12;
int stickersPerFace = 10;
int[] scrambleLengths = lengths[si];
//int[] scrambleLengths = {26,27};
int trials = 1000000;
int[] totals;
Integer[] scrambled = null;
Integer[] scrambledNoCenters = null;
String scramble;
for(int z = 0; z<scrambleLengths.length; z++){
totals = new int[stickersPerFace*sides*sides];
for(int i = 0; i<trials; i++){
puzzle.reset();
scramble = scrambler.generateScramble(scrambleLengths[z]);
//scramble = Megaminx.WCAScrambleString(scrambleLengths[z]);
puzzle.applyScramble(scramble);
puzzle.orient();
scrambled = puzzle.getState();
scrambledNoCenters = stripCenters(scrambled);
for(int j = 0; j<scrambledNoCenters.length; j++){
totals[j*sides+scrambledNoCenters[j]] ++;
}
}
System.out.println();
double stddev = stdDev(totals);
double mean = mean(totals);
bw.write(scrambler.name+"\n");
System.out.println("mean = "+mean);
bw.write("mean = "+mean+"\n");
System.out.println("Scramble Length = "+scrambleLengths[z]);
bw.write("Scramble Length = "+scrambleLengths[z]+"\n");
System.out.println("StdDev = "+stddev);
bw.write("StdDev = "+stddev+"\n");
System.out.println("Sd% of mean = "+stddev/mean*100+"\n");
bw.write("Sd% of mean = "+stddev/mean*100+"\n\n");
bw.flush();
}
}
bw.flush();
bw.close();
}catch(Exception e){
//absorb
}
System.out.println(Test.longToTime(System.currentTimeMillis()-start));
}
public static String substitute(String in){
StringBuffer out = new StringBuffer();
StringTokenizer st = new StringTokenizer(in, " ");
String[] subs = {"Wh", "DG", "Pu", "Or", "Br", "Te", "LG", "Re", "DB", "LB", "Pi", "Ye"};
while(st.hasMoreTokens()){
String temp = st.nextToken();
if(temp.substring(0,1).equals("\n")){
temp = temp.substring(1,temp.length());
out.append("\n");
}
int num = 0;
if(temp.length() == 2){
num = Integer.parseInt(temp.substring(0,1));
}else if(temp.length() == 3){
num = Integer.parseInt(temp.substring(0,2));
}
out.append(subs[num]+", ");
}
return out.toString();
}
public static Integer[] stripCenters(Integer[] in){
int[] centers = {10, 27, 30, 33, 36, 39, 92, 95, 98, 101, 104, 131};
Integer[] out = new Integer[in.length-12];
int offset = 0;
for(int i = 0; i<in.length; i++){
if(Arrays.binarySearch(centers, i)>=0)
offset++;
else
out[i-offset] = in[i];
}
return out;
}
}