Advertisement
Guest User

dadsd

a guest
Oct 17th, 2019
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.53 KB | None | 0 0
  1. fun baldaSearcher(inputName: String, words: Set<String>): Set<String> {
  2. val root = TrieNode()
  3. val dictionary = arrayOfNulls<String>(words.size)
  4. set = TreeSet()
  5. var jindex = 0
  6. for (word in words) {
  7. dictionary[jindex] = word
  8. jindex++
  9. }
  10. val n = words.size
  11. for (i in 0 until n)
  12. insert(root, dictionary[i]!!)
  13.  
  14. val listOfLetters = ArrayList<String>()
  15. val file = File(inputName).readLines()
  16. for (line in file) {
  17. listOfLetters.add(line)
  18. }
  19. val height = listOfLetters.size
  20. val width = listOfLetters[0].split(" ".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray().size
  21. M = height
  22. N = width
  23. val arrayOfLetters = Array(height) { CharArray(width) }
  24. for (i in 0 until height) {
  25. val stringLetters = listOfLetters[i].split(" ".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
  26. for (j in 0 until width) {
  27. arrayOfLetters[i][j] = stringLetters[j][0]
  28. }
  29. }
  30.  
  31. findWords(arrayOfLetters, root)
  32.  
  33. return set
  34. }
  35.  
  36. // Alphabet size
  37. internal val SIZE = 100000
  38.  
  39. internal var M: Int = 0
  40. internal var N: Int = 0
  41. internal var set: MutableSet<String> = TreeSet()
  42.  
  43. // trie Node
  44. internal class TrieNode {
  45. var child = arrayOfNulls<TrieNode>(SIZE)
  46.  
  47. // isLeaf is true if the node represents
  48. // end of a word
  49. var leaf: Boolean = false
  50.  
  51. //constructor
  52. init {
  53. leaf = false
  54. for (i in 0 until SIZE)
  55. child[i] = null
  56. }
  57. }
  58.  
  59. // If not present, inserts a key into the trie
  60. // If the key is a prefix of trie node, just
  61. // marks leaf node
  62. internal fun insert(root: TrieNode, Key: String) {
  63. val n = Key.length
  64. var pChild = root
  65.  
  66. for (i in 0 until n) {
  67. val index = Key[i] - 'A'
  68.  
  69. if (pChild.child[index] == null)
  70. pChild.child[index] = TrieNode()
  71.  
  72. pChild = pChild.child[index]!!
  73. }
  74.  
  75. // make last node as leaf node
  76. pChild.leaf = true
  77. }
  78.  
  79. // function to check that current location
  80. // (i and j) is in matrix range
  81. internal fun isSafe(i: Int, j: Int, visited: Array<BooleanArray>): Boolean {
  82. return i >= 0 && i < M && j >= 0 &&
  83. j < N && !visited[i][j]
  84. }
  85.  
  86. // A recursive function to print all words present on boggle
  87. internal fun searchWord(
  88. root: TrieNode, boggle: Array<CharArray>, i: Int,
  89. j: Int, visited: Array<BooleanArray>, str: String
  90. ) {
  91. // if we found word in trie / dictionary
  92. if (root.leaf)
  93. set.add(str)
  94.  
  95. // If both I and j in range and we visited
  96. // that element of matrix first time
  97. if (isSafe(i, j, visited)) {
  98. // make it visited
  99. visited[i][j] = true
  100.  
  101. // traverse all child of current root
  102. for (K in 0 until SIZE) {
  103. if (root.child[K] != null) {
  104. // current character
  105. val ch = (K + 'A'.toInt()).toChar()
  106.  
  107. // Recursively search reaming character of word
  108. // in trie for all 8 adjacent cells of
  109. // boggle[i][j]
  110. if (isSafe(i, j + 1, visited) && boggle[i][j + 1] == ch)
  111. searchWord(
  112. root.child[K]!!, boggle, i, j + 1,
  113. visited, str + ch
  114. )
  115. if (isSafe(i + 1, j, visited) && boggle[i + 1][j] == ch)
  116. searchWord(
  117. root.child[K]!!, boggle, i + 1, j,
  118. visited, str + ch
  119. )
  120. if (isSafe(i, j - 1, visited) && boggle[i][j - 1] == ch)
  121. searchWord(
  122. root.child[K]!!, boggle, i, j - 1,
  123. visited, str + ch
  124. )
  125. if (isSafe(i - 1, j, visited) && boggle[i - 1][j] == ch)
  126. searchWord(
  127. root.child[K]!!, boggle, i - 1, j,
  128. visited, str + ch
  129. )
  130. }
  131. }
  132.  
  133. // make current element unvisited
  134. visited[i][j] = false
  135. }
  136. }
  137.  
  138. // Prints all words present in dictionary.
  139. internal fun findWords(boggle: Array<CharArray>, root: TrieNode) {
  140. // Mark all characters as not visited
  141. val visited = Array(M) { BooleanArray(N) }
  142.  
  143. var str = ""
  144.  
  145. // traverse all matrix elements
  146. for (i in 0 until M) {
  147. for (j in 0 until N) {
  148. // we start searching for word in dictionary
  149. // if we found a character which is child
  150. // of Trie root
  151. if (root.child[boggle[i][j] - 'A'] != null) {
  152. str += boggle[i][j]
  153. searchWord(
  154. root.child[boggle[i][j] - 'A']!!,
  155. boggle, i, j, visited, str
  156. )
  157. str = ""
  158. }
  159. }
  160. }
  161. }
  162.  
  163.  
  164. //TEST
  165. assertEquals(
  166. setOf("ТРАВА", "КРАН", "АКВА", "НАРТЫ"),
  167. baldaSearcher("input/balda_in1.txt", setOf("ТРАВА", "КРАН", "АКВА", "НАРТЫ", "РАК"))
  168. )
  169. assertEquals(
  170. setOf("БАЛДА"),
  171. baldaSearcher("input/balda_in2.txt", setOf("БАЛАБОЛ", "БАЛДА", "БАЛДАЗАВР"))
  172. )
  173. assertEquals(
  174. setOf(
  175. "АПЕЛЬСИН", "МАРОККО", "ПЕРЕМЕНЫ", "ГРАВИТАЦИЯ",
  176. "РАССУДИТЕЛЬНОСТЬ", "КОНСТАНТИНОПОЛЬ", "ПРОГРАММИРОВАНИЕ", "ПОМЕХОУСТОЙЧИВОСТЬ", "АППРОКСИМАЦИЯ",
  177. "ЭЙНШТЕЙН"
  178. ),
  179. baldaSearcher(
  180. "input/balda_in3.txt", setOf(
  181. "АПЕЛЬСИН", "МАРОККО", "ЭФИОПИЯ", "ПЕРЕМЕНЫ", "ГРАВИТАЦИЯ",
  182. "РАССУДИТЕЛЬНОСТЬ", "БЕЗРАССУДНОСТЬ", "КОНСТАНТИНОПОЛЬ", "СТАМБУЛ", "ПРОГРАММИРОВАНИЕ",
  183. "ПРОСТРАНСТВО", "ДИАЛЕКТИКА", "КВАЛИФИКАЦИЯ", "ПОМЕХОУСТОЙЧИВОСТЬ", "КОГЕРЕНТНОСТЬ",
  184. "АППРОКСИМАЦИЯ", "ИНТЕРПОЛЯЦИЯ", "МАЙЕВТИКА", "ШРЕДИНГЕР", "ЭЙНШТЕЙН"
  185. )
  186. )
  187. )
  188. assertEquals(
  189. setOf("ДОБРЫЙДЕНЬ", "ДЕНЬ", "ДА", "МЕНЯ", "УТРОМ", "ЭС"),
  190. baldaSearcher(
  191. "input/balda_in4.txt",
  192. setOf(
  193. "СТВОРКА",
  194. "ДОБРЫЙДЕНЬ",
  195. "ДА",
  196. "МЕНЯ",
  197. "УТРОМ",
  198. "МЕРА",
  199. "МОРТИ",
  200. "ЭС",
  201. "ХЕЛЛОУ",
  202. "ДЕНЬ"
  203. )
  204. )
  205. )
  206. assertEquals(
  207. setOf("AQUA", "BUACHA", "COSMIC", "FAOWC", "KERTNOW", "KNOW", "NOW", "ROW", "WORWON"),
  208. baldaSearcher(
  209. "input/balda_in5.txt",
  210. setOf(
  211. "AQUA",
  212. "BUACHA",
  213. "KERTNOW",
  214. "MUST",
  215. "NOW",
  216. "TEST",
  217. "ABUHCA",
  218. "KNOW",
  219. "ROW",
  220. "WORWON",
  221. "COSMIC",
  222. "FAOWC",
  223. "FHOOC"
  224. )
  225. )
  226. )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement