multi-puzzle-solver 0.9.24__tar.gz → 0.9.25__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 (107) hide show
  1. {multi_puzzle_solver-0.9.24/src/multi_puzzle_solver.egg-info → multi_puzzle_solver-0.9.25}/PKG-INFO +103 -3
  2. multi_puzzle_solver-0.9.24/PKG-INFO → multi_puzzle_solver-0.9.25/README.md +3889 -3815
  3. multi_puzzle_solver-0.9.24/README.md → multi_puzzle_solver-0.9.25/src/multi_puzzle_solver.egg-info/PKG-INFO +3915 -3789
  4. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/multi_puzzle_solver.egg-info/SOURCES.txt +5 -0
  5. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/__init__.py +3 -1
  6. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/core/utils.py +77 -57
  7. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/core/utils_ortools.py +6 -10
  8. multi_puzzle_solver-0.9.25/src/puzzle_solver/puzzles/flip/flip.py +48 -0
  9. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/lits/lits.py +2 -28
  10. multi_puzzle_solver-0.9.25/src/puzzle_solver/puzzles/palisade/palisade.py +104 -0
  11. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/slitherlink/slitherlink.py +8 -3
  12. multi_puzzle_solver-0.9.25/tests/test_flip.py +2 -0
  13. multi_puzzle_solver-0.9.25/tests/test_palisade.py +157 -0
  14. multi_puzzle_solver-0.9.25/tests/test_utils.py +11 -0
  15. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/pyproject.toml +0 -0
  16. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/setup.cfg +0 -0
  17. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/multi_puzzle_solver.egg-info/dependency_links.txt +0 -0
  18. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/multi_puzzle_solver.egg-info/requires.txt +0 -0
  19. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/multi_puzzle_solver.egg-info/top_level.txt +0 -0
  20. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/aquarium/aquarium.py +0 -0
  21. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/battleships/battleships.py +0 -0
  22. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/binairo/binairo.py +0 -0
  23. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/black_box/black_box.py +0 -0
  24. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/bridges/bridges.py +0 -0
  25. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/chess_range/chess_melee.py +0 -0
  26. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/chess_range/chess_range.py +0 -0
  27. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/chess_range/chess_solo.py +0 -0
  28. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/dominosa/dominosa.py +0 -0
  29. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/filling/filling.py +0 -0
  30. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/galaxies/galaxies.py +0 -0
  31. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/galaxies/parse_map/parse_map.py +0 -0
  32. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/guess/guess.py +0 -0
  33. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/inertia/inertia.py +0 -0
  34. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/inertia/parse_map/parse_map.py +0 -0
  35. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/inertia/tsp.py +0 -0
  36. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/kakurasu/kakurasu.py +0 -0
  37. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/keen/keen.py +0 -0
  38. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/light_up/light_up.py +0 -0
  39. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/magnets/magnets.py +0 -0
  40. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/map/map.py +0 -0
  41. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/minesweeper/minesweeper.py +0 -0
  42. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/mosaic/mosaic.py +0 -0
  43. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/nonograms/nonograms.py +0 -0
  44. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/norinori/norinori.py +0 -0
  45. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/pearl/pearl.py +0 -0
  46. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/range/range.py +0 -0
  47. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/rectangles/rectangles.py +0 -0
  48. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/signpost/signpost.py +0 -0
  49. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/singles/singles.py +0 -0
  50. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/slant/parse_map/parse_map.py +0 -0
  51. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/slant/slant.py +0 -0
  52. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/star_battle/star_battle.py +0 -0
  53. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/star_battle/star_battle_shapeless.py +0 -0
  54. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/stitches/parse_map/parse_map.py +0 -0
  55. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/stitches/stitches.py +0 -0
  56. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/sudoku/sudoku.py +0 -0
  57. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/tents/tents.py +0 -0
  58. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/thermometers/thermometers.py +0 -0
  59. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/towers/towers.py +0 -0
  60. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/tracks/tracks.py +0 -0
  61. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/undead/undead.py +0 -0
  62. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/unequal/unequal.py +0 -0
  63. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/unruly/unruly.py +0 -0
  64. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/yin_yang/parse_map/parse_map.py +0 -0
  65. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/puzzles/yin_yang/yin_yang.py +0 -0
  66. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/src/puzzle_solver/utils/visualizer.py +0 -0
  67. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/tests/test_aquarium.py +0 -0
  68. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/tests/test_battleships.py +0 -0
  69. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/tests/test_binairo.py +0 -0
  70. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/tests/test_black_box.py +0 -0
  71. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/tests/test_bridges.py +0 -0
  72. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/tests/test_chess_melee.py +0 -0
  73. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/tests/test_chess_range.py +0 -0
  74. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/tests/test_chess_solo.py +0 -0
  75. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/tests/test_dominosa.py +0 -0
  76. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/tests/test_filling.py +0 -0
  77. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/tests/test_galaxies.py +0 -0
  78. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/tests/test_guess.py +0 -0
  79. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/tests/test_inertia.py +0 -0
  80. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/tests/test_kakurasu.py +0 -0
  81. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/tests/test_keen.py +0 -0
  82. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/tests/test_light_up.py +0 -0
  83. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/tests/test_lits.py +0 -0
  84. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/tests/test_magnets.py +0 -0
  85. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/tests/test_map.py +0 -0
  86. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/tests/test_minesweeper.py +0 -0
  87. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/tests/test_mosaic.py +0 -0
  88. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/tests/test_nonograms.py +0 -0
  89. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/tests/test_norinori.py +0 -0
  90. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/tests/test_pearl.py +0 -0
  91. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/tests/test_range.py +0 -0
  92. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/tests/test_rectangles.py +0 -0
  93. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/tests/test_signpost.py +0 -0
  94. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/tests/test_singles.py +0 -0
  95. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/tests/test_slant.py +0 -0
  96. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/tests/test_slitherlink.py +0 -0
  97. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/tests/test_star_battle.py +0 -0
  98. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/tests/test_stitches.py +0 -0
  99. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/tests/test_sudoku.py +0 -0
  100. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/tests/test_tents.py +0 -0
  101. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/tests/test_thermometers.py +0 -0
  102. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/tests/test_towers.py +0 -0
  103. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/tests/test_tracks.py +0 -0
  104. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/tests/test_undead.py +0 -0
  105. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/tests/test_unequal.py +0 -0
  106. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/tests/test_unruly.py +0 -0
  107. {multi_puzzle_solver-0.9.24 → multi_puzzle_solver-0.9.25}/tests/test_yin_yang.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: multi-puzzle-solver
