multi-puzzle-solver 0.9.5__tar.gz → 0.9.7__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.
Files changed (79) hide show
  1. {multi_puzzle_solver-0.9.5/src/multi_puzzle_solver.egg-info → multi_puzzle_solver-0.9.7}/PKG-INFO +176 -1
  2. multi_puzzle_solver-0.9.5/PKG-INFO → multi_puzzle_solver-0.9.7/README.md +2670 -2521
  3. multi_puzzle_solver-0.9.5/README.md → multi_puzzle_solver-0.9.7/src/multi_puzzle_solver.egg-info/PKG-INFO +2696 -2495
  4. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/src/multi_puzzle_solver.egg-info/SOURCES.txt +4 -0
  5. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/src/puzzle_solver/__init__.py +3 -1
  6. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/src/puzzle_solver/puzzles/battleships/battleships.py +1 -1
  7. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/src/puzzle_solver/puzzles/bridges/bridges.py +1 -3
  8. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/src/puzzle_solver/puzzles/chess_range/chess_melee.py +0 -1
  9. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/src/puzzle_solver/puzzles/chess_range/chess_range.py +0 -1
  10. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/src/puzzle_solver/puzzles/dominosa/dominosa.py +2 -2
  11. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/src/puzzle_solver/puzzles/guess/guess.py +4 -3
  12. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/src/puzzle_solver/puzzles/inertia/inertia.py +0 -1
  13. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/src/puzzle_solver/puzzles/inertia/tsp.py +3 -2
  14. multi_puzzle_solver-0.9.7/src/puzzle_solver/puzzles/kakurasu/kakurasu.py +46 -0
  15. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/src/puzzle_solver/puzzles/minesweeper/minesweeper.py +19 -6
  16. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/src/puzzle_solver/puzzles/signpost/signpost.py +1 -3
  17. multi_puzzle_solver-0.9.7/src/puzzle_solver/puzzles/star_battle/star_battle.py +63 -0
  18. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/src/puzzle_solver/puzzles/stitches/parse_map/parse_map.py +2 -1
  19. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/src/puzzle_solver/puzzles/stitches/stitches.py +1 -3
  20. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/src/puzzle_solver/puzzles/tracks/tracks.py +1 -1
  21. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/src/puzzle_solver/puzzles/undead/undead.py +1 -1
  22. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/tests/test_battleships.py +0 -1
  23. multi_puzzle_solver-0.9.7/tests/test_kakurasu.py +58 -0
  24. multi_puzzle_solver-0.9.7/tests/test_minesweeper.py +77 -0
  25. multi_puzzle_solver-0.9.7/tests/test_star_battle.py +99 -0
  26. multi_puzzle_solver-0.9.5/tests/test_minesweeper.py +0 -37
  27. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/pyproject.toml +0 -0
  28. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/setup.cfg +0 -0
  29. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/src/multi_puzzle_solver.egg-info/dependency_links.txt +0 -0
  30. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/src/multi_puzzle_solver.egg-info/requires.txt +0 -0
  31. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/src/multi_puzzle_solver.egg-info/top_level.txt +0 -0
  32. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/src/puzzle_solver/core/utils.py +0 -0
  33. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/src/puzzle_solver/core/utils_ortools.py +0 -0
  34. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/src/puzzle_solver/puzzles/aquarium/aquarium.py +0 -0
  35. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/src/puzzle_solver/puzzles/chess_range/chess_solo.py +0 -0
  36. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/src/puzzle_solver/puzzles/filling/filling.py +0 -0
  37. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/src/puzzle_solver/puzzles/inertia/parse_map/parse_map.py +0 -0
  38. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/src/puzzle_solver/puzzles/keen/keen.py +0 -0
  39. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/src/puzzle_solver/puzzles/light_up/light_up.py +0 -0
  40. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/src/puzzle_solver/puzzles/magnets/magnets.py +0 -0
  41. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/src/puzzle_solver/puzzles/map/map.py +0 -0
  42. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/src/puzzle_solver/puzzles/mosaic/mosaic.py +0 -0
  43. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/src/puzzle_solver/puzzles/nonograms/nonograms.py +0 -0
  44. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/src/puzzle_solver/puzzles/pearl/pearl.py +0 -0
  45. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/src/puzzle_solver/puzzles/range/range.py +0 -0
  46. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/src/puzzle_solver/puzzles/singles/singles.py +0 -0
  47. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/src/puzzle_solver/puzzles/sudoku/sudoku.py +0 -0
  48. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/src/puzzle_solver/puzzles/tents/tents.py +0 -0
  49. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/src/puzzle_solver/puzzles/thermometers/thermometers.py +0 -0
  50. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/src/puzzle_solver/puzzles/towers/towers.py +0 -0
  51. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/src/puzzle_solver/puzzles/unruly/unruly.py +0 -0
  52. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/src/puzzle_solver/utils/visualizer.py +0 -0
  53. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/tests/test_aquarium.py +0 -0
  54. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/tests/test_bridges.py +0 -0
  55. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/tests/test_chess_melee.py +0 -0
  56. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/tests/test_chess_range.py +0 -0
  57. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/tests/test_chess_solo.py +0 -0
  58. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/tests/test_dominosa.py +0 -0
  59. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/tests/test_filling.py +0 -0
  60. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/tests/test_guess.py +0 -0
  61. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/tests/test_inertia.py +0 -0
  62. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/tests/test_keen.py +0 -0
  63. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/tests/test_light_up.py +0 -0
  64. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/tests/test_magnets.py +0 -0
  65. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/tests/test_map.py +0 -0
  66. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/tests/test_mosaic.py +0 -0
  67. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/tests/test_nonograms.py +0 -0
  68. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/tests/test_pearl.py +0 -0
  69. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/tests/test_range.py +0 -0
  70. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/tests/test_signpost.py +0 -0
  71. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/tests/test_singles.py +0 -0
  72. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/tests/test_stitches.py +0 -0
  73. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/tests/test_sudoku.py +0 -0
  74. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/tests/test_tents.py +0 -0
  75. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/tests/test_thermometers.py +0 -0
  76. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/tests/test_towers.py +0 -0
  77. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/tests/test_tracks.py +0 -0
  78. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/tests/test_undead.py +0 -0
  79. {multi_puzzle_solver-0.9.5 → multi_puzzle_solver-0.9.7}/tests/test_unruly.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: multi-puzzle-solver
