def test_solve_2(self): rows = [[1], [4, 3], [3, 5], [2, 2, 5], [3, 3, 7], [8, 7], [6, 6], [6, 6], [5, 5], [11], [7], [9], [10], [10], [10], [7], [14], [14], [14], [12]] cols = [[3], [3], [2], [3, 3], [5, 4], [1, 6, 3, 4], [10, 9], [3, 15], [2, 14], [11], [11], [3, 11], [16], [11, 4], [6, 4, 4], [8, 4], [8, 3], [5], [4], [2]] expected = np.array([ [O, O, O, O, O, O, X, O, O, O, O, O, O, O, O, O, O, O, O, O], [O, O, O, O, O, X, X, X, X, O, O, O, O, O, O, O, X, X, X, O], [O, O, O, O, O, O, X, X, X, O, O, O, O, O, O, X, X, X, X, X], [X, X, O, O, O, O, X, X, O, O, O, O, O, O, O, X, X, X, X, X], [X, X, X, O, X, X, X, O, O, O, O, O, X, X, X, X, X, X, X, O], [X, X, X, X, X, X, X, X, O, O, O, X, X, X, X, X, X, X, O, O], [O, O, O, X, X, X, X, X, X, O, O, X, X, X, X, X, X, O, O, O], [O, O, O, X, X, X, X, X, X, O, O, X, X, X, X, X, X, O, O, O], [O, O, O, O, X, X, X, X, X, O, O, O, X, X, X, X, X, O, O, O], [O, O, O, O, O, X, X, X, X, X, X, X, X, X, X, X, O, O, O, O], [O, O, O, O, O, O, O, X, X, X, X, X, X, X, O, O, O, O, O, O], [O, O, O, O, O, O, X, X, X, X, X, X, X, X, X, O, O, O, O, O], [O, O, O, O, O, X, X, X, X, X, X, X, X, X, X, O, O, O, O, O], [O, O, O, O, O, X, X, X, X, X, X, X, X, X, X, O, O, O, O, O], [O, O, O, O, O, X, X, X, X, X, X, X, X, X, X, O, O, O, O, O], [O, O, O, O, O, O, X, X, X, X, X, X, X, O, O, O, O, O, O, O], [O, O, O, X, X, X, X, X, X, X, X, X, X, X, X, X, X, O, O, O], [O, O, O, X, X, X, X, X, X, X, X, X, X, X, X, X, X, O, O, O], [O, O, O, X, X, X, X, X, X, X, X, X, X, X, X, X, X, O, O, O], [O, O, O, O, X, X, X, X, X, X, X, X, X, X, X, X, O, O, O, O], ], dtype=int) soln = solve(rows, cols) assert_array_equal(soln, expected)
def test_solve_1(self): rows = [[2, 1, 1, 1, 1, 1, 1], [5, 1, 1, 4], [4, 4], [1, 1], [3], [7], [6], [3], [1, 3], [2, 4], [3, 8], [13], [12], [12], [15], [6, 2, 1], [6, 1, 2, 1], [2, 1, 1, 2, 3, 1, 1], [2, 2, 1, 4, 1, 2, 1], [5, 1, 2, 1, 2, 1, 2]] cols = [[2, 4], [4, 6], [7, 1], [1, 9], [2, 6, 2], [1, 6], [2, 6, 3], [1, 5], [3, 5, 2], [1, 1, 10], [1, 2, 7, 2], [15, 2], [11], [15, 3], [1, 2, 1, 2, 1], [1, 2, 4], [3, 2], [1, 3], [2, 1], [1, 3]] expected = np.array([ [O, O, O, X, X, O, X, O, X, O, O, X, O, X, O, O, X, O, X, O], [O, O, O, O, X, X, X, X, X, O, O, X, O, X, O, O, X, X, X, X], [O, O, O, O, O, O, O, O, X, X, X, X, O, X, X, X, X, O, O, O], [O, O, O, O, O, O, O, O, O, O, O, X, O, X, O, O, O, O, O, O], [O, O, O, O, O, O, O, O, O, O, O, X, X, X, O, O, O, O, O, O], [O, O, O, O, O, O, O, O, O, X, X, X, X, X, X, X, O, O, O, O], [O, O, O, O, O, O, O, O, O, O, X, X, X, X, X, X, O, O, O, O], [O, O, O, O, O, O, O, O, O, O, O, X, X, X, O, O, O, O, O, O], [O, X, O, O, O, O, O, O, O, O, O, X, X, X, O, O, O, O, O, O], [X, X, O, O, O, O, O, O, O, O, X, X, X, X, O, O, O, O, O, O], [X, X, X, O, O, O, X, X, X, X, X, X, X, X, O, O, O, O, O, O], [O, X, X, X, X, X, X, X, X, X, X, X, X, X, O, O, O, O, O, O], [O, O, X, X, X, X, X, X, X, X, X, X, X, X, O, O, O, O, O, O], [O, O, X, X, X, X, X, X, X, X, X, X, X, X, O, O, O, O, O, O], [O, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, O, O, O, O], [O, X, X, X, X, X, X, O, O, X, X, O, O, O, O, X, O, O, O, O], [X, X, X, X, X, X, O, O, O, X, O, O, O, O, X, X, O, X, O, O], [X, X, O, X, O, O, X, O, O, X, X, O, O, X, X, X, O, X, O, X], [X, X, O, X, X, O, X, O, X, X, X, X, O, X, O, O, X, X, O, X], [X, X, X, X, X, O, X, O, X, X, O, X, O, X, X, O, X, O, X, X], ], dtype=int) soln = solve(rows, cols) assert_array_equal(soln, expected)
def web_main(state, rows='', cols='', image=None): if not image: rows = parse_constraint(rows) cols = parse_constraint(cols) else: ocr = ConstraintsDetector(web_main.ocr_model_path) rows, cols = ocr.detect_constraints(image) ocr.save_model() soln = solve(rows, cols) width_px = 500 // soln.shape[1] - 1 height_px = 500 // soln.shape[0] - 1 html = [ '<style type="text/css">', 'table { border-collapse: collapse; }', 'td { border: 1px solid darkgray;', 'width: %dpx; height: %dpx; }' % (width_px, height_px), '.full { background-color: darkred; }', '.empty { background-color: khaki; }', '</style>' '<table>' ] for row in soln: html.append('<tr>') for x in row: if x == FULL: html.append('<td class="full"></td>') elif x == EMPTY: html.append('<td class="empty"></td>') else: html.append('<td></td>') html.append('</tr>') html.append('</table>') return '\n'.join(html)
def cli_main(rows, cols, pre_parsed=False, animate=False): if not pre_parsed: rows = parse_constraint(rows) cols = parse_constraint(cols) if animate: return animate_solution(rows, cols) soln = solve(rows, cols) out = np.full_like(soln, '_', dtype=str) out[soln == EMPTY] = ' ' out[soln == FULL] = 'x' for row in out: print(*row, sep='')
def main(): tests = ["10x10", "15x20"] for test in tests: row_hints, col_hints = parse(os.path.join("test", test + ".txt")) solutions = [grid.copy() for grid in solve(row_hints, col_hints)] fig = plt.figure() ax = plt.gca() x = len(col_hints) y = len(row_hints) ax.set_xticks(np.arange(-.5, x, 5)) ax.set_yticks(np.arange(-.5, y, 5)) ax.set_xticks(np.arange(-.5, x, 1), minor=True) ax.set_yticks(np.arange(-.5, y, 1), minor=True) ax.set_xticklabels([]) ax.set_yticklabels([]) ax.tick_params(axis='both', which='both', length=0) ax.xaxis.tick_top() ax.grid(which='minor', color='k', linestyle='-', linewidth=1.5) ax.grid(which='major', color='k', linestyle='-', linewidth=3) os.makedirs("out", exist_ok=True) os.chdir("out") show(solutions[-1]) plt.savefig(f"solution-{test}.png") anim = animation.FuncAnimation(fig, show, frames=solutions) anim.save( f"solution-{test}.gif", progress_callback=lambda i, n: print(f'{test} gif frame {i}/{n}')) anim.save( f"solution-{test}.html", "html", progress_callback=lambda i, n: print(f'{test} html frame {i}/{n}')) os.chdir("..")
def _do_simple_solve(rows, cols, mat=None): return pc.solve(rows, cols, mat)
def test_mat_shape(): rows = [[], []] cols = [[], [], []] mat = np.zeros((3, 3)) with pytest.raises(RuntimeError): solver = pc.solve(rows, cols, mat)