Beispiel #1
0
def doPuzzle():
    url = 'https://www.anandabazar.com/others/crossword'
    if needToFetchFromWebsite():
        crossword_index = saveImageAndCluesFromWebsite(url)
    else:
        with open('crossword-index.txt', 'r') as f:
            crossword_index = f.readline().strip()
    crossword_len = 15

    # Primary data-structure
    # each cell of grid contains 3 integers
    # the first integer is 1 if it is a word cell else 0
    # the second integer is horizontal clue index or 0
    # the third boolean is vertical clue index or 0
    grid = np.zeros((crossword_len, crossword_len, 3), dtype=int)
    puzzle = crossword.Crossword(crossword_len,
                                 crossword_len)  # Secondary data-structure
    puzzle.meta.kind = 'http://ipuz.org/crossword#1'
    convertImageToGrid('image-{}.jpg'.format(crossword_index), grid, puzzle)
    populatePuzzleClues(crossword_index, puzzle)
    #writeIpuzFile(puzzle, 'crossword.ipuz')
    #writeTexFile(grid, 'crossword.tex')
    #import pdb;pdb.set_trace()

    grid_cell_length = 30
    shape = grid.shape
    window_width = grid_cell_length * shape[0] * 3
    window_height = grid_cell_length * shape[1] * 1.8
    app = QApplication(sys.argv)
    widget = CrosswordWidget(crossword_index, grid, grid_cell_length,
                             puzzle.clues.across(), puzzle.clues.down())
    window = CrosswordGridWindow(crossword_index, widget, window_width,
                                 window_height)
    window.show()
    sys.exit(app.exec_())
Beispiel #2
0
def build_crossword(board):
    if type(board) == str or type(board) == unicode:
        board = [list(row) for row in board.split('\n')]
    cw = crossword.Crossword()
    cw.board_height = len(board)
    cw.board_width = len(board[0])
    cw.board = board
    return cw
Beispiel #3
0
def get_index():
    cw = crossword.Crossword()

    cc = ReactCrossword(board=cw.board)
    #    cc = CrosswordComponent(crossword=cw)
    cc.set_ref("crossword")

    return flask.render_template("crossword.html", crossword=cc)
Beispiel #4
0
def rerender(cls, board):
    cw = crossword.Crossword()
    cw.board_height = len(board)
    cw.board_width = len(board[0])
    cw.board = board

    print "made crossword", cw

    cc = CrosswordComponent(crossword=cw)

    return cls.replace_html(cc.render())
Beispiel #5
0
 def test_empty_puzzles_has_mostly_mandatory_ipuz_elements(self):
     puzzle = crossword.Crossword(15, 15)
     ipuz_dict = crossword.to_ipuz(puzzle)
     self.assertEqual(
         ipuz_dict, {
             "version": "http://ipuz.org/v1",
             "dimensions": {
                 "width": 15,
                 "height": 15,
             },
             "puzzle": [[None for _ in range(15)] for _ in range(15)],
             "solution": [[None for _ in range(15)] for _ in range(15)]
         })
Beispiel #6
0
def get_crossword(id):
    c = models.Board.select().where(models.Board.id == id).get()
    print c.board
    cw = crossword.Crossword()
    if type(c.board) == str or type(c.board) == unicode:
        board = [list(row) for row in c.board.split('\n')]
        cw.board = board
        cw.board_height = len(board)
        cw.board_length = len(board[0])

    print type(c.board)

    cc = ReactCrossword(board=cw.board, boardId=id)
    cc.set_ref("crossword")

    return flask.render_template("crossword.html", crossword=cc)
Beispiel #7
0
def xd_to_puz(filename, filename_out):
    xd = xdfile(open(filename).read())

    grid = xd.grid
    maxx = len(grid[0])
    maxy = len(grid)

    puzzle = crossword.Crossword(maxx, maxy)

    title = 'unknown'
    author = 'unknown'

    for h in xd.headers:
        if h[0] == 'Title':
            title = h[1]
        if h[0] == 'Author':
            author = h[1]

    puzzle.meta.creator = author
    puzzle.meta.title = title

    for xdc_tuple in xd.clues:
        dnum, c, a = xdc_tuple
        d, n = dnum

        if d == 'A':
            puzzle.clues.across[int(n)] = c
        else:
            puzzle.clues.down[int(n)] = c

    for direction, number, clue in puzzle.clues.all():
        print(direction, number, clue)

    for y in range(0, maxy):
        for x in range(0, maxx):
            ch = grid[y][x]
            if ch != '#':
                puzzle[y][x].cell = " "
                puzzle[y][x].solution = grid[y][x]
            else:
                puzzle[y][x].cell = "."
                puzzle[y][x].block = None
                puzzle[y][x].solution = None

    puz = crossword.to_puz(puzzle)
    puz.fill = ''.join([x if x == '.' else '-' for x in puz.solution])
    puz.save(filename_out)
