Ejemplo n.º 1
0
def generate(bot, update, args):
    '''
    Generate random message starting from words given (/with command)
    '''
    argument = ' '.join(args)
    B = Board(9)
    B.generate_puzzle(1, to_remove=30)
    draw_matrix(B.grid, name='puzzle.png')
    bot.send_photo(chat_id=update.message.chat_id,
                   photo=open('puzzle.png', 'rb'))
Ejemplo n.º 2
0
def test_check_column(state, expected):
    board = Board.create_empty_board([[], [], []], [[], [2], []])

    for i, s in enumerate(state):
        board[i, 1] = s

    assert board.check_column(1) == expected
Ejemplo n.º 3
0
def test_check_line(state, expected):
    board = Board.create_empty_board([[2], [], []], [[], [], []])

    for i, s in enumerate(state):
        board[0, i] = s

    assert board.check_line(0) == expected
Ejemplo n.º 4
0
def test_check_line_complex(state, expected):
    board = Board.create_empty_board([[], [], [2, 1, 2]], [[]] * 10)

    for i, s in enumerate(state):
        board[2, i] = s

    assert board.check_line(2) == expected
Ejemplo n.º 5
0
def solve(bot, update):
    file_id = update.message.photo[-1]
    newFile = bot.getFile(file_id)
    newFile.download('download.jpg')
    bot.sendMessage(chat_id=update.message.chat_id, text="Processing...")
    img = imread('download.jpg', IMREAD_GRAYSCALE)
    json_file = open(args.model + '.json', 'r')
    loaded_model_json = json_file.read()
    json_file.close()
    model = model_from_json(loaded_model_json)
    model.load_weights(args.model + '.h5')
    grid = get_grid(img, model, method='cnn')
    B = Board(9, grid)
    # print(B.grid)
    solution_img(B.solution().T, B.grid.T, 'solution.png')
    bot.send_photo(chat_id=update.message.chat_id,
                   photo=open('solution.png', 'rb'))
Ejemplo n.º 6
0
def test_solve_simple():
    board = Board.create_empty_board([[1], [1], [1]], [[1], [1], [1]])
    board[0,0] = B

    board.solve(depth=5)

    expected = [[B, W, W], [W, B, W], [W, W, B]]


    assert board_to_list(board._board) == expected
Ejemplo n.º 7
0
def save_generated_dataset(folder, number, randfont=True):
    ''' Save <number> of pictures in the given <folder>s orig subfolder and data as data.csv '''
    y = np.zeros((number, 81), int)
    for i in range(number):
        picname = folder + 'orig/grid' + str(i).zfill(4) + '.png'
        B = Board(9)
        grid = B.solution()
        fonts = [
            'arial.ttf', 'arialbd.ttf', 'APHont-Regular_q15c.ttf',
            'APHont-Bold_q15c.ttf', 'Hack.ttf', 'DejaVuSansMono-Bold.ttf',
            'DroidSerif-Regular.ttf', 'OpenSans-Bold.ttf'
        ]
        if randfont:
            font = ImageFont.truetype('fonts/' + choice(fonts), size=45)
        else:
            font = ImageFont.truetype('fonts/APHont-Regular_q15c.ttf', size=45)
        draw_matrix(grid, picname, frame=True, font=font)
        y[i] = grid.reshape(81)
    np.savetxt(folder + 'data.csv', y, delimiter=',', fmt='%d')
Ejemplo n.º 8
0
def test_change_board():
    board = Board.create_empty_board([[], [], []], [[], [], [], []])

    board[1,1] = W
    board[2,2] = B


    for i in range(3):
        for j in range(3):
            if (i,j) not in [(1,1), (2,2)]:
                assert board[i,j] == E


    assert board[1,1] == W
    assert board[2,2] == B
