multi-puzzle-solver 0.9.4__tar.gz → 0.9.6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {multi_puzzle_solver-0.9.4/src/multi_puzzle_solver.egg-info → multi_puzzle_solver-0.9.6}/PKG-INFO +159 -1
- multi_puzzle_solver-0.9.4/PKG-INFO → multi_puzzle_solver-0.9.6/README.md +2563 -2431
- multi_puzzle_solver-0.9.4/README.md → multi_puzzle_solver-0.9.6/src/multi_puzzle_solver.egg-info/PKG-INFO +2589 -2405
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/src/multi_puzzle_solver.egg-info/SOURCES.txt +4 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/src/puzzle_solver/__init__.py +3 -1
- multi_puzzle_solver-0.9.6/src/puzzle_solver/puzzles/battleships/battleships.py +153 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/src/puzzle_solver/puzzles/bridges/bridges.py +1 -3
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/src/puzzle_solver/puzzles/chess_range/chess_melee.py +0 -1
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/src/puzzle_solver/puzzles/chess_range/chess_range.py +0 -1
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/src/puzzle_solver/puzzles/dominosa/dominosa.py +2 -2
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/src/puzzle_solver/puzzles/guess/guess.py +4 -3
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/src/puzzle_solver/puzzles/inertia/inertia.py +0 -1
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/src/puzzle_solver/puzzles/inertia/tsp.py +3 -2
- multi_puzzle_solver-0.9.6/src/puzzle_solver/puzzles/kakurasu/kakurasu.py +46 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/src/puzzle_solver/puzzles/signpost/signpost.py +1 -3
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/src/puzzle_solver/puzzles/stitches/parse_map/parse_map.py +2 -1
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/src/puzzle_solver/puzzles/stitches/stitches.py +1 -3
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/src/puzzle_solver/puzzles/tracks/tracks.py +1 -1
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/src/puzzle_solver/puzzles/undead/undead.py +1 -1
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/src/puzzle_solver/utils/visualizer.py +7 -0
- multi_puzzle_solver-0.9.6/tests/test_battleships.py +64 -0
- multi_puzzle_solver-0.9.6/tests/test_kakurasu.py +58 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/tests/test_stitches.py +49 -1
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/pyproject.toml +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/setup.cfg +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/src/multi_puzzle_solver.egg-info/dependency_links.txt +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/src/multi_puzzle_solver.egg-info/requires.txt +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/src/multi_puzzle_solver.egg-info/top_level.txt +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/src/puzzle_solver/core/utils.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/src/puzzle_solver/core/utils_ortools.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/src/puzzle_solver/puzzles/aquarium/aquarium.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/src/puzzle_solver/puzzles/chess_range/chess_solo.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/src/puzzle_solver/puzzles/filling/filling.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/src/puzzle_solver/puzzles/inertia/parse_map/parse_map.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/src/puzzle_solver/puzzles/keen/keen.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/src/puzzle_solver/puzzles/light_up/light_up.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/src/puzzle_solver/puzzles/magnets/magnets.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/src/puzzle_solver/puzzles/map/map.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/src/puzzle_solver/puzzles/minesweeper/minesweeper.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/src/puzzle_solver/puzzles/mosaic/mosaic.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/src/puzzle_solver/puzzles/nonograms/nonograms.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/src/puzzle_solver/puzzles/pearl/pearl.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/src/puzzle_solver/puzzles/range/range.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/src/puzzle_solver/puzzles/singles/singles.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/src/puzzle_solver/puzzles/sudoku/sudoku.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/src/puzzle_solver/puzzles/tents/tents.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/src/puzzle_solver/puzzles/thermometers/thermometers.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/src/puzzle_solver/puzzles/towers/towers.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/src/puzzle_solver/puzzles/unruly/unruly.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/tests/test_aquarium.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/tests/test_bridges.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/tests/test_chess_melee.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/tests/test_chess_range.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/tests/test_chess_solo.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/tests/test_dominosa.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/tests/test_filling.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/tests/test_guess.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/tests/test_inertia.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/tests/test_keen.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/tests/test_light_up.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/tests/test_magnets.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/tests/test_map.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/tests/test_minesweeper.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/tests/test_mosaic.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/tests/test_nonograms.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/tests/test_pearl.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/tests/test_range.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/tests/test_signpost.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/tests/test_singles.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/tests/test_sudoku.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/tests/test_tents.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/tests/test_thermometers.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/tests/test_towers.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/tests/test_tracks.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/tests/test_undead.py +0 -0
- {multi_puzzle_solver-0.9.4 → multi_puzzle_solver-0.9.6}/tests/test_unruly.py +0 -0
{multi_puzzle_solver-0.9.4/src/multi_puzzle_solver.egg-info → multi_puzzle_solver-0.9.6}/PKG-INFO
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: multi-puzzle-solver
|
3
|
-
Version: 0.9.
|
3
|
+
Version: 0.9.6
|
4
4
|
Summary: Efficient solvers for numerous popular and esoteric logic puzzles using CP-SAT
|
5
5
|
Author: Ar-Kareem
|
6
6
|
Project-URL: Homepage, https://github.com/Ar-Kareem/puzzle_solver
|
@@ -237,6 +237,16 @@ These are all the puzzles that are implemented in this repo. <br> Click on any o
|
|
237
237
|
<img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/stitches_solved.png" alt="Stitches" width="140">
|
238
238
|
</a>
|
239
239
|
</td>
|
240
|
+
<td align="center">
|
241
|
+
<a href="#battleships-puzzle-type-29"><b>Battleships</b><br><br>
|
242
|
+
<img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/battleships_solved.png" alt="Battleships" width="140">
|
243
|
+
</a>
|
244
|
+
</td>
|
245
|
+
<td align="center">
|
246
|
+
<a href="#kakurasu-puzzle-type-30"><b>Kakurasu</b><br><br>
|
247
|
+
<img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/kakurasu_solved.png" alt="Kakurasu" width="140">
|
248
|
+
</a>
|
249
|
+
</td>
|
240
250
|
</tr>
|
241
251
|
</table>
|
242
252
|
|
@@ -280,6 +290,8 @@ These are all the puzzles that are implemented in this repo. <br> Click on any o
|
|
280
290
|
- [Thermometers (Puzzle Type #26)](#thermometers-puzzle-type-26)
|
281
291
|
- [Aquarium (Puzzle Type #27)](#aquarium-puzzle-type-27)
|
282
292
|
- [Stitches (Puzzle Type #28)](#stitches-puzzle-type-28)
|
293
|
+
- [Battleships (Puzzle Type #29)](#battleships-puzzle-type-29)
|
294
|
+
- [Kakurasu (Puzzle Type #30)](#kakurasu-puzzle-type-30)
|
283
295
|
- [Why SAT / CP-SAT?](#why-sat--cp-sat)
|
284
296
|
- [Testing](#testing)
|
285
297
|
- [Contributing](#contributing)
|
@@ -2320,6 +2332,9 @@ side = np.array([0, 10, 6, 4, 4, 1, 5, 8, 2, 6, 5, 11, 4, 3, 7])
|
|
2320
2332
|
binst = solver.Board(board=board, top=top, side=side)
|
2321
2333
|
solutions = binst.solve_and_print()
|
2322
2334
|
```
|
2335
|
+
|
2336
|
+
Note: `solver.Board` accepts an optional `connection_count=N` parameter to specify the (÷N) stitches puzzle (by default, 1 stitch).
|
2337
|
+
|
2323
2338
|
**Script Output**
|
2324
2339
|
|
2325
2340
|
```python
|
@@ -2350,6 +2365,147 @@ Time taken: 0.01 seconds
|
|
2350
2365
|
|
2351
2366
|
---
|
2352
2367
|
|
2368
|
+
## Battleships (Puzzle Type #29)
|
2369
|
+
|
2370
|
+
* [**Play online**](https://www.puzzle-battleships.com/)
|
2371
|
+
|
2372
|
+
* [**Solver Code**][29]
|
2373
|
+
|
2374
|
+
<details>
|
2375
|
+
<summary><strong>Rules</strong></summary>
|
2376
|
+
|
2377
|
+
- You have to find the location of the battleships hidden in the grid. Some battleships may be partially revealed.
|
2378
|
+
- A battleship is a straight line of consecutive black cells.
|
2379
|
+
- The number of the battleships from each size is shown in the legend.
|
2380
|
+
- 2 battleships cannot touch each other (even diagonally)
|
2381
|
+
- The numbers outside the grid show the number of cells occupied by battleships on that row/column.
|
2382
|
+
|
2383
|
+
</details>
|
2384
|
+
|
2385
|
+
**Unsolved puzzle**
|
2386
|
+
|
2387
|
+
<img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/battleships_unsolved.png" alt="Battleships unsolved" width="500">
|
2388
|
+
|
2389
|
+
Code to utilize this package and solve the puzzle:
|
2390
|
+
|
2391
|
+
```python
|
2392
|
+
from puzzle_solver import battleships_solver as solver
|
2393
|
+
board = np.array([
|
2394
|
+
[' ', ' ', ' ', ' ', ' ', 'S', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
|
2395
|
+
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'S', ' ', ' ', ' ', ' '],
|
2396
|
+
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'O', ' ', ' '],
|
2397
|
+
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
|
2398
|
+
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
|
2399
|
+
['W', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
|
2400
|
+
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
|
2401
|
+
[' ', ' ', ' ', ' ', ' ', ' ', 'O', ' ', ' ', ' ', ' ', 'W', ' ', ' ', 'R'],
|
2402
|
+
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
|
2403
|
+
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
|
2404
|
+
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
|
2405
|
+
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'U', ' ', ' ', ' ', ' '],
|
2406
|
+
[' ', ' ', ' ', ' ', ' ', ' ', ' ', 'L', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
|
2407
|
+
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
|
2408
|
+
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'S'],
|
2409
|
+
])
|
2410
|
+
top = np.array([2, 2, 4, 2, 1, 2, 1, 2, 4, 1, 3, 2, 5, 2, 2])
|
2411
|
+
side = np.array([1, 2, 1, 1, 0, 7, 0, 9, 2, 2, 5, 1, 3, 0, 1])
|
2412
|
+
ship_counts = {1: 5, 2: 4, 3: 3, 4: 2, 5: 1}
|
2413
|
+
binst = solver.Board(board=board, top=top, side=side, ship_counts=ship_counts)
|
2414
|
+
solutions = binst.solve_and_print()
|
2415
|
+
```
|
2416
|
+
|
2417
|
+
|
2418
|
+
**Script Output**
|
2419
|
+
|
2420
|
+
```python
|
2421
|
+
Solution found
|
2422
|
+
[[' ' ' ' ' ' ' ' ' ' 'S' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ']
|
2423
|
+
[' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' 'S' ' ' 'S' ' ' ' ']
|
2424
|
+
[' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' 'S' ' ' ' ']
|
2425
|
+
[' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' 'S' ' ' ' ']
|
2426
|
+
[' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ']
|
2427
|
+
[' ' 'S' 'S' 'S' 'S' ' ' ' ' ' ' ' ' ' ' ' ' 'S' 'S' 'S' ' ']
|
2428
|
+
[' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ']
|
2429
|
+
[' ' ' ' 'S' ' ' ' ' 'S' 'S' 'S' 'S' 'S' ' ' ' ' 'S' 'S' 'S']
|
2430
|
+
['S' ' ' 'S' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ']
|
2431
|
+
[' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' 'S' ' ' ' ' 'S' ' ' ' ' ' ']
|
2432
|
+
['S' 'S' 'S' 'S' ' ' ' ' ' ' ' ' 'S' ' ' ' ' ' ' ' ' ' ' ' ']
|
2433
|
+
[' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' 'S' ' ' ' ' ' ' ' ']
|
2434
|
+
[' ' ' ' ' ' ' ' ' ' ' ' ' ' 'S' 'S' ' ' 'S' ' ' ' ' ' ' ' ']
|
2435
|
+
[' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ']
|
2436
|
+
[' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' 'S']]
|
2437
|
+
Solutions found: 1
|
2438
|
+
status: OPTIMAL
|
2439
|
+
Time taken: 0.12 seconds
|
2440
|
+
```
|
2441
|
+
|
2442
|
+
**Solved puzzle**
|
2443
|
+
|
2444
|
+
<img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/battleships_solved.png" alt="Battleships solved" width="500">
|
2445
|
+
|
2446
|
+
---
|
2447
|
+
|
2448
|
+
## Kakurasu (Puzzle Type #30)
|
2449
|
+
|
2450
|
+
* [**Play online**](https://www.puzzle-kakurasu.com/)
|
2451
|
+
|
2452
|
+
* [**Solver Code**][30]
|
2453
|
+
|
2454
|
+
<details>
|
2455
|
+
<summary><strong>Rules</strong></summary>
|
2456
|
+
|
2457
|
+
The goal is to make some of the cells black in such a way that:
|
2458
|
+
|
2459
|
+
1. The black cells on each row sum up to the number on the right.
|
2460
|
+
|
2461
|
+
2. The black cells on each column sum up to the number on the bottom.
|
2462
|
+
|
2463
|
+
3. If a black cell is first on its row/column its value is 1. If it is second its value is 2 etc.
|
2464
|
+
|
2465
|
+
</details>
|
2466
|
+
|
2467
|
+
**Unsolved puzzle**
|
2468
|
+
|
2469
|
+
<img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/kakurasu_unsolved.png" alt="Kakurasu unsolved" width="500">
|
2470
|
+
|
2471
|
+
Code to utilize this package and solve the puzzle:
|
2472
|
+
|
2473
|
+
```python
|
2474
|
+
from puzzle_solver import kakurasu_solver as solver
|
2475
|
+
side = np.array([27, 6, 1, 12, 37, 37, 11, 4, 29, 23, 66, 55])
|
2476
|
+
bottom = np.array([22, 1, 25, 36, 10, 22, 25, 35, 32, 28, 45, 45])
|
2477
|
+
binst = solver.Board(side=side, bottom=bottom)
|
2478
|
+
solutions = binst.solve_and_print()
|
2479
|
+
```
|
2480
|
+
|
2481
|
+
|
2482
|
+
**Script Output**
|
2483
|
+
|
2484
|
+
```python
|
2485
|
+
Solution found
|
2486
|
+
[['X' 'X' ' ' 'X' ' ' ' ' ' ' 'X' ' ' ' ' ' ' 'X']
|
2487
|
+
[' ' ' ' ' ' ' ' ' ' 'X' ' ' ' ' ' ' ' ' ' ' ' ']
|
2488
|
+
['X' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ']
|
2489
|
+
[' ' ' ' ' ' ' ' 'X' ' ' 'X' ' ' ' ' ' ' ' ' ' ']
|
2490
|
+
[' ' ' ' 'X' 'X' ' ' ' ' ' ' 'X' ' ' 'X' ' ' 'X']
|
2491
|
+
['X' ' ' ' ' ' ' 'X' ' ' ' ' 'X' ' ' ' ' 'X' 'X']
|
2492
|
+
[' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' 'X' ' ']
|
2493
|
+
[' ' ' ' ' ' 'X' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ']
|
2494
|
+
[' ' ' ' 'X' ' ' ' ' 'X' ' ' ' ' 'X' ' ' 'X' ' ']
|
2495
|
+
[' ' ' ' ' ' 'X' ' ' ' ' 'X' ' ' ' ' ' ' ' ' 'X']
|
2496
|
+
[' ' ' ' 'X' ' ' ' ' 'X' 'X' 'X' 'X' 'X' 'X' 'X']
|
2497
|
+
['X' ' ' ' ' 'X' ' ' ' ' ' ' 'X' 'X' 'X' 'X' 'X']]
|
2498
|
+
Solutions found: 1
|
2499
|
+
status: OPTIMAL
|
2500
|
+
Time taken: 0.00 seconds
|
2501
|
+
```
|
2502
|
+
|
2503
|
+
**Solved puzzle**
|
2504
|
+
|
2505
|
+
<img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/kakurasu_solved.png" alt="Kakurasu solved" width="500">
|
2506
|
+
|
2507
|
+
---
|
2508
|
+
|
2353
2509
|
---
|
2354
2510
|
|
2355
2511
|
## Why SAT / CP-SAT?
|
@@ -2429,3 +2585,5 @@ Issues and PRs welcome!
|
|
2429
2585
|
[26]: https://github.com/Ar-Kareem/puzzle_solver/tree/master/src/puzzle_solver/puzzles/thermometers "puzzle_solver/src/puzzle_solver/puzzles/thermometers at master · Ar-Kareem/puzzle_solver · GitHub"
|
2430
2586
|
[27]: https://github.com/Ar-Kareem/puzzle_solver/tree/master/src/puzzle_solver/puzzles/aquarium "puzzle_solver/src/puzzle_solver/puzzles/aquarium at master · Ar-Kareem/puzzle_solver · GitHub"
|
2431
2587
|
[28]: https://github.com/Ar-Kareem/puzzle_solver/tree/master/src/puzzle_solver/puzzles/stitches "puzzle_solver/src/puzzle_solver/puzzles/stitches at master · Ar-Kareem/puzzle_solver · GitHub"
|
2588
|
+
[29]: https://github.com/Ar-Kareem/puzzle_solver/tree/master/src/puzzle_solver/puzzles/battleships "puzzle_solver/src/puzzle_solver/puzzles/battleships at master · Ar-Kareem/puzzle_solver · GitHub"
|
2589
|
+
[30]: https://github.com/Ar-Kareem/puzzle_solver/tree/master/src/puzzle_solver/puzzles/kakurasu "puzzle_solver/src/puzzle_solver/puzzles/kakurasu at master · Ar-Kareem/puzzle_solver · GitHub"
|