From 0f5e5af5aec60b8753221ab0878a96ae903f908e Mon Sep 17 00:00:00 2001 From: Cameron Blankenbuehler Date: Mon, 29 Aug 2022 15:20:49 -0400 Subject: [PATCH] Update boggler_utils main to accept board.csv file --- boggler_utils.py | 51 ++++++++++++++++++++++++------------------------ 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/boggler_utils.py b/boggler_utils.py index aab3615..140bd2f 100644 --- a/boggler_utils.py +++ b/boggler_utils.py @@ -180,6 +180,7 @@ class WordTree: self.__root = root self.__max_word_len = max_word_len self.__tree = {} + self.__leaf_nodes = [] # Generate root node self.__tree[root.char] = root @@ -215,6 +216,15 @@ class WordTree: '''Getter for tree property''' return self.__tree + @property + def leaf_nodes_by_word(self): + '''Getter for leaf_nodes property''' + return self.__leaf_nodes + + @leaf_nodes_by_word.setter + def leaf_nodes_by_word(self, value): + self.__leaf_nodes = value + def __str__(self): return ", ".join(self.wordlist) @@ -252,6 +262,10 @@ class WordTree: return curr_node + # TODO: implement tree walk + # def walk_tree(self): + # pass + def build_boggle_tree(self, board: BoggleBoard, board_cell: BoardCell, subtree: WordTree, depth: int = 0) -> WordTree: '''Return subtree of board given a particular root (first letter). @@ -263,15 +277,17 @@ class WordTree: ''' # TODO rework active_node refs for recursion so don't have to be reset to parent at every point of return + # if self.active_node.is_word: + # # word_path = subtree.active_node.path[::-1] + # # print("WORD FOUND:", "".join([board.board[x].letter for x in word_path]), word_path) + # subtree.leaf_nodes.append(self.active_node) + if self.active_node.is_word and len(self.active_node.children) == 0: - word_path = subtree.active_node.path[::-1] + #word_path = subtree.active_node.path[::-1] # print("WORD FOUND:", "".join([board.board[x].letter for x in word_path]), word_path) self.active_node = self.active_node.parent subtree.active_node = subtree.active_node.parent return - elif self.active_node.is_word: - word_path = subtree.active_node.path[::-1] - # print("WORD FOUND:", "".join([board.board[x].letter for x in word_path]), word_path) elif depth > self.max_word_len: # print(f"MAX DEPTH REACHED! Depth = {depth}") self.active_node = self.active_node.parent @@ -296,6 +312,7 @@ class WordTree: def build_full_boggle_tree(board: BoggleBoard, wordlist_path: str) -> dict[str, WordTree]: '''Return dictionary of WordTree(s) for every letter on a BoggleBoard''' + # TODO: implement multiprocessing / multitthreading for each start letter alphabet = "".join(sorted(set([cell.letter for cell in board.board.values()]))) board_tree = {} index = {} @@ -307,9 +324,9 @@ def build_full_boggle_tree(board: BoggleBoard, wordlist_path: str) -> dict[str, wordlist = read_wordlist(path.join(path.abspath(wordlist_path), filename)) index[letter] = wordlist - print("Generating WordTrees") + print("Generating WordTrees...") for cell in board.board.values(): - print(cell) + print(f">> {cell}") dict_tree = WordTree(alphabet, WordNode(cell.letter), index[cell.letter]) sub_tree = WordTree(alphabet, WordNode(cell.letter, False, board_pos=cell.pos)) board_tree[cell.pos] = dict_tree.build_boggle_tree(board, cell, sub_tree) @@ -322,27 +339,11 @@ def read_wordlist(file): return {k:1 for k in file.read().split()} def read_boggle_file(file): - '''Return list of rows from Boggle board file''' + '''Return list of rows from Boggle board csv file''' with open(file, 'r', encoding='utf-8') as file: - return [x.rstrip() for x in file.readlines()] + return [x.rstrip().split(',') for x in file.readlines()] if __name__ == "__main__": - - b2 = [ - "iats", - "osep", - "tras", - "yegc" - ] - + b2 = read_boggle_file(sys.argv[1]) b2_board = BoggleBoard(b2) - - # sample_dict = read_wordlist("wordlists/dwyl/words_a.txt") - #sample_tree = WordTree("abcdefghijklmnopqrstuvwxyz", WordNode("a"), sample_dict) - #print("=" * 50) - - #start_pos = (0,1) - #b2_tree = WordTree("abcdefghijklmnopqrstuvwxyz", WordNode("a", False, board_pos=start_pos)) - #sub_tree = sample_tree.build_boggle_tree(b2_board, b2_board.board[start_pos], b2_tree) - boggle_tree = build_full_boggle_tree(b2_board, "wordlists/dwyl")