3
- Version: 0.9.5
3
+ Version: 0.9.7
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
@@ -242,6 +242,18 @@ These are all the puzzles that are implemented in this repo. <br> Click on any o
242
242
  <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/battleships_solved.png" alt="Battleships" width="140">
243
243
  </a>
244
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>
250
+ </tr>
251
+ <tr>
252
+ <td align="center">
253
+ <a href="#star-battle-puzzle-type-31"><b>Star Battle</b><br><br>
254
+ <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/star_battle_unsolved.png" alt="Star Battle" width="140">
255
+ </a>
256
+ </td>
245
257
  </tr>
246
258
  </table>
247
259
 
@@ -286,6 +298,8 @@ These are all the puzzles that are implemented in this repo. <br> Click on any o
286
298
  - [Aquarium (Puzzle Type #27)](#aquarium-puzzle-type-27)
287
299
  - [Stitches (Puzzle Type #28)](#stitches-puzzle-type-28)
288
300
  - [Battleships (Puzzle Type #29)](#battleships-puzzle-type-29)
301
+ - [Kakurasu (Puzzle Type #30)](#kakurasu-puzzle-type-30)
302
+ - [Star Battle (Puzzle Type #31)](#star-battle-puzzle-type-31)
289
303
  - [Why SAT / CP-SAT?](#why-sat--cp-sat)
290
304
  - [Testing](#testing)
291
305
  - [Contributing](#contributing)
@@ -2439,6 +2453,165 @@ Time taken: 0.12 seconds
2439
2453
 
2440
2454
  ---
2441
2455
 
2456
+ ## Kakurasu (Puzzle Type #30)
2457
+
2458
+ * [**Play online**](https://www.puzzle-kakurasu.com/)
2459
+
2460
+ * [**Solver Code**][30]
2461
+
2462
+ <details>
2463
+ <summary><strong>Rules</strong></summary>
2464
+
2465
+ The goal is to make some of the cells black in such a way that:
2466
+
2467
+ 1. The black cells on each row sum up to the number on the right.
2468
+
2469
+ 2. The black cells on each column sum up to the number on the bottom.
2470
+
2471
+ 3. If a black cell is first on its row/column its value is 1. If it is second its value is 2 etc.
2472
+
2473
+ </details>
2474
+
2475
+ **Unsolved puzzle**
2476
+
2477
+ <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/kakurasu_unsolved.png" alt="Kakurasu unsolved" width="500">
2478
+
2479
+ Code to utilize this package and solve the puzzle:
2480
+
2481
+ ```python
2482
+ from puzzle_solver import kakurasu_solver as solver
2483
+ side = np.array([27, 6, 1, 12, 37, 37, 11, 4, 29, 23, 66, 55])
2484
+ bottom = np.array([22, 1, 25, 36, 10, 22, 25, 35, 32, 28, 45, 45])
2485
+ binst = solver.Board(side=side, bottom=bottom)
2486
+ solutions = binst.solve_and_print()
2487
+ ```
2488
+
2489
+
2490
+ **Script Output**
2491
+
2492
+ ```python
2493
+ Solution found
2494
+ [['X' 'X' ' ' 'X' ' ' ' ' ' ' 'X' ' ' ' ' ' ' 'X']
2495
+ [' ' ' ' ' ' ' ' ' ' 'X' ' ' ' ' ' ' ' ' ' ' ' ']
2496
+ ['X' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ']
2497
+ [' ' ' ' ' ' ' ' 'X' ' ' 'X' ' ' ' ' ' ' ' ' ' ']
2498
+ [' ' ' ' 'X' 'X' ' ' ' ' ' ' 'X' ' ' 'X' ' ' 'X']
2499
+ ['X' ' ' ' ' ' ' 'X' ' ' ' ' 'X' ' ' ' ' 'X' 'X']
2500
+ [' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' 'X' ' ']
2501
+ [' ' ' ' ' ' 'X' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ']
2502
+ [' ' ' ' 'X' ' ' ' ' 'X' ' ' ' ' 'X' ' ' 'X' ' ']
2503
+ [' ' ' ' ' ' 'X' ' ' ' ' 'X' ' ' ' ' ' ' ' ' 'X']
2504
+ [' ' ' ' 'X' ' ' ' ' 'X' 'X' 'X' 'X' 'X' 'X' 'X']
2505
+ ['X' ' ' ' ' 'X' ' ' ' ' ' ' 'X' 'X' 'X' 'X' 'X']]
2506
+ Solutions found: 1
2507
+ status: OPTIMAL
2508
+ Time taken: 0.00 seconds
2509
+ ```
2510
+
2511
+ **Solved puzzle**
2512
+
2513
+ <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/kakurasu_solved.png" alt="Kakurasu solved" width="500">
2514
+
2515
+ ---
2516
+
2517
+ ## Star Battle (Puzzle Type #31)
2518
+
2519
+ * [**Play online**](https://www.puzzle-star-battle.com/)
2520
+
2521
+ * [**Solver Code**][31]
2522
+
2523
+ <details>
2524
+ <summary><strong>Rules</strong></summary>
2525
+
2526
+ You have to place stars on the grid according to the rules:
2527
+ - 2 stars cannot be adjacent horizontally, vertically or diagonally.
2528
+ - For 1★ puzzles, you have to place 1 star on each row, column and shape.
2529
+ - For 2★ puzzles, the stars per row, column and shape must be 2 etc.
2530
+
2531
+ </details>
2532
+
2533
+ **Unsolved puzzle**
2534
+
2535
+ <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/star_battle_unsolved.png" alt="Star Battle unsolved" width="500">
2536
+
2537
+ Code to utilize this package and solve the puzzle:
2538
+
2539
+ Note that as usual the board is an id of the shape (id is meaningless, just used to identify one shape), and the star_count parameter depenends on the puzzle type.
2540
+
2541
+ ```python
2542
+ from puzzle_solver import star_battle_solver as solver
2543
+ board = np.array([
2544
+ ['00', '00', '00', '00', '00', '01', '01', '01', '01', '01', '01', '01', '01', '01', '02', '02', '02', '03', '03', '03', '03', '03', '03', '03', '03'],
2545
+ ['00', '01', '00', '01', '01', '01', '01', '01', '01', '01', '04', '04', '01', '02', '02', '02', '02', '05', '05', '05', '05', '05', '05', '03', '03'],
2546
+ ['00', '01', '01', '01', '01', '01', '01', '01', '01', '04', '04', '04', '04', '04', '02', '02', '05', '05', '05', '05', '05', '05', '03', '03', '03'],
2547
+ ['00', '01', '06', '04', '04', '04', '04', '04', '04', '04', '04', '04', '04', '04', '02', '05', '05', '05', '05', '05', '05', '05', '03', '07', '03'],
2548
+ ['00', '01', '06', '06', '06', '06', '06', '06', '06', '04', '04', '04', '04', '02', '02', '02', '02', '02', '05', '05', '05', '05', '05', '07', '03'],
2549
+ ['00', '00', '08', '06', '09', '09', '09', '09', '06', '04', '04', '04', '04', '02', '02', '02', '02', '02', '05', '05', '05', '05', '07', '07', '07'],
2550
+ ['00', '08', '08', '08', '08', '09', '09', '06', '06', '06', '04', '04', '04', '04', '02', '02', '02', '05', '05', '05', '07', '07', '07', '07', '07'],
2551
+ ['00', '00', '08', '08', '08', '09', '09', '09', '09', '06', '10', '10', '10', '10', '02', '02', '02', '05', '11', '11', '11', '11', '07', '07', '07'],
2552
+ ['08', '08', '08', '08', '09', '09', '09', '09', '09', '09', '10', '10', '10', '02', '02', '02', '02', '11', '11', '11', '11', '11', '11', '07', '11'],
2553
+ ['08', '08', '08', '08', '09', '09', '09', '09', '09', '10', '10', '10', '10', '02', '02', '02', '11', '11', '11', '11', '11', '11', '11', '07', '11'],
2554
+ ['08', '08', '08', '09', '09', '09', '09', '09', '10', '10', '10', '10', '10', '12', '12', '12', '12', '11', '11', '11', '11', '11', '11', '11', '11'],
2555
+ ['08', '08', '09', '09', '09', '09', '09', '08', '10', '10', '10', '10', '10', '10', '10', '10', '12', '11', '11', '11', '11', '13', '11', '13', '11'],
2556
+ ['14', '08', '08', '08', '08', '08', '08', '08', '10', '10', '10', '10', '10', '12', '12', '12', '12', '12', '11', '11', '11', '13', '11', '13', '15'],
2557
+ ['14', '14', '14', '14', '16', '08', '16', '16', '17', '10', '10', '10', '10', '10', '10', '10', '10', '12', '13', '13', '13', '13', '13', '13', '15'],
2558
+ ['14', '14', '14', '14', '16', '16', '16', '16', '17', '10', '10', '18', '18', '10', '19', '10', '12', '12', '13', '15', '15', '15', '15', '15', '15'],
2559
+ ['14', '14', '14', '14', '14', '16', '16', '17', '17', '18', '18', '18', '19', '19', '19', '10', '10', '10', '13', '15', '15', '15', '15', '15', '15'],
2560
+ ['14', '14', '14', '16', '16', '16', '16', '17', '18', '18', '20', '20', '19', '21', '19', '19', '19', '19', '13', '15', '15', '15', '15', '15', '15'],
2561
+ ['14', '16', '16', '16', '16', '16', '16', '17', '18', '18', '20', '21', '21', '21', '21', '19', '21', '19', '15', '15', '21', '15', '15', '15', '15'],
2562
+ ['14', '14', '14', '16', '16', '17', '17', '17', '18', '20', '20', '21', '20', '21', '21', '19', '21', '19', '15', '21', '21', '15', '15', '15', '15'],
2563
+ ['14', '14', '14', '16', '16', '16', '17', '17', '18', '18', '20', '20', '20', '20', '21', '21', '21', '21', '21', '21', '15', '15', '22', '22', '15'],
2564
+ ['14', '14', '14', '14', '23', '16', '17', '20', '18', '20', '20', '20', '20', '20', '20', '21', '24', '24', '24', '21', '15', '15', '22', '15', '15'],
2565
+ ['14', '14', '14', '14', '23', '20', '17', '20', '18', '20', '20', '20', '20', '24', '24', '24', '24', '24', '24', '21', '15', '22', '22', '22', '15'],
2566
+ ['14', '23', '23', '14', '23', '20', '20', '20', '18', '20', '20', '20', '20', '24', '24', '24', '24', '24', '24', '24', '24', '24', '24', '22', '15'],
2567
+ ['14', '23', '14', '14', '23', '20', '23', '20', '18', '20', '20', '20', '20', '24', '24', '24', '24', '24', '24', '24', '22', '22', '22', '22', '22'],
2568
+ ['14', '23', '23', '23', '23', '23', '23', '20', '20', '20', '20', '20', '20', '24', '24', '24', '24', '24', '24', '24', '24', '24', '24', '24', '24']
2569
+ ])
2570
+ binst = solver.Board(board=board, star_count=6)
2571
+ solutions = binst.solve_and_print()
2572
+ ```
2573
+
2574
+
2575
+ **Script Output**
2576
+
2577
+ ```python
2578
+ Solution found
2579
+ [' ', ' ', ' ', ' ', '*', ' ', '*', ' ', '*', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '*', ' ', '*', ' ', '*', ' ', ' ', ' '],
2580
+ ['*', ' ', '*', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '*', ' ', '*', ' ', '*', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '*', ' '],
2581
+ [' ', ' ', ' ', ' ', '*', ' ', '*', ' ', '*', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '*', ' ', '*', ' ', '*', ' ', ' ', ' ', ' '],
2582
+ ['*', ' ', '*', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '*', ' ', '*', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '*', ' ', '*'],
2583
+ [' ', ' ', ' ', ' ', ' ', '*', ' ', '*', ' ', ' ', ' ', ' ', ' ', ' ', '*', ' ', '*', ' ', '*', ' ', '*', ' ', ' ', ' ', ' '],
2584
+ [' ', '*', ' ', '*', ' ', ' ', ' ', ' ', ' ', '*', ' ', '*', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '*', ' ', '*'],
2585
+ [' ', ' ', ' ', ' ', ' ', '*', ' ', '*', ' ', ' ', ' ', ' ', ' ', '*', ' ', '*', ' ', ' ', '*', ' ', '*', ' ', ' ', ' ', ' '],
2586
+ [' ', '*', ' ', '*', ' ', ' ', ' ', ' ', ' ', '*', ' ', '*', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '*', ' ', '*'],
2587
+ [' ', ' ', ' ', ' ', ' ', '*', ' ', '*', ' ', ' ', ' ', ' ', ' ', '*', ' ', '*', ' ', '*', ' ', '*', ' ', ' ', ' ', ' ', ' '],
2588
+ [' ', '*', ' ', '*', ' ', ' ', ' ', ' ', ' ', '*', ' ', '*', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '*', ' ', '*', ' '],
2589
+ [' ', ' ', ' ', ' ', ' ', '*', ' ', '*', ' ', ' ', ' ', ' ', ' ', '*', ' ', '*', ' ', '*', ' ', '*', ' ', ' ', ' ', ' ', ' '],
2590
+ ['*', ' ', '*', ' ', ' ', ' ', ' ', ' ', ' ', '*', ' ', '*', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '*', ' ', '*', ' '],
2591
+ [' ', ' ', ' ', ' ', '*', ' ', '*', ' ', ' ', ' ', ' ', ' ', ' ', '*', ' ', '*', ' ', '*', ' ', '*', ' ', ' ', ' ', ' ', ' '],
2592
+ ['*', ' ', '*', ' ', ' ', ' ', ' ', ' ', '*', ' ', '*', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '*', ' ', '*', ' '],
2593
+ [' ', ' ', ' ', ' ', '*', ' ', '*', ' ', ' ', ' ', ' ', ' ', '*', ' ', '*', ' ', '*', ' ', '*', ' ', ' ', ' ', ' ', ' ', ' '],
2594
+ [' ', '*', ' ', ' ', ' ', ' ', ' ', ' ', '*', ' ', '*', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '*', ' ', '*', ' ', '*'],
2595
+ [' ', ' ', ' ', '*', ' ', '*', ' ', ' ', ' ', ' ', ' ', ' ', '*', ' ', '*', ' ', '*', ' ', '*', ' ', ' ', ' ', ' ', ' ', ' '],
2596
+ [' ', '*', ' ', ' ', ' ', ' ', ' ', '*', ' ', '*', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '*', ' ', '*', ' ', '*'],
2597
+ [' ', ' ', ' ', '*', ' ', '*', ' ', ' ', ' ', ' ', ' ', '*', ' ', '*', ' ', '*', ' ', '*', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
2598
+ ['*', ' ', ' ', ' ', ' ', ' ', ' ', '*', ' ', '*', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '*', ' ', '*', ' ', '*', ' '],
2599
+ [' ', ' ', '*', ' ', '*', ' ', ' ', ' ', ' ', ' ', ' ', '*', ' ', '*', ' ', '*', ' ', '*', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
2600
+ ['*', ' ', ' ', ' ', ' ', ' ', '*', ' ', '*', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '*', ' ', '*', ' ', '*', ' '],
2601
+ [' ', ' ', '*', ' ', '*', ' ', ' ', ' ', ' ', ' ', '*', ' ', '*', ' ', '*', ' ', '*', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
2602
+ [' ', ' ', ' ', ' ', ' ', ' ', '*', ' ', '*', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '*', ' ', '*', ' ', '*', ' ', '*'],
2603
+ [' ', '*', ' ', '*', ' ', ' ', ' ', ' ', ' ', ' ', '*', ' ', '*', ' ', '*', ' ', '*', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
2604
+ Solutions found: 1
2605
+ status: OPTIMAL
2606
+ Time taken: 0.38 seconds
2607
+ ```
2608
+
2609
+ **Solved puzzle**
2610
+
2611
+ <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/star_battle_solved.png" alt="Star Battle solved" width="500">
2612
+
2613
+ ---
2614
+
2442
2615
  ---
2443
2616
 
2444
2617
  ## Why SAT / CP-SAT?
@@ -2519,3 +2692,5 @@ Issues and PRs welcome!
2519
2692
  [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"
2520
2693
  [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"
2521
2694
  [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"
2695
+ [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"
2696
+ [31]: https://github.com/Ar-Kareem/puzzle_solver/tree/master/src/puzzle_solver/puzzles/star_battle "puzzle_solver/src/puzzle_solver/puzzles/star_battle at master · Ar-Kareem/puzzle_solver · GitHub"