Ejemplo n.º 9
0
def test_case01_empty():
    b = Board([
        [0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0, 0, 0],
    ])
    assert repr(SudokuSolver.solve(b)) == repr([[1, 2, 3, 4, 5, 8, 9, 6, 7],
                                                [4, 5, 8, 6, 7, 9, 1, 2, 3],
                                                [9, 6, 7, 1, 2, 3, 8, 4, 5],
                                                [2, 1, 9, 8, 3, 4, 5, 7, 6],
                                                [3, 8, 4, 5, 6, 7, 2, 1, 9],
                                                [5, 7, 6, 9, 1, 2, 3, 8, 4],
                                                [8, 9, 1, 3, 4, 6, 7, 5, 2],
                                                [6, 3, 2, 7, 8, 5, 4, 9, 1],
                                                [7, 4, 5, 2, 9, 1, 6, 3,
                                                 8]]), "Wrong answer"
Ejemplo n.º 10
0
def test_case01_easy():
    b = Board([
        [1, 0, 6, 0, 0, 2, 3, 0, 0],
        [0, 5, 0, 0, 0, 6, 0, 9, 1],
        [0, 0, 9, 5, 0, 1, 4, 6, 2],
        [0, 3, 7, 9, 0, 5, 0, 0, 0],
        [5, 8, 1, 0, 2, 7, 9, 0, 0],
        [0, 0, 0, 4, 0, 8, 1, 5, 7],
        [0, 0, 0, 2, 6, 0, 5, 4, 0],
        [0, 0, 4, 1, 5, 0, 6, 0, 9],
        [9, 0, 0, 8, 7, 4, 2, 1, 0],
    ])
    assert repr(SudokuSolver.solve(b)) == repr([[1, 4, 6, 7, 9, 2, 3, 8, 5],
                                                [2, 5, 8, 3, 4, 6, 7, 9, 1],
                                                [3, 7, 9, 5, 8, 1, 4, 6, 2],
                                                [4, 3, 7, 9, 1, 5, 8, 2, 6],
                                                [5, 8, 1, 6, 2, 7, 9, 3, 4],
                                                [6, 9, 2, 4, 3, 8, 1, 5, 7],
                                                [7, 1, 3, 2, 6, 9, 5, 4, 8],
                                                [8, 2, 4, 1, 5, 3, 6, 7, 9],
                                                [9, 6, 5, 8, 7, 4, 2, 1,
                                                 3]]), "Wrong answer"
Ejemplo n.º 11
0
def test_case01_hard():
    b = Board([
        [4, 0, 9, 3, 7, 0, 0, 0, 0],
        [1, 0, 0, 4, 2, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 9, 0, 1, 0],
        [5, 0, 0, 0, 0, 6, 0, 7, 0],
        [0, 6, 2, 0, 0, 0, 5, 8, 0],
        [0, 1, 0, 2, 0, 0, 0, 0, 3],
        [0, 2, 0, 8, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 5, 2, 0, 0, 8],
        [0, 0, 0, 0, 9, 7, 6, 0, 5],
    ])
    assert repr(SudokuSolver.solve(b)) == repr([[4, 8, 9, 3, 7, 1, 2, 5, 6],
                                                [1, 5, 6, 4, 2, 8, 9, 3, 7],
                                                [2, 7, 3, 5, 6, 9, 8, 1, 4],
                                                [5, 4, 8, 9, 3, 6, 1, 7, 2],
                                                [3, 6, 2, 7, 1, 4, 5, 8, 9],
                                                [9, 1, 7, 2, 8, 5, 4, 6, 3],
                                                [6, 2, 5, 8, 4, 3, 7, 9, 1],
                                                [7, 9, 1, 6, 5, 2, 3, 4, 8],
                                                [8, 3, 4, 1, 9, 7, 6, 2,
                                                 5]]), "Wrong answer"
Ejemplo n.º 12
0
def test_solve_problem():
    b = [
        [E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E],
        [E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E],
        [E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E],
        [E, E, E, B, B, E, E, E, E, E, E, E, B, B, E, E, E, E, E, E, E, B, E, E, E],
        [E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E],
        [E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E],
        [E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E],
        [E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E],
        [E, E, E, E, E, E, B, B, E, E, B, E, E, E, B, B, E, E, B, E, E, E, E, E, E],
        [E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E],
        [E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E],
        [E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E],
        [E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E],
        [E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E],
        [E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E],
        [E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E],
        [E, E, E, E, E, E, B, E, E, E, E, B, E, E, E, E, B, E, E, E, B, E, E, E, E],
        [E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E],
        [E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E],
        [E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E],
        [E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E],
        [E, E, E, B, B, E, E, E, E, B, B, E, E, E, E, B, E, E, E, E, B, B, E, E, E],
        [E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E],
        [E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E],
        [E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E, E],
    ]

    lines = [
        [7,3,1,1,7],
        [1,1,2,2,1,1],
        [1,3,1,3,1,1,3,1],
        [1,3,1,1,6,1,3,1],
        [1,3,1,5,2,1,3,1],
        [1,1,2,1,1],
        [7,1,1,1,1,1,7],
        [3,3],
        [1,2,3,1,1,3,1,1,2],
        [1,1,3,2,1,1],
        [4,1,4,2,1,2],
        [1,1,1,1,1,4,1,3],
        [2,1,1,1,2,5],
        [3,2,2,6,3,1],
        [1,9,1,1,2,1],
        [2,1,2,2,3,1],
        [3,1,1,1,1,5,1],
        [1,2,2,5],
        [7,1,2,1,1,1,3],
        [1,1,2,1,2,2,1],
        [1,3,1,4,5,1],
        [1,3,1,3,10,2],
        [1,3,1,1,6,6],
        [1,1,2,1,1,2],
        [7,2,1,2,5],
    ]

    columns = [
        [7,2,1,1,7],
        [1,1,2,2,1,1],
        [1,3,1,3,1,3,1,3,1],
        [1,3,1,1,5,1,3,1],
        [1,3,1,1,4,1,3,1],
        [1,1,1,2,1,1],
        [7,1,1,1,1,1,7],
        [1,1,3],
        [2,1,2,1,8,2,1],
        [2,2,1,2,1,1,1,2],
        [1,7,3,2,1],
        [1,2,3,1,1,1,1,1],
        [4,1,1,2,6],
        [3,3,1,1,1,3,1],
        [1,2,5,2,2],
        [2,2,1,1,1,1,1,2,1],
        [1,3,3,2,1,8,1],
        [6,2,1],
        [7,1,4,1,1,3],
        [1,1,1,1,4],
        [1,3,1,3,7,1],
        [1,3,1,1,1,2,1,1,4],
        [1,3,1,4,3,3],
        [1,1,2,2,2,6,1],
        [7,1,3,2,1,1],
    ]

    board = Board.create_from_board(b, lines, columns)


    board.solve()

    print board._board
Ejemplo n.º 13
0
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
import sys
import argparse

parser = argparse.ArgumentParser(
    formatter_class=argparse.RawDescriptionHelpFormatter)
parser.add_argument('task', help='Solve or generate')
parser.add_argument('-i', help='Image to solve')
parser.add_argument('--method', help='Which ML algorithm to use - cnn or knn')
parser.add_argument(
    '--model', help='Location of the model.json and model.h5 files for CNN')
args = parser.parse_args()

if args.task == 'generate':
    B = Board(9)
    B.generate_puzzle(1, to_remove=30)
    draw_matrix(B.grid, name='puzzle.png')
    # solution_img(B.solution(), B.grid, 'solution.png')
    sys.exit()
elif args.task == 'solve':
    img = imread(args.i, IMREAD_GRAYSCALE)
    if args.method == 'knn':
        scaler = StandardScaler()
        model = KNeighborsClassifier(n_neighbors=3)
        x_train, y_train = generate_dataset(250)
        x_train = x_train.reshape(250, 784)
        scaler.fit(x_train)
        model.fit(x_train, y_train)
    elif args.method == 'cnn':
        json_file = open(args.model + '.json', 'r')
Ejemplo n.º 14
0
def get_args():
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "--input",
        "-i",
        help=
        "set input path in txt, must be rectangular n x m board, first line is 'n m' separated by space, then followed by n lines: fill the number separated by space or 0 if empty cell (must have exactly 1 empty cell)"
    )
    return parser.parse_args()


def get_config():
    args = get_args()
    filename = args.input if args.input else input("Input filename: ")
    with open(filename, "r") as f:
        config = f.readlines()
    return config


