multi-puzzle-solver 0.9.6__tar.gz → 0.9.8__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.6/src/multi_puzzle_solver.egg-info → multi_puzzle_solver-0.9.8}/PKG-INFO +108 -1
  2. multi_puzzle_solver-0.9.6/PKG-INFO → multi_puzzle_solver-0.9.8/README.md +2670 -2589
  3. multi_puzzle_solver-0.9.6/README.md → multi_puzzle_solver-0.9.8/src/multi_puzzle_solver.egg-info/PKG-INFO +2696 -2563
  4. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/src/multi_puzzle_solver.egg-info/SOURCES.txt +2 -0
  5. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/src/puzzle_solver/__init__.py +2 -1
  6. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/src/puzzle_solver/puzzles/minesweeper/minesweeper.py +19 -6
  7. multi_puzzle_solver-0.9.8/src/puzzle_solver/puzzles/star_battle/star_battle.py +63 -0
  8. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/src/puzzle_solver/puzzles/stitches/parse_map/parse_map.py +2 -1
  9. multi_puzzle_solver-0.9.8/tests/test_minesweeper.py +77 -0
  10. multi_puzzle_solver-0.9.8/tests/test_star_battle.py +99 -0
  11. multi_puzzle_solver-0.9.6/tests/test_minesweeper.py +0 -37
  12. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/pyproject.toml +0 -0
  13. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/setup.cfg +0 -0
  14. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/src/multi_puzzle_solver.egg-info/dependency_links.txt +0 -0
  15. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/src/multi_puzzle_solver.egg-info/requires.txt +0 -0
  16. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/src/multi_puzzle_solver.egg-info/top_level.txt +0 -0
  17. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/src/puzzle_solver/core/utils.py +0 -0
  18. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/src/puzzle_solver/core/utils_ortools.py +0 -0
  19. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/src/puzzle_solver/puzzles/aquarium/aquarium.py +0 -0
  20. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/src/puzzle_solver/puzzles/battleships/battleships.py +0 -0
  21. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/src/puzzle_solver/puzzles/bridges/bridges.py +0 -0
  22. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/src/puzzle_solver/puzzles/chess_range/chess_melee.py +0 -0
  23. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/src/puzzle_solver/puzzles/chess_range/chess_range.py +0 -0
  24. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/src/puzzle_solver/puzzles/chess_range/chess_solo.py +0 -0
  25. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/src/puzzle_solver/puzzles/dominosa/dominosa.py +0 -0
  26. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/src/puzzle_solver/puzzles/filling/filling.py +0 -0
  27. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/src/puzzle_solver/puzzles/guess/guess.py +0 -0
  28. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/src/puzzle_solver/puzzles/inertia/inertia.py +0 -0
  29. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/src/puzzle_solver/puzzles/inertia/parse_map/parse_map.py +0 -0
  30. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/src/puzzle_solver/puzzles/inertia/tsp.py +0 -0
  31. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/src/puzzle_solver/puzzles/kakurasu/kakurasu.py +0 -0
  32. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/src/puzzle_solver/puzzles/keen/keen.py +0 -0
  33. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/src/puzzle_solver/puzzles/light_up/light_up.py +0 -0
  34. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/src/puzzle_solver/puzzles/magnets/magnets.py +0 -0
  35. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/src/puzzle_solver/puzzles/map/map.py +0 -0
  36. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/src/puzzle_solver/puzzles/mosaic/mosaic.py +0 -0
  37. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/src/puzzle_solver/puzzles/nonograms/nonograms.py +0 -0
  38. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/src/puzzle_solver/puzzles/pearl/pearl.py +0 -0
  39. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/src/puzzle_solver/puzzles/range/range.py +0 -0
  40. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/src/puzzle_solver/puzzles/signpost/signpost.py +0 -0
  41. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/src/puzzle_solver/puzzles/singles/singles.py +0 -0
  42. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/src/puzzle_solver/puzzles/stitches/stitches.py +0 -0
  43. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/src/puzzle_solver/puzzles/sudoku/sudoku.py +0 -0
  44. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/src/puzzle_solver/puzzles/tents/tents.py +0 -0
  45. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/src/puzzle_solver/puzzles/thermometers/thermometers.py +0 -0
  46. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/src/puzzle_solver/puzzles/towers/towers.py +0 -0
  47. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/src/puzzle_solver/puzzles/tracks/tracks.py +0 -0
  48. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/src/puzzle_solver/puzzles/undead/undead.py +0 -0
  49. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/src/puzzle_solver/puzzles/unruly/unruly.py +0 -0
  50. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/src/puzzle_solver/utils/visualizer.py +0 -0
  51. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/tests/test_aquarium.py +0 -0
  52. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/tests/test_battleships.py +0 -0
  53. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/tests/test_bridges.py +0 -0
  54. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/tests/test_chess_melee.py +0 -0
  55. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/tests/test_chess_range.py +0 -0
  56. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/tests/test_chess_solo.py +0 -0
  57. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/tests/test_dominosa.py +0 -0
  58. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/tests/test_filling.py +0 -0
  59. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/tests/test_guess.py +0 -0
  60. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/tests/test_inertia.py +0 -0
  61. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/tests/test_kakurasu.py +0 -0
  62. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/tests/test_keen.py +0 -0
  63. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/tests/test_light_up.py +0 -0
  64. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/tests/test_magnets.py +0 -0
  65. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/tests/test_map.py +0 -0
  66. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/tests/test_mosaic.py +0 -0
  67. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/tests/test_nonograms.py +0 -0
  68. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/tests/test_pearl.py +0 -0
  69. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/tests/test_range.py +0 -0
  70. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/tests/test_signpost.py +0 -0
  71. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/tests/test_singles.py +0 -0
  72. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/tests/test_stitches.py +0 -0
  73. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/tests/test_sudoku.py +0 -0
  74. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/tests/test_tents.py +0 -0
  75. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/tests/test_thermometers.py +0 -0
  76. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/tests/test_towers.py +0 -0
  77. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/tests/test_tracks.py +0 -0
  78. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/tests/test_undead.py +0 -0
  79. {multi_puzzle_solver-0.9.6 → multi_puzzle_solver-0.9.8}/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.6
3
+ Version: 0.9.8
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
@@ -248,6 +248,13 @@ These are all the puzzles that are implemented in this repo. <br> Click on any o
248
248
  </a>
249
249
  </td>
250
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_solved.png" alt="Star Battle" width="140">
255
+ </a>
256
+ </td>
257
+ </tr>
251
258
  </table>
252
259
 
253
260
  </div>
@@ -292,6 +299,7 @@ These are all the puzzles that are implemented in this repo. <br> Click on any o
292
299
  - [Stitches (Puzzle Type #28)](#stitches-puzzle-type-28)
293
300
  - [Battleships (Puzzle Type #29)](#battleships-puzzle-type-29)
294
301
  - [Kakurasu (Puzzle Type #30)](#kakurasu-puzzle-type-30)
302
+ - [Star Battle (Puzzle Type #31)](#star-battle-puzzle-type-31)
295
303
  - [Why SAT / CP-SAT?](#why-sat--cp-sat)
296
304
  - [Testing](#testing)
297
305
  - [Contributing](#contributing)
@@ -2506,6 +2514,104 @@ Time taken: 0.00 seconds
2506
2514
 
2507
2515
  ---
2508
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
+
2509
2615
  ---
2510
2616
 
2511
2617
  ## Why SAT / CP-SAT?
@@ -2587,3 +2693,4 @@ Issues and PRs welcome!
2587
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"
2588
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"
2589
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"