multi-puzzle-solver 0.9.10__tar.gz → 0.9.13__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.

Potentially problematic release.


This version of multi-puzzle-solver might be problematic. Click here for more details.

Files changed (82) hide show
  1. {multi_puzzle_solver-0.9.10/src/multi_puzzle_solver.egg-info → multi_puzzle_solver-0.9.13}/PKG-INFO +97 -1
  2. multi_puzzle_solver-0.9.10/PKG-INFO → multi_puzzle_solver-0.9.13/README.md +2842 -2772
  3. multi_puzzle_solver-0.9.10/README.md → multi_puzzle_solver-0.9.13/src/multi_puzzle_solver.egg-info/PKG-INFO +2868 -2746
  4. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/src/multi_puzzle_solver.egg-info/SOURCES.txt +2 -0
  5. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/src/puzzle_solver/__init__.py +2 -1
  6. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/src/puzzle_solver/core/utils.py +1 -1
  7. multi_puzzle_solver-0.9.13/src/puzzle_solver/core/utils_ortools.py +172 -0
  8. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/src/puzzle_solver/puzzles/battleships/battleships.py +0 -1
  9. multi_puzzle_solver-0.9.13/src/puzzle_solver/puzzles/lits/lits.py +255 -0
  10. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/src/puzzle_solver/puzzles/stitches/parse_map/parse_map.py +212 -211
  11. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/src/puzzle_solver/utils/visualizer.py +15 -1
  12. multi_puzzle_solver-0.9.13/tests/test_lits.py +107 -0
  13. multi_puzzle_solver-0.9.10/src/puzzle_solver/core/utils_ortools.py +0 -82
  14. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/pyproject.toml +0 -0
  15. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/setup.cfg +0 -0
  16. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/src/multi_puzzle_solver.egg-info/dependency_links.txt +0 -0
  17. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/src/multi_puzzle_solver.egg-info/requires.txt +0 -0
  18. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/src/multi_puzzle_solver.egg-info/top_level.txt +0 -0
  19. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/src/puzzle_solver/puzzles/aquarium/aquarium.py +0 -0
  20. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/src/puzzle_solver/puzzles/bridges/bridges.py +0 -0
  21. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/src/puzzle_solver/puzzles/chess_range/chess_melee.py +0 -0
  22. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/src/puzzle_solver/puzzles/chess_range/chess_range.py +0 -0
  23. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/src/puzzle_solver/puzzles/chess_range/chess_solo.py +0 -0
  24. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/src/puzzle_solver/puzzles/dominosa/dominosa.py +0 -0
  25. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/src/puzzle_solver/puzzles/filling/filling.py +0 -0
  26. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/src/puzzle_solver/puzzles/guess/guess.py +0 -0
  27. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/src/puzzle_solver/puzzles/inertia/inertia.py +0 -0
  28. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/src/puzzle_solver/puzzles/inertia/parse_map/parse_map.py +0 -0
  29. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/src/puzzle_solver/puzzles/inertia/tsp.py +0 -0
  30. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/src/puzzle_solver/puzzles/kakurasu/kakurasu.py +0 -0
  31. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/src/puzzle_solver/puzzles/keen/keen.py +0 -0
  32. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/src/puzzle_solver/puzzles/light_up/light_up.py +0 -0
  33. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/src/puzzle_solver/puzzles/magnets/magnets.py +0 -0
  34. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/src/puzzle_solver/puzzles/map/map.py +0 -0
  35. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/src/puzzle_solver/puzzles/minesweeper/minesweeper.py +0 -0
  36. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/src/puzzle_solver/puzzles/mosaic/mosaic.py +0 -0
  37. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/src/puzzle_solver/puzzles/nonograms/nonograms.py +0 -0
  38. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/src/puzzle_solver/puzzles/pearl/pearl.py +0 -0
  39. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/src/puzzle_solver/puzzles/range/range.py +0 -0
  40. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/src/puzzle_solver/puzzles/signpost/signpost.py +0 -0
  41. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/src/puzzle_solver/puzzles/singles/singles.py +0 -0
  42. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/src/puzzle_solver/puzzles/star_battle/star_battle.py +0 -0
  43. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/src/puzzle_solver/puzzles/star_battle/star_battle_shapeless.py +0 -0
  44. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/src/puzzle_solver/puzzles/stitches/stitches.py +0 -0
  45. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/src/puzzle_solver/puzzles/sudoku/sudoku.py +0 -0
  46. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/src/puzzle_solver/puzzles/tents/tents.py +0 -0
  47. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/src/puzzle_solver/puzzles/thermometers/thermometers.py +0 -0
  48. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/src/puzzle_solver/puzzles/towers/towers.py +0 -0
  49. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/src/puzzle_solver/puzzles/tracks/tracks.py +0 -0
  50. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/src/puzzle_solver/puzzles/undead/undead.py +0 -0
  51. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/src/puzzle_solver/puzzles/unruly/unruly.py +0 -0
  52. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/tests/test_aquarium.py +0 -0
  53. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/tests/test_battleships.py +0 -0
  54. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/tests/test_bridges.py +0 -0
  55. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/tests/test_chess_melee.py +0 -0
  56. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/tests/test_chess_range.py +0 -0
  57. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/tests/test_chess_solo.py +0 -0
  58. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/tests/test_dominosa.py +0 -0
  59. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/tests/test_filling.py +0 -0
  60. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/tests/test_guess.py +0 -0
  61. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/tests/test_inertia.py +0 -0
  62. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/tests/test_kakurasu.py +0 -0
  63. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/tests/test_keen.py +0 -0
  64. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/tests/test_light_up.py +0 -0
  65. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/tests/test_magnets.py +0 -0
  66. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/tests/test_map.py +0 -0
  67. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/tests/test_minesweeper.py +0 -0
  68. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/tests/test_mosaic.py +0 -0
  69. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/tests/test_nonograms.py +0 -0
  70. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/tests/test_pearl.py +0 -0
  71. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/tests/test_range.py +0 -0
  72. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/tests/test_signpost.py +0 -0
  73. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/tests/test_singles.py +0 -0
  74. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/tests/test_star_battle.py +0 -0
  75. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/tests/test_stitches.py +0 -0
  76. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/tests/test_sudoku.py +0 -0
  77. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/tests/test_tents.py +0 -0
  78. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/tests/test_thermometers.py +0 -0
  79. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/tests/test_towers.py +0 -0
  80. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/tests/test_tracks.py +0 -0
  81. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/tests/test_undead.py +0 -0
  82. {multi_puzzle_solver-0.9.10 → multi_puzzle_solver-0.9.13}/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.10
3
+ Version: 0.9.13
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
@@ -259,6 +259,11 @@ These are all the puzzles that are implemented in this repo. <br> Click on any o
259
259
  <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/star_battle_shapeless_solved.png" alt="Star Battle Shapeless" width="140">
260
260
  </a>
261
261
  </td>
262
+ <td align="center">
263
+ <a href="#lits-puzzle-type-33"><b>Lits</b><br><br>
264
+ <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/lits_solved.png" alt="Lits" width="140">
265
+ </a>
266
+ </td>
262
267
  </tr>
263
268
  </table>
264
269
 
@@ -306,6 +311,7 @@ These are all the puzzles that are implemented in this repo. <br> Click on any o
306
311
  - [Kakurasu (Puzzle Type #30)](#kakurasu-puzzle-type-30)
307
312
  - [Star Battle (Puzzle Type #31)](#star-battle-puzzle-type-31)
308
313
  - [Star Battle Shapeless (Puzzle Type #32)](#star-battle-shapeless-puzzle-type-32)
314
+ - [Lits (Puzzle Type #33)](#lits-puzzle-type-33)
309
315
  - [Why SAT / CP-SAT?](#why-sat--cp-sat)
310
316
  - [Testing](#testing)
311
317
  - [Contributing](#contributing)
@@ -2687,6 +2693,95 @@ Time taken: 0.02 seconds
2687
2693
 
2688
2694
  ---
2689
2695
 
2696
+ ## Lits (Puzzle Type #33)
2697
+
2698
+ * [**Play online**](https://www.puzzle-lits.com/)
2699
+
2700
+ * [**Solver Code**][33]
2701
+
2702
+ <details>
2703
+ <summary><strong>Rules</strong></summary>
2704
+
2705
+ You have to place one tetromino in each region in such a way that:
2706
+ - 2 tetrominoes of matching types cannot touch each other horizontally or vertically. Rotations and reflections count as matching.
2707
+ - The shaded cells should form a single connected area.
2708
+ - 2x2 shaded areas are not allowed.
2709
+
2710
+ * Tetromino is a shape made of 4 connected cells. There are 5 types of tetrominoes, which are usually named L, I, T, S and O, based on their shape. The O tetromino is not used in this puzzle because it is a 2x2 shape, which is not allowed.
2711
+
2712
+ </details>
2713
+
2714
+ Note: The solver is capable of solving variations where the puzzle pieces the made up of more than 4 cells (e.g., pentominoes for 5 with `polyomino_degrees=5`, or hexominoes for 6 with `polyomino_degrees=6`, etc.). By default the degree is set to 4 thus only tetrominoes are used.
2715
+
2716
+ **Unsolved puzzle**
2717
+
2718
+ <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/lits_unsolved.png" alt="Lits unsolved" width="500">
2719
+
2720
+ Code to utilize this package and solve the puzzle:
2721
+
2722
+ ```python
2723
+ board = np.array([
2724
+ ['00', '00', '00', '01', '01', '02', '02', '02', '03', '03', '03', '04', '04', '05', '06', '07', '07', '08', '08', '09'],
2725
+ ['00', '00', '00', '00', '01', '02', '03', '03', '03', '10', '04', '04', '05', '05', '06', '07', '08', '08', '09', '09'],
2726
+ ['11', '11', '11', '01', '01', '02', '02', '03', '10', '10', '04', '04', '05', '06', '06', '07', '07', '07', '09', '12'],
2727
+ ['11', '13', '13', '13', '01', '02', '03', '03', '03', '10', '04', '04', '06', '06', '06', '07', '12', '09', '09', '12'],
2728
+ ['11', '11', '11', '13', '14', '14', '03', '15', '15', '10', '04', '04', '06', '16', '16', '12', '12', '09', '12', '12'],
2729
+ ['17', '13', '13', '13', '14', '14', '03', '03', '15', '15', '04', '04', '16', '16', '16', '12', '12', '12', '12', '18'],
2730
+ ['17', '13', '19', '13', '20', '14', '03', '03', '15', '04', '04', '16', '16', '21', '21', '22', '23', '23', '23', '18'],
2731
+ ['17', '17', '19', '19', '20', '20', '03', '03', '24', '24', '24', '25', '25', '25', '21', '22', '23', '23', '18', '18'],
2732
+ ['17', '26', '19', '19', '20', '20', '20', '24', '24', '20', '20', '25', '25', '21', '21', '22', '22', '23', '23', '18'],
2733
+ ['26', '26', '26', '19', '19', '20', '20', '20', '20', '20', '25', '25', '21', '21', '21', '21', '21', '23', '27', '18'],
2734
+ ['28', '28', '28', '29', '29', '29', '29', '20', '20', '30', '30', '25', '31', '32', '32', '32', '21', '27', '27', '27'],
2735
+ ['28', '33', '28', '28', '28', '28', '29', '34', '34', '35', '30', '30', '31', '31', '31', '32', '32', '36', '36', '27'],
2736
+ ['28', '33', '33', '28', '28', '29', '29', '34', '34', '35', '35', '30', '31', '31', '31', '32', '36', '36', '27', '27'],
2737
+ ['28', '33', '37', '37', '28', '29', '34', '34', '35', '35', '38', '38', '39', '39', '40', '40', '40', '40', '27', '41'],
2738
+ ['28', '37', '37', '37', '42', '34', '34', '34', '43', '38', '38', '38', '39', '39', '44', '44', '40', '40', '27', '41'],
2739
+ ['37', '37', '42', '42', '42', '34', '34', '43', '43', '43', '38', '39', '39', '39', '44', '44', '27', '27', '27', '41'],
2740
+ ['45', '45', '45', '42', '46', '34', '34', '34', '34', '38', '38', '47', '47', '47', '44', '44', '44', '27', '27', '41'],
2741
+ ['48', '45', '45', '46', '46', '46', '46', '34', '49', '49', '49', '47', '44', '44', '44', '27', '44', '50', '27', '27'],
2742
+ ['48', '48', '45', '46', '46', '51', '46', '52', '52', '49', '49', '53', '44', '53', '44', '27', '50', '50', '50', '27'],
2743
+ ['48', '51', '51', '51', '51', '51', '52', '52', '52', '49', '53', '53', '53', '53', '44', '27', '27', '27', '27', '27']
2744
+ ])
2745
+ binst = solver.Board(board)
2746
+ solutions = binst.solve_then_constrain() # solve_then_constrain NOT solve_and_print (to use #1 instead of #2 in https://github.com/google/or-tools/discussions/3347, its faster in this case)
2747
+ ```
2748
+
2749
+ **Script Output**
2750
+
2751
+ ```python
2752
+ Solution found
2753
+ [
2754
+ ['X', 'X', 'X', ' ', ' ', 'X', 'X', 'X', ' ', ' ', ' ', ' ', ' ', 'X', ' ', 'X', ' ', 'X', 'X', ' '],
2755
+ [' ', 'X', ' ', ' ', 'X', 'X', ' ', ' ', ' ', 'X', ' ', ' ', 'X', 'X', ' ', 'X', 'X', 'X', ' ', ' '],
2756
+ ['X', 'X', 'X', 'X', 'X', ' ', ' ', 'X', 'X', 'X', ' ', ' ', 'X', ' ', ' ', 'X', ' ', ' ', 'X', ' '],
2757
+ ['X', ' ', ' ', ' ', 'X', ' ', 'X', 'X', ' ', 'X', 'X', ' ', 'X', 'X', 'X', 'X', ' ', 'X', 'X', ' '],
2758
+ [' ', ' ', ' ', 'X', 'X', 'X', 'X', ' ', 'X', ' ', 'X', ' ', 'X', ' ', ' ', ' ', ' ', 'X', ' ', ' '],
2759
+ ['X', ' ', 'X', 'X', ' ', 'X', ' ', ' ', 'X', 'X', 'X', ' ', 'X', 'X', ' ', 'X', 'X', 'X', 'X', ' '],
2760
+ ['X', ' ', ' ', 'X', ' ', 'X', ' ', ' ', 'X', ' ', 'X', 'X', 'X', ' ', ' ', 'X', ' ', ' ', ' ', 'X'],
2761
+ ['X', 'X', ' ', 'X', ' ', 'X', ' ', ' ', 'X', 'X', ' ', 'X', ' ', ' ', ' ', 'X', ' ', 'X', ' ', 'X'],
2762
+ [' ', 'X', ' ', 'X', ' ', 'X', 'X', 'X', 'X', ' ', ' ', 'X', ' ', 'X', 'X', 'X', 'X', 'X', 'X', 'X'],
2763
+ ['X', 'X', 'X', 'X', 'X', 'X', ' ', ' ', ' ', ' ', 'X', 'X', 'X', 'X', ' ', ' ', ' ', 'X', ' ', 'X'],
2764
+ [' ', ' ', ' ', ' ', ' ', 'X', 'X', ' ', ' ', ' ', 'X', ' ', ' ', 'X', 'X', 'X', ' ', ' ', ' ', ' '],
2765
+ [' ', 'X', ' ', 'X', 'X', ' ', 'X', ' ', ' ', 'X', 'X', 'X', ' ', 'X', ' ', 'X', ' ', 'X', 'X', ' '],
2766
+ [' ', 'X', 'X', ' ', 'X', ' ', 'X', ' ', ' ', 'X', ' ', 'X', 'X', 'X', 'X', ' ', 'X', 'X', ' ', ' '],
2767
+ [' ', 'X', ' ', ' ', 'X', ' ', 'X', ' ', 'X', 'X', 'X', ' ', 'X', ' ', 'X', 'X', 'X', ' ', ' ', 'X'],
2768
+ [' ', 'X', 'X', ' ', 'X', ' ', 'X', ' ', 'X', ' ', 'X', ' ', 'X', 'X', ' ', ' ', 'X', ' ', ' ', 'X'],
2769
+ ['X', 'X', ' ', 'X', 'X', ' ', 'X', 'X', 'X', 'X', 'X', ' ', ' ', 'X', ' ', ' ', 'X', 'X', ' ', 'X'],
2770
+ [' ', 'X', 'X', 'X', ' ', ' ', 'X', ' ', ' ', ' ', 'X', 'X', 'X', 'X', 'X', ' ', ' ', 'X', 'X', 'X'],
2771
+ ['X', ' ', 'X', ' ', 'X', 'X', 'X', ' ', 'X', 'X', ' ', 'X', ' ', ' ', 'X', ' ', ' ', 'X', ' ', ' '],
2772
+ ['X', 'X', 'X', ' ', 'X', ' ', ' ', 'X', ' ', 'X', ' ', 'X', ' ', ' ', 'X', ' ', 'X', 'X', 'X', ' '],
2773
+ ['X', ' ', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', ' ', 'X', ' ', ' ', ' ', ' ', ' '],
2774
+ ]
2775
+ Solutions found: 1
2776
+ Time taken: 0.38 seconds
2777
+ ```
2778
+
2779
+ **Solved puzzle**
2780
+
2781
+ <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/lits_solved.png" alt="Lits solved" width="500">
2782
+
2783
+ ---
2784
+
2690
2785
  ---
2691
2786
 
2692
2787
  ## Why SAT / CP-SAT?
@@ -2770,3 +2865,4 @@ Issues and PRs welcome!
2770
2865
  [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"
2771
2866
  [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"
2772
2867
  [32]: https://github.com/Ar-Kareem/puzzle_solver/tree/master/src/puzzle_solver/puzzles/star_battle_shapeless "puzzle_solver/src/puzzle_solver/puzzles/star_battle_shapeless at master · Ar-Kareem/puzzle_solver · GitHub"
2868
+ [33]: https://github.com/Ar-Kareem/puzzle_solver/tree/master/src/puzzle_solver/puzzles/lits "puzzle_solver/src/puzzle_solver/puzzles/lits at master · Ar-Kareem/puzzle_solver · GitHub"