Guest User

Untitled

a guest
Jan 23rd, 2019
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.73 KB | None | 0 0
  1. from queue import Queue
  2. import unittest
  3.  
  4. class Node():
  5. def __init__(self, char):
  6. self.char = char
  7. self.children = set()
  8. self.finished = False
  9.  
  10. class Trie():
  11. def __init__(self):
  12. self.root = Node('')
  13. self.char_score = {
  14. 'a' : 1, 'b' : 3, 'c' : 5, 'd' : 2, 'e' : 1, 'f' : 4,
  15. 'g' : 3, 'h' : 4, 'i' : 1, 'j' : 4, 'k' : 3, 'l' : 3,
  16. 'm' : 3, 'n' : 1, 'o' : 1, 'p' : 3, 'q' : 10, 'r' : 2,
  17. 's' : 2, 't' : 2, 'u' : 4, 'v' : 4, 'w' : 5, 'x' : 8,
  18. 'y' : 8, 'z' : 4
  19. }
  20.  
  21. def add(self, word):
  22. """Adds a word to the trie"""
  23. node = self.root
  24. for char in word:
  25. for child in node.children:
  26. if child.char == char:
  27. node = child
  28. break
  29. else:
  30. new_node = Node(char)
  31. node.children.add(new_node)
  32. node = new_node
  33. node.finished = True
  34.  
  35. def _get_possible_words(self, letters):
  36. """
  37. Generates all possible words that can be made in the trie
  38.  
  39. letters: (list)
  40. A list of letters
  41. * stands for a joker
  42. """
  43. que = Queue()
  44. que.put((self.root, self.root.char, letters))
  45. while que.qsize() > 0:
  46. node, word, letters_left = que.get()
  47. for child in node.children:
  48. if letters_left and (child.char in letters_left or "*" in letters_left):
  49. new_word = word + child.char
  50. new_bag = letters_left[:]
  51. new_bag.remove(child.char if child.char in letters_left else "*")
  52. que.put((child, new_word, new_bag))
  53. if child.finished:
  54. yield new_word
  55.  
  56.  
  57. def get_best_words(self, letters):
  58. """Returns a sorted list based on the (score, length of the word)"""
  59. return sorted(
  60. (w for w in self._get_possible_words(letters)),
  61. key=lambda w: (
  62. -sum(self.char_score[c] for c in w),
  63. len(w)
  64. )
  65. )
  66.  
  67. # Tests
  68. class TrieTest(unittest.TestCase):
  69. def setUp(self):
  70. self.trie = Trie()
  71. self.words = ('tekst', 'test', 'tekens', 'tek', 'tekst', 'teksten')
  72. for word in self.words:
  73. self.trie.add(word)
  74.  
  75. def test_get_best(self):
  76. self.assertEqual(
  77. ['tekst', 'test', 'tek'],
  78. self.trie.get_best_words(['t', 'k', 'e', 's', 't', 'n'])
  79. )
  80.  
  81. def test_get_best_joker(self):
  82. self.assertEqual(
  83. ['teksten', 'tekst', 'tekens', 'test', 'tek'],
  84. self.trie.get_best_words(['t', 'k', 'e', 's', 't', '*', 'n'])
  85. )
  86.  
  87. if __name__ == '__main__':
  88. unittest.main()
Add Comment
Please, Sign In to add comment