Advertisement
Guest User

Untitled

a guest
Jun 29th, 2016
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.01 KB | None | 0 0
  1. import java.io.BufferedReader;
  2. import java.io.File;
  3. import java.io.FileReader;
  4. import java.io.FileWriter;
  5. import java.io.IOException;
  6. import java.util.ArrayList;
  7. import java.util.Arrays;
  8. import java.util.HashSet;
  9. import java.util.Iterator;
  10.  
  11. import javax.swing.JOptionPane;
  12.  
  13.  
  14. public class StateMachineExplorer
  15. {
  16. static String puzzleName;
  17. static ArrayList<byte[]> solved;
  18. static byte[][][] moves;
  19. static byte permutationElements;
  20. static String[][] moveNames;
  21. public static void main(String[] args) throws IOException
  22. {
  23. String fileName="Trillion";
  24. importData(fileName);
  25. System.out.println();
  26. exploreStateMachine(fileName);
  27.  
  28. }
  29. public static void exploreStateMachine(String fileName) throws IOException
  30. {
  31. FileWriter writer=new FileWriter(new File(fileName+"Output.txt"));
  32. HashSet<ByteArrayWrapper> current=new HashSet<ByteArrayWrapper>();
  33. HashSet<ByteArrayWrapper> previous=new HashSet<ByteArrayWrapper>();
  34. HashSet<ByteArrayWrapper> previousPrevious=previous;
  35. for(byte[] i:solved)
  36. previous.add(new ByteArrayWrapper(i));
  37. if(previous.size()==1)
  38. writer.write("Using 1 solved state:\r\n");
  39. else
  40. writer.write("Using "+previous.size()+" solved states:\r\n");
  41. for(byte[] i:solved)
  42. writer.write(printPermutation(i)+"\r\n");
  43. writer.write("\r\n");
  44. int depth=1;
  45. long numberOfElements=previous.size();
  46. writer.write(" 0 - "+previous.size()+"\r\n");
  47. long time=System.currentTimeMillis();
  48. Iterator<ByteArrayWrapper> iterator;
  49. long count;
  50. int generatorsLength;
  51. while(previous.size()>0)
  52. {
  53. iterator=previous.iterator();
  54. count=0;
  55. while(iterator.hasNext())
  56. {
  57. count++;
  58. if(count%100000==0)
  59. System.out.print("\r Depth "+depth+": "+(100.0*count/previous.size())+"% complete...");
  60. byte[] state=iterator.next().data;
  61. generatorsLength=moves[state[permutationElements]].length;
  62. for(int i=0;i<generatorsLength;i++)
  63. {
  64. ByteArrayWrapper next=new ByteArrayWrapper(compose(state,moves[state[permutationElements]][i]));
  65. if(!previous.contains(next)&&!previousPrevious.contains(next))
  66. current.add(next);
  67. }
  68. }
  69. if(current.size()>0)
  70. {
  71. numberOfElements+=current.size();
  72. writer.write((depth<10?" ":"")+depth+" - "+current.size()+"\r\n");
  73. System.out.print("\r ");
  74. System.out.println("\r "+depth+" - "+current.size());
  75. }
  76. previousPrevious=previous;
  77. previous=current;
  78. current=new HashSet<ByteArrayWrapper>();
  79. depth++;
  80. }
  81. time=System.currentTimeMillis()-time;
  82. writer.write("Total number of configurations: "+numberOfElements+"\r\n\r\n");
  83. iterator=previousPrevious.iterator();
  84. if(previousPrevious.size()==1)
  85. writer.write("The single antipode position:\r\n"+printPermutation(iterator.next().data)+"\r\n");
  86. else
  87. {
  88. writer.write("The "+previousPrevious.size()+" hardest positions:\r\n");
  89. while(iterator.hasNext())
  90. writer.write(printPermutation(iterator.next().data)+"\r\n");
  91. }
  92. writer.write("\r\n");
  93. writer.write("Time spent: "+time);
  94. writer.close();
  95. }
  96. public static byte[] compose(byte[] start, byte[] operation)
  97. {
  98. byte[] ans=new byte[start.length];
  99. for(int i=0;i<permutationElements;i++)
  100. ans[i]=start[operation[i]];
  101. ans[permutationElements]=operation[permutationElements];
  102. return ans;
  103. }
  104. public static void importData(String fileName) throws IOException
  105. {
  106. BufferedReader in = new BufferedReader(new FileReader(fileName+".txt"));
  107. System.out.println("Reading file "+fileName+".txt...");
  108. puzzleName=in.readLine();
  109. String line=in.readLine();
  110. while(line!=null&&line.compareTo("Moves:")!=0)
  111. line=in.readLine();
  112. line=in.readLine();
  113. int numberOfStates=0;
  114. ArrayList<Byte> numberOfMoves=new ArrayList<Byte>();
  115. byte maxPermutationElement=0;
  116. while(line!=null&&line.compareTo("")!=0)
  117. {
  118. numberOfStates++;
  119. line=in.readLine();
  120. byte numberOfMovesHere=0;
  121. while(line!=null&&line.compareTo("")!=0&&line.substring(0,5).compareTo("State")!=0)
  122. {
  123. numberOfMovesHere++;
  124. for(int i=line.indexOf(':')+1;i<line.indexOf(',');i++)
  125. if(line.charAt(i)!='('&&line.charAt(i)!=')'&&line.charAt(i)!='.'&&characterInterpretation(line.charAt(i))>maxPermutationElement)
  126. maxPermutationElement=characterInterpretation(line.charAt(i));
  127. line=in.readLine();
  128. }
  129. numberOfMoves.add(numberOfMovesHere);
  130. }
  131. permutationElements=++maxPermutationElement;
  132. System.out.println(numberOfStates+" states found.");
  133. System.out.print("States have {");
  134. for(int i=0;i<numberOfMoves.size();i++)
  135. {
  136. if(i!=0)
  137. System.out.print(",");
  138. System.out.print(numberOfMoves.get(i));
  139. }
  140. System.out.println("} moves available");
  141. System.out.println(permutationElements+" permutation elements used.");
  142. in.close();
  143. moves=new byte[numberOfStates][][];
  144. moveNames=new String[numberOfStates][];
  145. solved=new ArrayList<byte[]>();
  146. byte[] tempsolved=new byte[permutationElements+1];
  147. for(byte i=0;i<permutationElements;i++)
  148. tempsolved[i]=i;
  149. solved.add(tempsolved);
  150. in = new BufferedReader(new FileReader(fileName+".txt"));
  151. line=in.readLine();
  152. while(line!=null)
  153. {
  154. if(line.compareTo("Moves:")==0)
  155. {
  156. line=in.readLine();
  157. int state=0;
  158. while(line!=null&&line.compareTo("")!=0)
  159. {
  160. System.out.println("State "+state);
  161. moves[state]=new byte[numberOfMoves.get(state)][permutationElements+1];
  162. moveNames[state]=new String[numberOfMoves.get(state)];
  163. int move=0;
  164. line=in.readLine();
  165. while(line!=null&&line.compareTo("")!=0&&line.substring(0,5).compareTo("State")!=0)
  166. {
  167. moveNames[state][move]=line.substring(0,line.indexOf(':'));
  168. for(byte i=0;i<permutationElements;i++)
  169. moves[state][move][i]=i;
  170. byte temp=-1,last=-1;
  171. for(int i=line.indexOf(':')+1;i<line.indexOf(',');i++)
  172. {
  173. if(line.charAt(i)=='(')
  174. {
  175. i++;
  176. temp=last=characterInterpretation(line.charAt(i));
  177. }
  178. else if(line.charAt(i)==')')
  179. moves[state][move][last]=temp;
  180. else
  181. {
  182. moves[state][move][characterInterpretation(line.charAt(i))]=temp;
  183. temp=characterInterpretation(line.charAt(i));
  184. }
  185. }
  186. moves[state][move][permutationElements]=characterInterpretation(line.charAt(line.indexOf(',')+1));
  187. System.out.println(moveNames[state][move]+": "+printPermutation(moves[state][move]));
  188. line=in.readLine();
  189. move++;
  190. }
  191. state++;
  192. }
  193. }
  194. else if(line.compareTo("Indistinguishables:")==0)
  195. {
  196. line=in.readLine();
  197. while(line!=null&&line.compareTo("")!=0)
  198. {
  199. for(int i=1;i<line.length();i++)
  200. solved.get(0)[characterInterpretation(line.charAt(i))]=characterInterpretation(line.charAt(0));
  201. line=in.readLine();
  202. }
  203. System.out.println("Assumed solved state accounting for indistinguishable permutation elements:");
  204. System.out.println(printPermutation(solved.get(0)));
  205. }
  206. line=in.readLine();
  207. }
  208. in.close();
  209. }
  210. public static String printPermutation(byte[] array)
  211. {
  212. String ans="";
  213. for(int i=0;i<array.length;i++)
  214. {
  215. if(i==permutationElements)
  216. ans+=",";
  217. if(array[i]==-1)
  218. ans+="?";
  219. else if(array[i]<10)
  220. ans+=array[i];
  221. else if(array[i]<36)
  222. ans+=(char)(array[i]-10+'a');
  223. else
  224. ans+=(char)(array[i]-36+'A');
  225. }
  226. return ans;
  227. }
  228. public static byte characterInterpretation(char c)
  229. {
  230. if(c>='0'&&c<='9')
  231. return (byte)(c-'0');
  232. if(c>='a'&&c<='z')
  233. return (byte)(c-'a'+10);
  234. if(c>='A'&&c<='Z')
  235. return (byte)(c-'A'+36);
  236. return -1;
  237. }
  238. }
  239. class ByteArrayWrapper
  240. {
  241. final byte[] data;
  242. public ByteArrayWrapper(byte[] data)
  243. {
  244. this.data = data;
  245. }
  246.  
  247. @Override
  248. public boolean equals(Object other)
  249. {
  250. if(!(other instanceof ByteArrayWrapper))
  251. return false;
  252. return Arrays.equals(data,((ByteArrayWrapper)other).data);
  253. }
  254.  
  255. @Override
  256. public int hashCode()
  257. {
  258. return Arrays.hashCode(data);
  259. }
  260. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement