コード例 #1
0
ファイル: word_search_2.py プロジェクト: RobLeggett/codes
def search_in_board(words, board):
    trie = Trie.create(words+words[::-1])
    acc_hash = {}
    handled_paths = []
    pos_list = [(i,j) for i in range(len(board)) for j in range(len(board[0]))]
    while len(pos_list) > 0:
        i,j = pos_list.pop(0)
        cur_char = board[i][j]
        # ((0,0),'o',[])
        cur_word_point = ([(i,j)], cur_char)
        # [((1,0),'e'),((0,1),'a')]
        neighbors = find_neighbors((i,j),board)
        cur_words = acc_hash.get((i,j), [])
        # remove all the paths which have been handled
        cur_words = filter(lambda x: x[0] not in handled_paths, cur_words)
        filtered_prefixs = filter_by_prefix(
                cur_words+[cur_word_point], neighbors, trie)
        # [((0,1),'oa',[(0,0)])]
        update_acc_hash(acc_hash, filtered_prefixs)
        # add all the paths which have been handled
        map(lambda x: handled_paths.append(x[0]), cur_words)
        # add some position for new path
        for cur_word_point in filtered_prefixs:
            cur_pos = cur_word_point[0][-1]
            if cur_pos not in pos_list:
                pos_list.append(cur_pos)


    # return acc_hash
    word_points = filter_words(acc_hash)
    return map(lambda x: (x[1], x[0]), word_points)
コード例 #2
0
ファイル: word_search_2.py プロジェクト: RobLeggett/codes
              ['i','f','l','v']
            ]

    words = ["oath","pea","eat","rain"]

    with test(check_in_board_range):
        check_in_board_range((0,0), (3,2)).must_true()
        check_in_board_range((3,0), (3,2)).must_false()
        pass  

    with test(find_neighbors):
        find_neighbors((0,0), board).must_equal(
                [((1, 0), 'e'), ((0, 1), 'a')])

    with test(filter_by_prefix):
        trie = Trie.create(words)
        cur_word_point = ([(0,0)], "o")
        neighbors = [((1, 0), 'e'), ((0, 1), 'a')]
        filter_by_prefix([cur_word_point], 
                neighbors,trie).must_equal(
                [([(0, 0), (0, 1)], 'oa', False)])

    with test(update_acc_hash):
        acc_hash = {}
        filtered_prefixs = [([(0, 0), (0, 1)], 'oa', False)]
        update_acc_hash(acc_hash, filtered_prefixs).must_equal(
                {(0, 1): [([(0, 0), (0, 1)], 'oa', False)]})
        acc_hash.must_equal(
                {(0, 1): [([(0, 0), (0, 1)], 'oa', False)]})
    with test(search_in_board):
        search_in_board(words, board).pp()