if __name__ == "__main__":
    config = get_config()
    B = Board(config)
    print("==== Initial matrix ====")
    B.nodes[0].print()
    print()

    if B.solvable(output=True):
        B.solve()
    else:
        print("Puzzle is unsolvable!")
Ejemplo n.º 15
0
    [4,1,1,2,6],
    [3,3,1,1,1,3,1],
    [1,2,5,2,2],
    [2,2,1,1,1,1,1,2,1],
    [1,3,3,2,1,8,1],
    [6,2,1],
    [7,1,4,1,1,3],
    [1,1,1,1,4],
    [1,3,1,3,7,1],
    [1,3,1,1,1,2,1,1,4],
    [1,3,1,4,3,3],
    [1,1,2,2,2,6,1],
    [7,1,3,2,1,1],
]

board = Board.create_from_board(b, lines, columns)


#board.solve()

#print board._board

result_board = [
 [ 0,  0,  0,  0,  0,  0,  0,  1,  0,  0,  0,  1,  1,  1,  0,  1,  0,  1,  0,  0,  0,  0,  0,  0,  0],
 [ 0,  1,  1,  1,  1,  1,  0,  1,  0,  0,  1,  0,  0,  1,  1,  1,  1,  1,  0,  1,  1,  1,  1,  1,  0],
 [ 0,  1,  0,  0,  0,  1,  0,  1,  1,  1,  1,  1,  0,  0,  0,  1,  0,  1,  0,  1,  0,  0,  0,  1,  0],
 [ 0,  1,  0,  0,  0,  1,  0,  1,  0,  1,  1,  0,  0,  0,  0,  0,  0,  1,  0,  1,  0,  0,  0,  1,  0],
 [ 0,  1,  0,  0,  0,  1,  0,  1,  1,  0,  0,  0,  0,  0,  1,  0,  0,  1,  0,  1,  0,  0,  0,  1,  0],
 [ 0,  1,  1,  1,  1,  1,  0,  1,  1,  0,  0,  1,  1,  1,  1,  1,  1,  1,  0,  1,  1,  1,  1,  1,  0],
 [ 0,  0,  0,  0,  0,  0,  0,  1,  0,  1,  0,  1,  0,  1,  0,  1,  0,  1,  0,  0,  0,  0,  0,  0,  0],
 [ 1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  1,  1,  1,  0,  0,  0,  1,  1,  1,  1,  1,  1,  1,  1],
Ejemplo n.º 16
0
    return initial_blocks


if __name__ == '__main__':

    # initial_blocks = random_initial_blocks()
    # initial_blocks = [
    # [8,  1,  3],
    # [4,  0,  2],
    # [7,  6,  5]
    # ]
    initial_blocks = [[0, 1, 3], [4, 2, 5], [7, 8, 6]]

    DIRECTIONS = ['UP', 'DOWN', 'LEFT', 'RIGHT']

    initial = Board(initial_blocks)
    initial.print_elements("Initial")

    current_move = initial

    while not current_move.is_goal():
        possible_moves: List[Board] = []
        for direction in DIRECTIONS:
            if current_move.is_move_possible(direction):
                new = current_move.go(direction)
                possible_moves.append(new)

            else:
                print(f'Moving in {direction} not possible.')

        current_move = min(possible_moves, key=lambda x: x.manhattan())
Ejemplo n.º 17
0
            board[i][j] = info['shape'][0]
            if info['end_points']:
                board[i][j] = board[i][j].upper()
        else:
            board[i][j] = str(info['visits'])
    return board, (x_levels[0], x_interval), (y_levels[0], y_interval)


if __name__ == '__main__':
    import subprocess
    import pyscreenshot as ImageGrab

    from solver import Board

    print("Please click on the window of the game LYNE.")
    res = subprocess.getoutput('xwininfo')
    num = [int(s) for s in res.split() if s.isdigit()]

    while True:
        input("Press enter for starting.")
        img = ImageGrab.grab(bbox=(num[0], num[1], num[0] + num[4],
                                   num[1] + num[5]))
        img = cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)
        board = get_board(img)[0]
        from IPython import embed
        embed()
        board = Board(board)
        paths = board.solve()
        for path in paths:
            board._print_path(path)