3
- Version: 0.9.24
3
+ Version: 0.9.25
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
@@ -326,6 +326,11 @@ These are all the puzzles that are implemented in this repo. <br> Click on any o
326
326
  <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/rectangles_solved.png" alt="Rectangles" width="140">
327
327
  </a>
328
328
  </td>
329
+ <td align="center">
330
+ <a href="#palisade-puzzle-type-43"><b>Palisade</b><br><br>
331
+ <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/palisade_solved.png" alt="Palisade" width="140">
332
+ </a>
333
+ </td>
329
334
  </tr>
330
335
  </table>
331
336
 
@@ -383,6 +388,7 @@ These are all the puzzles that are implemented in this repo. <br> Click on any o
383
388
  - [Yin-Yang (Puzzle Type #40)](#yin-yang-puzzle-type-40)
384
389
  - [Binairo (Puzzle Type #41)](#binairo-puzzle-type-41)
385
390
  - [Rectangles (Puzzle Type #42)](#rectangles-puzzle-type-42)
391
+ - [Palisade (Puzzle Type #43)](#palisade-puzzle-type-43)
386
392
  - [Why SAT / CP-SAT?](#why-sat--cp-sat)
387
393
  - [Testing](#testing)
388
394
  - [Contributing](#contributing)
@@ -3317,9 +3323,13 @@ Applying the solution to the puzzle visually:
3317
3323
 
3318
3324
  ## Slitherlink (Puzzle Type #39)
3319
3325
 
3320
- Also known as Fences and Loop the Loop
3326
+ Also known as Fences, Loop the Loop, and Loopy
3321
3327
 
3322
- * [**Play online**](https://www.puzzle-loop.com)
3328
+ * [**Play online 1**](https://www.chiark.greenend.org.uk/~sgtatham/puzzles/js/loopy.html)
3329
+
3330
+ * [**Play online 2**](https://www.puzzle-loop.com)
3331
+
3332
+ * [**Instructions**](https://www.chiark.greenend.org.uk/~sgtatham/puzzles/doc/loopy.html#loopy)
3323
3333
 
3324
3334
  * [**Solver Code**][39]
3325
3335
 
@@ -3720,6 +3730,95 @@ Applying the solution to the puzzle visually:
3720
3730
 
3721
3731
  ---
3722
3732
 
3733
+
3734
+ ## Palisade (Puzzle Type #43)
3735
+
3736
+ * [**Play online**](https://www.chiark.greenend.org.uk/~sgtatham/puzzles/js/palisade.html)
3737
+
3738
+ * [**Instructions**](https://www.chiark.greenend.org.uk/~sgtatham/puzzles/doc/palisade.html#palisade)
3739
+
3740
+ * [**Solver Code**][42]
3741
+
3742
+ <details>
3743
+ <summary><strong>Rules</strong></summary>
3744
+
3745
+ You're given a grid of N squares and a region size M, some of which contain numbers. Your goal is to subdivide the grid into (N/M) contiguous regions, where every region is of size M, such that each square containing a number is adjacent to exactly that many edges (including those between the inside and the outside of the grid).
3746
+
3747
+ </details>
3748
+
3749
+ **Unsolved puzzle**
3750
+
3751
+ <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/palisade_unsolved.png" alt="Palisade unsolved" width="500">
3752
+
3753
+ Code to utilize this package and solve the puzzle:
3754
+
3755
+ (Note: it takes a few seconds for the model to be built if the region size is larger than 8 and around 10 seconds for a region size of 10)
3756
+
3757
+ ```python
3758
+ import numpy as np
3759
+ from puzzle_solver import palisade_solver as solver
3760
+ board = np.array([
3761
+ ['2', ' ', ' ', ' ', ' ', '3', ' ', ' ', '1', '1', '3', ' ', ' ', ' ', ' '],
3762
+ ['3', '2', '1', ' ', '2', '3', ' ', ' ', ' ', ' ', ' ', '2', ' ', '0', ' '],
3763
+ [' ', ' ', ' ', '1', '1', ' ', ' ', '1', ' ', ' ', ' ', '1', ' ', ' ', ' '],
3764
+ [' ', '3', '2', ' ', ' ', ' ', ' ', '2', '3', ' ', ' ', ' ', '1', ' ', ' '],
3765
+ [' ', '0', '1', ' ', '2', ' ', ' ', '0', ' ', ' ', ' ', '1', ' ', '3', '2'],
3766
+ ['1', '0', ' ', ' ', ' ', '2', '2', ' ', '2', ' ', '3', ' ', '0', '2', ' '],
3767
+ [' ', ' ', ' ', ' ', ' ', '3', ' ', ' ', ' ', '2', ' ', ' ', ' ', ' ', ' '],
3768
+ [' ', '1', ' ', ' ', ' ', '3', '1', ' ', '1', ' ', ' ', ' ', ' ', '1', ' '],
3769
+ [' ', ' ', ' ', '0', ' ', ' ', '0', ' ', ' ', '1', '2', ' ', ' ', ' ', '3'],
3770
+ [' ', ' ', ' ', ' ', ' ', ' ', '1', ' ', ' ', '2', ' ', ' ', '1', '2', '1'],
3771
+ [' ', ' ', ' ', ' ', '1', ' ', '2', '3', '1', ' ', ' ', ' ', '2', ' ', '1'],
3772
+ ['2', ' ', '1', ' ', '2', '2', '1', ' ', ' ', '2', ' ', ' ', ' ', ' ', ' '],
3773
+ ])
3774
+ binst = solver.Board(board, region_size=10)
3775
+ solutions = binst.solve_and_print()
3776
+ ```
3777
+
3778
+ **Script Output**
3779
+
3780
+ ```python
3781
+ Solution found
3782
+ 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1
3783
+ 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4
3784
+ ┌───────────────────┬───────────────────────┬───────────────┐
3785
+ 0│ 2 · · · · │ 3 · · 1 1 3 │ · · · · │
3786
+ │ ┌───────────┐ ├───────┬───┐ ┌───┴───┐ │
3787
+ 1│ 3 │ 2 1 · │ 2 │ 3 · │ · │ · · │ · 2 │ · 0 · │
3788
+ ├───┘ │ └───┐ │ └───┐ └───┐ └───┐ │
3789
+ 2│ · · · 1 │ 1 · │ · │ 1 · │ · · │ 1 · │ · · │
3790
+ │ ┌───┐ │ ┌───┘ │ ┌───┴───────┘ └───┐ │
3791
+ 3│ · │ 3 │ 2 · │ · │ · · │ 2 │ 3 · · · 1 · │ · │
3792
+ ├───┘ └───────┼───┘ ┌───┘ └───┬───────────────┬───┴───┤
3793
+ 4│ · 0 1 · │ 2 · │ · 0 · │ · · 1 · │ 3 2 │
3794
+ │ ┌───┘ │ │ ┌───┐ └───┐ │
3795
+ 5│ 1 0 · │ · · 2 │ 2 · 2 │ · │ 3 │ · 0 2 │ · │
3796
+ │ ┌───┴───────────┼───┬───────┴───┤ ├───┐ │ │
3797
+ 6│ · · │ · · · 3 │ · │ · · 2 │ · │ · │ · · │ · │
3798
+ ├───────┘ ┌───────────┤ └───┐ │ │ └───────┘ │
3799
+ 7│ · 1 · │ · · 3 │ 1 · │ 1 · │ · │ · · 1 · │
3800
+ │ ┌───┘ ┌───┘ │ │ └───────┐ ┌───┤
3801
+ 8│ · · │ · 0 · │ · 0 · │ · 1 │ 2 · · │ · │ 3 │
3802
+ │ ┌───┘ ┌───┤ ├───┐ └───┐ ├───┘ │
3803
+ 9│ · │ · · · │ · │ · 1 · │ · │ 2 · │ · 1 │ 2 1 │
3804
+ ├───┤ ┌───────┘ ├───────┐ │ └───┐ │ │ │
3805
+ 10│ · │ · │ · · 1 │ · 2 │ 3 │ 1 · │ · │ · 2 │ · 1 │
3806
+ │ └───┘ │ └───┘ ├───┴───────┘ │
3807
+ 11│ 2 · 1 · 2 │ 2 1 · · 2 │ · · · · · │
3808
+ └───────────────────┴───────────────────┴───────────────────┘
3809
+ Solutions found: 1
3810
+ status: OPTIMAL
3811
+ Time taken: 11.94 seconds
3812
+ ```
3813
+
3814
+ **Solved puzzle**
3815
+
3816
+ Applying the solution to the puzzle visually:
3817
+
3818
+ <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/palisade_solved.png" alt="Palisade solved" width="500">
3819
+
3820
+ ---
3821
+
3723
3822
  ---
3724
3823
 
3725
3824
  ## Why SAT / CP-SAT?
@@ -3813,3 +3912,4 @@ Issues and PRs welcome!
3813
3912
  [40]: https://github.com/Ar-Kareem/puzzle_solver/tree/master/src/puzzle_solver/puzzles/yin_yang "puzzle_solver/src/puzzle_solver/puzzles/yin_yang at master · Ar-Kareem/puzzle_solver · GitHub"
3814
3913
  [41]: https://github.com/Ar-Kareem/puzzle_solver/tree/master/src/puzzle_solver/puzzles/binairo "puzzle_solver/src/puzzle_solver/puzzles/binairo at master · Ar-Kareem/puzzle_solver · GitHub"
3815
3914
  [42]: https://github.com/Ar-Kareem/puzzle_solver/tree/master/src/puzzle_solver/puzzles/rectangles "puzzle_solver/src/puzzle_solver/puzzles/rectangles at master · Ar-Kareem/puzzle_solver · GitHub"
3915
+ [43]: https://github.com/Ar-Kareem/puzzle_solver/tree/master/src/puzzle_solver/puzzles/palisade "puzzle_solver/src/puzzle_solver/puzzles/palisade at master · Ar-Kareem/puzzle_solver · GitHub"