Resolver.java 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. package fr.pavnay.scrabble;
  2. import java.io.Serializable;
  3. import java.util.ArrayList;
  4. import java.util.Collections;
  5. import java.util.HashMap;
  6. import java.util.List;
  7. import java.util.Map;
  8. import java.util.Random;
  9. import fr.pavnay.scrabble.impl.HashNodeImpl;
  10. public class Resolver implements Serializable {
  11. private static final long serialVersionUID = 3424195161013074975L;
  12. public Node nodes = new HashNodeImpl();
  13. private float[] statistics = new float[26];
  14. private float totalCharacter = 0.0F;
  15. public Node getNode(char character) {
  16. Node node = nodes.getNode(character);
  17. this.statistics[(character - 'a')] += 1.0F;
  18. this.totalCharacter += 1.0F;
  19. return node;
  20. }
  21. public void updateStatistics(char character) {
  22. this.statistics[(character - 'a')] += 1.0F;
  23. this.totalCharacter += 1.0F;
  24. }
  25. public void computeStatistics() {
  26. for (int i = 0; i < 26; i++) {
  27. this.statistics[i] = (this.statistics[i] * 100.0F / this.totalCharacter);
  28. System.out.println((char) (i + 97) + "=" + this.statistics[i] + "%");
  29. }
  30. }
  31. public void displayStatistics() {
  32. for (int i = 0; i < 26; i++) {
  33. System.out.println((char) (i + 97) + "=" + this.statistics[i] + "%");
  34. }
  35. }
  36. public float[] getStatistics() {
  37. return this.statistics;
  38. }
  39. public Enigma generateEnigma(int minimalLettersCount, int maximalLettersCount) {
  40. boolean mustRun = false;
  41. char[] letters;
  42. Map<Integer, List<String>> allWords;
  43. do {
  44. letters = getRandomSet(maximalLettersCount);
  45. allWords = getWords(letters, minimalLettersCount);
  46. int wordsCount = 0;
  47. for (int i = minimalLettersCount; i < maximalLettersCount + 1; i++) {
  48. List<String> words = allWords.get(Integer.valueOf(i));
  49. if (words != null) {
  50. wordsCount += words.size();
  51. }
  52. }
  53. mustRun = wordsCount < (maximalLettersCount + minimalLettersCount) * 0.7D;
  54. } while (mustRun);
  55. return new Enigma(letters, allWords, minimalLettersCount, maximalLettersCount);
  56. }
  57. private char[] getRandomSet(int maxLetter) {
  58. float[] statistics = getStatistics();
  59. float max = 0.0F;
  60. for (int i = 0; i < 26; i++) {
  61. max += statistics[i];
  62. }
  63. Random randomizer = new Random();
  64. char[] letters = new char[maxLetter];
  65. for (int i = 0; i < maxLetter; i++) {
  66. letters[i] = getRandomLetter(randomizer, max, statistics);
  67. }
  68. return letters;
  69. }
  70. private char getRandomLetter(Random randomizer, float max, float[] statistics) {
  71. float r = randomizer.nextFloat() * (int) max;
  72. max = 0.0F;
  73. for (int i = 0; i < 26; i++) {
  74. max += statistics[i];
  75. if (r < max) {
  76. return (char) (i + 97);
  77. }
  78. }
  79. return 'z';
  80. }
  81. private Map<Integer, List<String>> getWords(char[] letters, int minimum) {
  82. List<String> words = new ArrayList<String>();
  83. for (int i = letters.length; i > 2; i--) {
  84. List<String> newWords = getWords(letters, minimum, i);
  85. if (newWords != null) {
  86. for (String word : newWords) {
  87. if (!words.contains(word)) {
  88. words.add(word);
  89. }
  90. }
  91. }
  92. }
  93. Map<Integer, List<String>> lists = new HashMap<Integer, List<String>>();
  94. for (String word : words) {
  95. List<String> list = lists.get(Integer.valueOf(word.length()));
  96. if (list == null) {
  97. list = new ArrayList<String>();
  98. lists.put(Integer.valueOf(word.length()), list);
  99. }
  100. list.add(word);
  101. }
  102. for (int i = letters.length; i > 2; i--) {
  103. List<String> list = lists.get(Integer.valueOf(i));
  104. if (list != null) {
  105. Collections.sort(list);
  106. }
  107. }
  108. return lists;
  109. }
  110. public List<String> getWords(char[] letters, int minimum, int size) {
  111. if (size < minimum) {
  112. return null;
  113. }
  114. String set = new String(letters);
  115. char[] sortLetters = StringUtils.sortLetters(set);
  116. int setSize = letters.length;
  117. if (size == setSize) {
  118. Node currentNode = nodes.getNode(sortLetters[0]);
  119. if (currentNode == null) {
  120. return null;
  121. }
  122. for (int i = 1; i < setSize; i++) {
  123. currentNode = currentNode.getNode(sortLetters[i]);
  124. if (currentNode == null) {
  125. return null;
  126. }
  127. if (i == setSize - 1) {
  128. return currentNode.getWords();
  129. }
  130. }
  131. return null;
  132. }
  133. String nString = new String(sortLetters);
  134. List<String> results = null;
  135. for (int i = 0; i < setSize - size; i++) {
  136. for (int j = 0; j < setSize; j++) {
  137. List<String> words = getWords(
  138. (nString.substring(0, j) + nString.subSequence(j + 1, setSize)).toCharArray(), minimum,
  139. size - i);
  140. if (words != null) {
  141. if (results == null) {
  142. results = new ArrayList<String>();
  143. }
  144. for (String word : words) {
  145. if (!results.contains(word)) {
  146. results.add(word);
  147. }
  148. }
  149. }
  150. }
  151. }
  152. if (results != null) {
  153. Collections.sort(results);
  154. }
  155. return results;
  156. }
  157. public int countWords() {
  158. int total = 0;
  159. for (int i = 0; i < 26; i++) {
  160. // Node current = this.nodes[i];
  161. Node current = nodes.getNode((char)(i + 'a'));
  162. if (current != null) {
  163. total += current.getWordsCount();
  164. }
  165. }
  166. return total;
  167. }
  168. }