Beispiel #8
0
    def generate_clues(self, d_ans, a_ans):
        # initialize the crossword
        crossword = cw.Crossword(self.size)

        #iterate through the answers
        answers = []
        answers.extend(d_ans)
        answers.extend(a_ans)
        for answer in answers:
            if answer == None:
                continue
            word = answer.get_answer()
            if '-' in word:
                return None
            #select the clue and add it to the crossword
            crossword.add_clue(answer, self.clue_repo.select_clue(word))
        return crossword
Beispiel #9
0
def main():
    """
    Test Functionality Implementations.

    Tests the Implemented Functions against the Spacifications.
    """
    # Create Generic Test Crosswords
    crossword_0 = cw.Crossword('data/structure0.txt', 'data/words0.txt')
    crossword_1 = cw.Crossword('data/structure1.txt', 'data/words1.txt')
    crossword_2 = cw.Crossword('data/structure2.txt', 'data/words2.txt')
    ##crossword_test = cw.Crossword('data/structure_test.txt', 'data/words_test.txt')
    # Test Implemented Functions on demand
    tests = {
        'N': 'enforce_node_consistency()',
        'R': 'revise()',
        '3': 'ac3()',
        'A': 'assignment_complete()',
        'C': 'consistent()',
        'O': 'order_domain_values()',
        'U': 'select_unassigned_variable()',
        'B': 'backtrack()'
    }
    system('cls')
    while True:
        print('Testing the CrosswordCreator:')
        for key, description in tests.items():
            print(f'{key}: {description}')
        action = (input(f'Your choice (<Enter> to stop): ') + ' ')[0].upper()
        if action == ' ':
            break
        if action not in tests.keys():
            print(f'Illegal Choice: {action}')
        else:
            # Start the chosen Test
            system('cls')
            print(f'Test {tests[action]}')
            print()
            if action == 'N':
                # 'N': 'enforce_node_consistency'
                creator = CrosswordCreator(crossword_0)
                # Prepare Testcase
                for var, domain in creator.domains.items():
                    print(var, len(domain))
                print()
                # Apply enforce_node_consistency()
                input(f'Press <Enter> to test {tests[action]} ...')
                creator.enforce_node_consistency()
                print()
                for var, domain in creator.domains.items():
                    print(var, domain)
                print()
            elif action == 'R':
                # 'R': 'revise'
                creator = CrosswordCreator(crossword_0)
                # Prepare Testcase
                across_4_1 = get_var(crossword_0, cw.Variable.ACROSS, 4, 1)
                down_0_1 = get_var(crossword_0, cw.Variable.DOWN, 0, 1)
                down_1_4 = get_var(crossword_0, cw.Variable.DOWN, 1, 4)
                creator.enforce_node_consistency()
                testset = (across_4_1, down_0_1, down_1_4)
                creator.domains[across_4_1].add('NOUN')
                creator.domains[down_0_1] = {'SEVEN'}
                creator.domains[down_1_4] = {'NOUN'}
                for var in testset:
                    print(var, creator.domains[var])
                print()
                # revise(across_4_1, down_0_1) (to check overlapping gharacter)
                input(
                    f'Press <Enter> to make [{across_4_1}] comply with [{down_0_1}] ...'
                )
                print_result(creator.revise(across_4_1, down_0_1), 'NO',
                             'Words removed from domain')
                # if not creator.revise(across_4_1, down_0_1):
                #    print('No ', end='')
                # print('Words removed from domain!')
                # print()
                for var in testset:
                    print(var, creator.domains[var])
                print()
                # revise(across_4_1, down_0_1) AGAIN (to check return False)
                input(
                    f'Press <Enter> to make [{across_4_1}] comply with [{down_0_1}] ...'
                )
                print_result(creator.revise(across_4_1, down_0_1), 'NO',
                             'Words removed from domain')
                for var in testset:
                    print(var, creator.domains[var])
                print()
                # revise(across_4_1, down_1_4) (to check all words must be different)
                input(
                    f'Press <Enter> to make [{across_4_1}] comply with [{down_1_4}] ...'
                )
                print_result(creator.revise(across_4_1, down_1_4), 'NO',
                             'Words removed from domain')
                for var in testset:
                    print(var, creator.domains[var])
            elif action == '3':
                # '3': 'ac3'
                creator = CrosswordCreator(crossword_0)
                creator.enforce_node_consistency()
                # Prepare Testcase
                down_0_1 = get_var(crossword_0, cw.Variable.DOWN, 0, 1)
                for var, domain in creator.domains.items():
                    print(var, domain)
                print()
                # Apply ac3()
                input(f'Press <Enter> to test {tests[action]} ...')
                creator.ac3()
                print()
                for var, domain in creator.domains.items():
                    print(var, domain)
                print()
            elif action == 'A':
                # 'A': 'assignment_complete'
                creator = CrosswordCreator(crossword_0)
                # Prepare first testcase
                across_0_1 = get_var(crossword_0, cw.Variable.ACROSS, 0, 1)
                across_4_1 = get_var(crossword_0, cw.Variable.ACROSS, 4, 1)
                down_0_1 = get_var(crossword_0, cw.Variable.DOWN, 0, 1)
                down_1_4 = get_var(crossword_0, cw.Variable.DOWN, 1, 4)
                assignment = dict()
                assignment[across_0_1] = 'SIX'
                assignment[across_4_1] = 'NINE'
                assignment[down_1_4] = 'FIVE'
                print('---')
                creator.print(assignment)
                print('---')
                # Apply assignment_complete(assignment)
                input(f'Press <Enter> to test {tests[action]} ...')
                print_result(creator.assignment_complete(assignment),
                             'Not yet', 'Complete')
                # Prepare second testcase
                assignment[down_0_1] = 'SEVEN'
                print('---')
                creator.print(assignment)
                print('---')
                # Apply assignment_complete(assignment)
                input(f'Press <Enter> to test {tests[action]} ...')
                print_result(creator.assignment_complete(assignment),
                             'Not yet', 'Complete')
            elif action == 'C':
                # 'C': 'consistent'
                creator = CrosswordCreator(crossword_0)
                # Prepare first testcase
                across_0_1 = get_var(crossword_0, cw.Variable.ACROSS, 0, 1)
                across_4_1 = get_var(crossword_0, cw.Variable.ACROSS, 4, 1)
                down_0_1 = get_var(crossword_0, cw.Variable.DOWN, 0, 1)
                down_1_4 = get_var(crossword_0, cw.Variable.DOWN, 1, 4)
                assignment = dict()
                assignment[across_4_1] = 'SIX'
                print('---')
                creator.print(assignment)
                print('---')
                # Check Unary Constraint: Correct Length of word
                input(f'Press <Enter> to test {tests[action]} ...')
                print()
                print_result(creator.consistent(assignment), 'NOT',
                             'Consistent')
                # Prepare second testcase
                assignment[across_4_1] = 'NINE'
                assignment[down_1_4] = 'NINE'
                creator.print(assignment)
                print('---')
                # Check Binary Constraint: All words must be different
                input(f'Press <Enter> to test {tests[action]} ...')
                print()
                print_result(creator.consistent(assignment), 'NOT',
                             'Consistent')
                # Prepare second testcase
                assignment[down_0_1] = 'SEVEN'
                assignment[down_1_4] = 'FIVE'
                creator.print(assignment)
                print('---')
                # Check Binary Constraint: All words must be different
                input(f'Press <Enter> to test {tests[action]} ...')
                print()
                print_result(creator.consistent(assignment), 'NOT',
                             'Consistent')
            elif action == 'O':
                # 'O': 'order_domain_values'
                creator = CrosswordCreator(crossword_0)
                # Prepare Testcase
                across_0_1 = get_var(crossword_0, cw.Variable.ACROSS, 0, 1)
                across_4_1 = get_var(crossword_0, cw.Variable.ACROSS, 4, 1)
                down_0_1 = get_var(crossword_0, cw.Variable.DOWN, 0, 1)
                down_1_4 = get_var(crossword_0, cw.Variable.DOWN, 1, 4)
                creator.enforce_node_consistency()
                assignment = dict()
                # assignment[down_0_1] = 'SEVEN'
                # assignment[across_0_1] = 'SIX'
                assignment[down_1_4] = 'FIVE'
                var = across_0_1
                # var = across_4_1
                # var = down_0_1
                # var = down_1_4
                creator.print(assignment)
                for x_var in creator.domains.keys() - assignment.keys():
                    print(x_var, creator.domains[x_var])
                # Check ...
                input(f'Press <Enter> to test {tests[action]} for {var}...')
                print()
                print(var, creator.order_domain_values(var, assignment))

                ### 'O': 'order_domain_values'
                ##creator = CrosswordCreator(crossword_1)
                ### Prepare Testcase
                ##across_2_1 = get_var(crossword_1, cw.Variable.ACROSS, 2, 1)
                ##across_4_4 = get_var(crossword_1, cw.Variable.ACROSS, 4, 4)
                ##across_6_5 = get_var(crossword_1, cw.Variable.ACROSS, 6, 5)
                ##down_2_1 = get_var(crossword_1, cw.Variable.DOWN, 2, 1)
                ##down_1_7 = get_var(crossword_1, cw.Variable.DOWN, 1, 7)
                ##down_1_12 = get_var(crossword_1, cw.Variable.DOWN, 1, 12)
                ##creator.enforce_node_consistency()
                ##assignment = dict()
                ###assignment[across_2_1] = 'INTELLIGENCE'
                ###assignment[down_1_4] = 'FIVE'
                ##var = across_2_1
                ##var = across_4_4
                ###var = across_6_5
                ###var = down_2_1
                ###var = down_1_7
                ###var = down_1_12
                ##creator.print(assignment)
                ##for x_var in creator.domains.keys() - assignment.keys():
                ##    print(x_var, creator.domains[x_var])
                ### Check ...
                ##input(f'Press <Enter> to test {tests[action]} for {var}...')
                ##print()
                ##print(var, creator.order_domain_values(var, assignment))
            elif action == 'U':
                # 'U': 'select_unassigned_variable'
                creator = CrosswordCreator(crossword_0)
                # Prepare First Testcase
                across_0_1 = get_var(crossword_0, cw.Variable.ACROSS, 0, 1)
                across_4_1 = get_var(crossword_0, cw.Variable.ACROSS, 4, 1)
                down_0_1 = get_var(crossword_0, cw.Variable.DOWN, 0, 1)
                down_1_4 = get_var(crossword_0, cw.Variable.DOWN, 1, 4)
                creator.enforce_node_consistency()
                assignment = dict()
                assignment[down_1_4] = 'FIVE'
                creator.print(assignment)
                for x_var in creator.domains.keys() - assignment.keys():
                    print(x_var, creator.domains[x_var])
                print('---')
                for var in creator.domains.keys() - assignment.keys():
                    print(var, creator.get_domain_values(var, assignment),
                          creator.degree(var))
                print('---')
                # Check ...
                input(f'Press <Enter> to test {tests[action]} ...')
                print()
                var = creator.select_unassigned_variable(assignment)
                print(var, creator.get_domain_values(var, assignment))
                # Prepare Second Testcase
                print('=========')
                assignment = dict()
                assignment[across_4_1] = 'NINE'
                creator.print(assignment)
                for x_var in creator.domains.keys() - assignment.keys():
                    print(x_var, creator.domains[x_var])
                print('---')
                for var in creator.domains.keys() - assignment.keys():
                    print(var, creator.get_domain_values(var, assignment),
                          creator.degree(var))
                print('---')
                # Check ...
                input(f'Press <Enter> to test {tests[action]} ...')
                print()
                var = creator.select_unassigned_variable(assignment)
                print(var, creator.get_domain_values(var, assignment))
            elif action == 'B':
                # 'B': 'backtrack'
                while True:
                    # Choose puzzle structure
                    system('cls')
                    print('0: Puzzle Structure 0')
                    print('1: Puzzle Structure 1')
                    print('2: Puzzle Structure 2')
                    print()
                    puzzle = (input(
                        'Choose Puzzle Structure (0-2) (<Enter> to exit): ') +
                              ' ')[0]
                    if puzzle == ' ':
                        break
                    elif puzzle == '0':
                        creator = CrosswordCreator(crossword_0)
                    elif puzzle == '1':
                        creator = CrosswordCreator(crossword_1)
                    elif puzzle == '2':
                        creator = CrosswordCreator(crossword_2)
                    else:
                        input('Illegal Choice! Press <Enter> to continue')
                        continue
                    # Prepare Testcase
                    creator.enforce_node_consistency()
                    assignment = dict()
                    # Show Testcase
                    creator.print(assignment)
                    for var, domain in creator.domains.items():
                        print(var, domain)
                    input(f'Press <Enter> to test {tests[action]} ...')
                    print()
                    start = time.perf_counter()
                    creator.enforce_node_consistency()
                    creator.ac3()
                    assignment = creator.backtrack(assignment)
                    end = time.perf_counter()
                    # Print result
                    if assignment is None:
                        print("No solution.")
                    else:
                        creator.print(assignment)
                    print()
                    print(f'Backtracking took {end - start:.4f} seconds')
                    input('Press <Enter> to continue: ')
        # End the chosen Test
        print()
        input('Press Enter to return to menu:')
        system('cls')
Beispiel #10
0
# -*- coding: utf-8 -*-
"""
Created on Tue Apr 13 21:40:39 2021

@author: yanq6
"""

import crossword

import generate

structure = "data/structure1.txt"
words = "data/words1.txt"

crossword = crossword.Crossword(structure, words)
creator = CrosswordCreator(crossword)
creator.enforce_node_consistency()
#creator.revise(x,y)

creator.enforce_node_consistency()
creator.ac3()

creator.solve()

creator.assignment_complete(assignment)

values = []
for v in assignment:
    if assignment[v] is not None:
        for w in assignment[v]:
            if w in values:  #not distinct