multi-puzzle-solver 0.8.7__tar.gz → 0.9.1__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 (65) hide show
  1. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/PKG-INFO +121 -38
  2. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/README.md +121 -38
  3. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/src/multi_puzzle_solver.egg-info/PKG-INFO +121 -38
  4. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/src/multi_puzzle_solver.egg-info/SOURCES.txt +4 -0
  5. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/src/puzzle_solver/__init__.py +3 -1
  6. multi_puzzle_solver-0.9.1/src/puzzle_solver/puzzles/chess_range/chess_melee.py +7 -0
  7. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/src/puzzle_solver/puzzles/chess_range/chess_range.py +169 -30
  8. multi_puzzle_solver-0.9.1/src/puzzle_solver/puzzles/chess_range/chess_solo.py +9 -0
  9. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/src/puzzle_solver/puzzles/inertia/parse_map/parse_map.py +8 -8
  10. multi_puzzle_solver-0.9.1/tests/test_chess_melee.py +37 -0
  11. multi_puzzle_solver-0.9.1/tests/test_chess_range.py +33 -0
  12. multi_puzzle_solver-0.9.1/tests/test_chess_solo.py +23 -0
  13. multi_puzzle_solver-0.8.7/tests/test_chess_range.py +0 -14
  14. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/pyproject.toml +0 -0
  15. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/setup.cfg +0 -0
  16. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/src/multi_puzzle_solver.egg-info/dependency_links.txt +0 -0
  17. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/src/multi_puzzle_solver.egg-info/requires.txt +0 -0
  18. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/src/multi_puzzle_solver.egg-info/top_level.txt +0 -0
  19. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/src/puzzle_solver/core/utils.py +0 -0
  20. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/src/puzzle_solver/core/utils_ortools.py +0 -0
  21. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/src/puzzle_solver/puzzles/bridges/bridges.py +0 -0
  22. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/src/puzzle_solver/puzzles/dominosa/dominosa.py +0 -0
  23. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/src/puzzle_solver/puzzles/filling/filling.py +0 -0
  24. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/src/puzzle_solver/puzzles/guess/guess.py +0 -0
  25. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/src/puzzle_solver/puzzles/inertia/inertia.py +0 -0
  26. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/src/puzzle_solver/puzzles/inertia/tsp.py +0 -0
  27. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/src/puzzle_solver/puzzles/keen/keen.py +0 -0
  28. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/src/puzzle_solver/puzzles/light_up/light_up.py +0 -0
  29. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/src/puzzle_solver/puzzles/magnets/magnets.py +0 -0
  30. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/src/puzzle_solver/puzzles/map/map.py +0 -0
  31. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/src/puzzle_solver/puzzles/minesweeper/minesweeper.py +0 -0
  32. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/src/puzzle_solver/puzzles/mosaic/mosaic.py +0 -0
  33. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/src/puzzle_solver/puzzles/nonograms/nonograms.py +0 -0
  34. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/src/puzzle_solver/puzzles/pearl/pearl.py +0 -0
  35. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/src/puzzle_solver/puzzles/range/range.py +0 -0
  36. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/src/puzzle_solver/puzzles/signpost/signpost.py +0 -0
  37. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/src/puzzle_solver/puzzles/singles/singles.py +0 -0
  38. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/src/puzzle_solver/puzzles/sudoku/sudoku.py +0 -0
  39. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/src/puzzle_solver/puzzles/tents/tents.py +0 -0
  40. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/src/puzzle_solver/puzzles/towers/towers.py +0 -0
  41. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/src/puzzle_solver/puzzles/tracks/tracks.py +0 -0
  42. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/src/puzzle_solver/puzzles/undead/undead.py +0 -0
  43. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/src/puzzle_solver/puzzles/unruly/unruly.py +0 -0
  44. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/tests/test_bridges.py +0 -0
  45. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/tests/test_dominosa.py +0 -0
  46. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/tests/test_filling.py +0 -0
  47. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/tests/test_guess.py +0 -0
  48. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/tests/test_inertia.py +0 -0
  49. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/tests/test_keen.py +0 -0
  50. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/tests/test_light_up.py +0 -0
  51. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/tests/test_magnets.py +0 -0
  52. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/tests/test_map.py +0 -0
  53. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/tests/test_minesweeper.py +0 -0
  54. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/tests/test_mosaic.py +0 -0
  55. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/tests/test_nonograms.py +0 -0
  56. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/tests/test_pearl.py +0 -0
  57. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/tests/test_range.py +0 -0
  58. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/tests/test_signpost.py +0 -0
  59. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/tests/test_singles.py +0 -0
  60. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/tests/test_sudoku.py +0 -0
  61. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/tests/test_tents.py +0 -0
  62. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/tests/test_towers.py +0 -0
  63. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/tests/test_tracks.py +0 -0
  64. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/tests/test_undead.py +0 -0
  65. {multi_puzzle_solver-0.8.7 → multi_puzzle_solver-0.9.1}/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.8.7
3
+ Version: 0.9.1
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
@@ -210,8 +210,16 @@ These are all the puzzles that are implemented in this repo. <br> Click on any o
210
210
  <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/chess_range_unsolved.png" alt="Chess range" height="120">
211
211
  </a>
212
212
  </td>
213
-
214
- </td><td></td><td></td>
213
+ <td align="center">
214
+ <a href="#chess-solo-puzzle-type-24"><b>Chess Solo</b><br><br>
215
+ <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/chess_solo_unsolved.png" alt="Chess solo" height="120">
216
+ </a>
217
+ </td>
218
+ <td align="center">
219
+ <a href="#chess-melee-puzzle-type-25"><b>Chess Melee</b><br><br>
220
+ <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/chess_melee_unsolved.png" alt="Chess melee" height="120">
221
+ </a>
222
+ </td>
215
223
  </tr>
216
224
  </table>
217
225
 
@@ -249,9 +257,10 @@ These are all the puzzles that are implemented in this repo. <br> Click on any o
249
257
  - [Bridges (Puzzle Type #20)](#bridges-puzzle-type-20)
250
258
  - [Inertia (Puzzle Type #21)](#inertia-puzzle-type-21)
251
259
  - [Guess (Puzzle Type #22)](#guess-puzzle-type-22)
252
- - [Chess Range(Puzzle Type #23)](#chess-rangepuzzle-type-23)
260
+ - [Chess Range (Puzzle Type #23)](#chess-range-puzzle-type-23)
261
+ - [Chess Solo (Puzzle Type #24)](#chess-solo-puzzle-type-24)
262
+ - [Chess Melee (Puzzle Type #25)](#chess-melee-puzzle-type-25)
253
263
  - [Why SAT / CP-SAT?](#why-sat--cp-sat)
254
- - [What’s Inside](#whats-inside)
255
264
  - [Testing](#testing)
256
265
  - [Contributing](#contributing)
257
266
  - [Build and push to PyPI](#build-and-push-to-pypi)
@@ -1935,7 +1944,7 @@ In the case when there's only one possible choice left, the solver will inform y
1935
1944
 
1936
1945
  ---
1937
1946
 
1938
- ## Chess Range(Puzzle Type #23)
1947
+ ## Chess Range (Puzzle Type #23)
1939
1948
 
1940
1949
  * [**Play online**](https://www.puzzle-chess.com/chess-ranger-11/)
1941
1950
 
@@ -1944,7 +1953,7 @@ In the case when there's only one possible choice left, the solver will inform y
1944
1953
  <details>
1945
1954
  <summary><strong>Rules</strong></summary>
1946
1955
 
1947
- You are given a chess board with $N$ pieces distributed on it. Your aim is to make $N-1$ range of moves where each move is a legal chess move and captures another piece.
1956
+ You are given a chess board with $N$ pieces distributed on it. Your aim is to make $N-1$ sequence of moves where each move is a legal chess move and captures another piece.
1948
1957
 
1949
1958
  - Pieces move as standard chess pieces.
1950
1959
  - You can perform only capture moves. A move that does not capture another piece is not allowed.
@@ -1977,7 +1986,7 @@ Solution found
1977
1986
  ['Rg2->Pc2', 'Rc2->Bc3', 'Rc3->Pd3', 'Kb6->Pb5', 'Pg4->Nf5', 'Rd3->Rb3', 'Rb3->Kb5', 'Nc6->Qe7', 'Ne7->Pf5', 'Rb5->Nf5']
1978
1987
  Solutions found: 1
1979
1988
  status: FEASIBLE
1980
- Time taken: 6.27 seconds
1989
+ Time taken: 1.16 seconds
1981
1990
  ```
1982
1991
 
1983
1992
  **Solved puzzle**
@@ -1986,6 +1995,108 @@ Time taken: 6.27 seconds
1986
1995
 
1987
1996
  ---
1988
1997
 
1998
+ ## Chess Solo (Puzzle Type #24)
1999
+
2000
+ * [**Play online**](https://www.puzzle-chess.com/solo-chess-11/)
2001
+
2002
+ * [**Solver Code**][24]
2003
+
2004
+ <details>
2005
+ <summary><strong>Rules</strong></summary>
2006
+
2007
+ You are given a chess board with $N$ pieces distributed on it. Your aim is to make $N-1$ sequence of moves where each move is a legal chess move and captures another piece and end up with the king as the only piece on the board. You are not allowed to move a piece more than twice.
2008
+
2009
+ - Pieces move as standard chess pieces.
2010
+ - You can perform only capture moves. A move that does not capture another piece is not allowed.
2011
+ - You can move a piece only twice.
2012
+ - You are NOT allowed to capture the king.
2013
+ - The goal is to end up with one single piece (the king) on the board.
2014
+
2015
+ </details>
2016
+
2017
+ **Unsolved puzzle**
2018
+
2019
+ <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/chess_solo_unsolved.png" alt="Chess solo unsolved" width="500">
2020
+
2021
+ Code to utilize this package and solve the puzzle:
2022
+
2023
+ (Note that this puzzle does not typically have a unique solution. Thus, we specify here that we only want the first valid solution that the solver finds.)
2024
+
2025
+ ```python
2026
+ # algebraic notation
2027
+ board = ['Kc6', 'Rc5', 'Rc4', 'Pb3', 'Bd3', 'Pd2', 'Pe3', 'Nf2', 'Ng2', 'Qg3', 'Pg6']
2028
+ binst = solver.Board(board)
2029
+ solutions = binst.solve_and_print(max_solutions=1)
2030
+ ```
2031
+ **Script Output**
2032
+
2033
+ The output is in the form of "pos -> pos" where "pos" is the algebraic notation of the position.
2034
+
2035
+ ```python
2036
+ Solution found
2037
+ ['Qg3->Pg6', 'Qg6->Bd3', 'Pd2->Pe3', 'Ng2->Pe3', 'Nf2->Qd3', 'Ne3->Rc4', 'Pb3->Nc4', 'Nd3->Rc5', 'Kc6->Nc5', 'Kc5->Pc4']
2038
+ Solutions found: 1
2039
+ status: FEASIBLE
2040
+ Time taken: 0.47 seconds
2041
+ ```
2042
+
2043
+ **Solved puzzle**
2044
+
2045
+ <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/chess_solo_solved.png" alt="Chess solo solved" width="500">
2046
+
2047
+ ---
2048
+
2049
+ ## Chess Melee (Puzzle Type #25)
2050
+
2051
+ * [**Play online**](https://www.puzzle-chess.com/chess-melee-13/)
2052
+
2053
+ * [**Solver Code**][25]
2054
+
2055
+ <details>
2056
+ <summary><strong>Rules</strong></summary>
2057
+
2058
+ You are given a chess board with $N$ pieces distributed on it (equal white and black pieces, one more black if $N$ is odd). Your aim is to make $N-1$ sequence of moves where each move is a legal chess move and captures another piece of the opposite color and end up with a single piece on the board. White starts and colors alternate as usual.
2059
+
2060
+ - Pieces move as standard chess pieces.
2061
+ - White moves first.
2062
+ - You can perform only capture moves. A move that does not capture another piece of the opposite color is not allowed.
2063
+ - The goal is to end up with one single piece on the board.
2064
+
2065
+ </details>
2066
+
2067
+ **Unsolved puzzle**
2068
+
2069
+ <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/chess_melee_unsolved.png" alt="Chess melee unsolved" width="500">
2070
+
2071
+ Code to utilize this package and solve the puzzle:
2072
+
2073
+ (Note that this puzzle does not typically have a unique solution. Thus, we specify here that we only want the first valid solution that the solver finds.)
2074
+
2075
+ ```python
2076
+ # algebraic notation
2077
+ board = ['Pb7', 'Nc7', 'Bc6', 'Ne6', 'Pb5', 'Rc4', 'Qb3', 'Rf7', 'Rb6', 'Pe5', 'Nc3', 'Pd3', 'Nf3']
2078
+ colors = ['B', 'B', 'B', 'B', 'B', 'B', 'B', 'W', 'W', 'W', 'W', 'W', 'W']
2079
+ binst = solver.Board(board, colors)
2080
+ solutions = binst.solve_and_print()
2081
+ ```
2082
+ **Script Output**
2083
+
2084
+ The output is in the form of "pos -> pos" where "pos" is the algebraic notation of the position.
2085
+
2086
+ ```python
2087
+ Solution found
2088
+ ['Rf7->Nc7', 'Ne6->Rc7', 'Pd3->Rc4', 'Qb3->Nc3', 'Pc4->Pb5', 'Qc3->Pe5', 'Nf3->Qe5', 'Nc7->Pb5', 'Ne5->Bc6', 'Pb7->Nc6', 'Rb6->Nb5', 'Pc6->Rb5']
2089
+ Solutions found: 1
2090
+ status: OPTIMAL
2091
+ Time taken: 6.24 seconds
2092
+ ```
2093
+
2094
+ **Solved puzzle**
2095
+
2096
+ <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/chess_melee_solved.png" alt="Chess melee solved" width="500">
2097
+
2098
+ ---
2099
+
1989
2100
  ---
1990
2101
 
1991
2102
  ## Why SAT / CP-SAT?
@@ -2000,36 +2111,6 @@ This repo builds those constraints in Python and uses SAT/CP-SAT (e.g., OR-Tools
2000
2111
 
2001
2112
  ---
2002
2113
 
2003
- ## What’s Inside
2004
-
2005
- Each sub directory in `src/puzzle_solver/puzzles/` targets a different puzzle type. The following are the sub directories:
2006
-
2007
- * `nonograms` — Picross/Griddlers (run-length constraints). ([Chapter 10][1])
2008
- * `sudoku` — Sudoku (rows/cols/blocks all-different). ([Chapter 11][2])
2009
- * `minesweeper` — Minesweeper (mines + counts). ([Chapter 12][3])
2010
- * `guess` — Guess (similar to wordle, guess the colored circles). ([Chapter 15][22])
2011
- * `dominosa` — Dominosa (dominoes + counts). ([Chapter 17][4])
2012
- * `light_up` — *Akari* / Light Up (lighting & adjacency). ([Chapter 21][5])
2013
- * `map` — Map (region coloring). ([Chapter 22][18])
2014
- * `inertia` — Inertia (collect all gems without dying (with least number of moves; my addition)). ([Chapter 24][21])
2015
- * `tents` — Tents (tree-tent matching). ([Chapter 25][6])
2016
- * `bridges` — Bridges (island connections). ([Chapter 26][20])
2017
- * `filling` — Filling (Fillomino-style), region sizes. ([Chapter 29][7])
2018
- * `keen` — Keen (arithmetic operations). ([Chapter 30][8])
2019
- * `towers` — Skyscrapers (permutation + visibility). ([Chapter 31][9])
2020
- * `singles` — Singles (hiding numbers). ([Chapter 32][10])
2021
- * `magnets` — Magnets (polarized dominoes + counts). ([Chapter 33][11])
2022
- * `signpost` — Signpost (visible dominoes + counts). ([Chapter 34][12])
2023
- * `range` — Range (rays & totals). ([Chapter 35][13])
2024
- * `pearl` — Pearl (pearl game). ([Chapter 36][19])
2025
- * `undead` — UnDead (Vampires/Zombies/Ghosts). ([Chapter 37][14])
2026
- * `unruly` — Unruly (no triples + balance). ([Chapter 38][15])
2027
- * `tracks` — Tracks (connected components). ([Chapter 40][16])
2028
- * `mosaic` — Mosaic (Tapa-like tiling). ([Chapter 42][17])
2029
- * `chess_range` — Chess Range (chess moves). ([Puzzle-Chess][23])
2030
-
2031
- ---
2032
-
2033
2114
  ## Testing
2034
2115
 
2035
2116
  To run the tests, simply run the following (to create a fresh conda environment and install the dev dependencies):
@@ -2090,3 +2171,5 @@ Issues and PRs welcome!
2090
2171
  [16]: https://github.com/Ar-Kareem/puzzle_solver/tree/master/src/puzzle_solver/puzzles/tracks "puzzle_solver/src/puzzle_solver/puzzles/tracks at master · Ar-Kareem/puzzle_solver · GitHub"
2091
2172
  [17]: https://github.com/Ar-Kareem/puzzle_solver/tree/master/src/puzzle_solver/puzzles/mosaic "puzzle_solver/src/puzzle_solver/puzzles/mosaic at master · Ar-Kareem/puzzle_solver · GitHub"
2092
2173
  [23]: https://github.com/Ar-Kareem/puzzle_solver/tree/master/src/puzzle_solver/puzzles/chess_range "puzzle_solver/src/puzzle_solver/puzzles/chess_range at master · Ar-Kareem/puzzle_solver · GitHub"
2174
+ [24]: https://github.com/Ar-Kareem/puzzle_solver/tree/master/src/puzzle_solver/puzzles/chess_range#chess-solo-puzzle-type-24 "puzzle_solver/src/puzzle_solver/puzzles/chess_range at master · Ar-Kareem/puzzle_solver · GitHub"
2175
+ [25]: https://github.com/Ar-Kareem/puzzle_solver/tree/master/src/puzzle_solver/puzzles/chess_range#chess-melee-puzzle-type-25 "puzzle_solver/src/puzzle_solver/puzzles/chess_range at master · Ar-Kareem/puzzle_solver · GitHub"
@@ -184,8 +184,16 @@ These are all the puzzles that are implemented in this repo. <br> Click on any o
184
184
  <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/chess_range_unsolved.png" alt="Chess range" height="120">
185
185
  </a>
186
186
  </td>
187
-
188
- </td><td></td><td></td>
187
+ <td align="center">
188
+ <a href="#chess-solo-puzzle-type-24"><b>Chess Solo</b><br><br>
189
+ <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/chess_solo_unsolved.png" alt="Chess solo" height="120">
190
+ </a>
191
+ </td>
192
+ <td align="center">
193
+ <a href="#chess-melee-puzzle-type-25"><b>Chess Melee</b><br><br>
194
+ <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/chess_melee_unsolved.png" alt="Chess melee" height="120">
195
+ </a>
196
+ </td>
189
197
  </tr>
190
198
  </table>
191
199
 
@@ -223,9 +231,10 @@ These are all the puzzles that are implemented in this repo. <br> Click on any o
223
231
  - [Bridges (Puzzle Type #20)](#bridges-puzzle-type-20)
224
232
  - [Inertia (Puzzle Type #21)](#inertia-puzzle-type-21)
225
233
  - [Guess (Puzzle Type #22)](#guess-puzzle-type-22)
226
- - [Chess Range(Puzzle Type #23)](#chess-rangepuzzle-type-23)
234
+ - [Chess Range (Puzzle Type #23)](#chess-range-puzzle-type-23)
235
+ - [Chess Solo (Puzzle Type #24)](#chess-solo-puzzle-type-24)
236
+ - [Chess Melee (Puzzle Type #25)](#chess-melee-puzzle-type-25)
227
237
  - [Why SAT / CP-SAT?](#why-sat--cp-sat)
228
- - [What’s Inside](#whats-inside)
229
238
  - [Testing](#testing)
230
239
  - [Contributing](#contributing)
231
240
  - [Build and push to PyPI](#build-and-push-to-pypi)
@@ -1909,7 +1918,7 @@ In the case when there's only one possible choice left, the solver will inform y
1909
1918
 
1910
1919
  ---
1911
1920
 
1912
- ## Chess Range(Puzzle Type #23)
1921
+ ## Chess Range (Puzzle Type #23)
1913
1922
 
1914
1923
  * [**Play online**](https://www.puzzle-chess.com/chess-ranger-11/)
1915
1924
 
@@ -1918,7 +1927,7 @@ In the case when there's only one possible choice left, the solver will inform y
1918
1927
  <details>
1919
1928
  <summary><strong>Rules</strong></summary>
1920
1929
 
1921
- You are given a chess board with $N$ pieces distributed on it. Your aim is to make $N-1$ range of moves where each move is a legal chess move and captures another piece.
1930
+ You are given a chess board with $N$ pieces distributed on it. Your aim is to make $N-1$ sequence of moves where each move is a legal chess move and captures another piece.
1922
1931
 
1923
1932
  - Pieces move as standard chess pieces.
1924
1933
  - You can perform only capture moves. A move that does not capture another piece is not allowed.
@@ -1951,7 +1960,7 @@ Solution found
1951
1960
  ['Rg2->Pc2', 'Rc2->Bc3', 'Rc3->Pd3', 'Kb6->Pb5', 'Pg4->Nf5', 'Rd3->Rb3', 'Rb3->Kb5', 'Nc6->Qe7', 'Ne7->Pf5', 'Rb5->Nf5']
1952
1961
  Solutions found: 1
1953
1962
  status: FEASIBLE
1954
- Time taken: 6.27 seconds
1963
+ Time taken: 1.16 seconds
1955
1964
  ```
1956
1965
 
1957
1966
  **Solved puzzle**
@@ -1960,6 +1969,108 @@ Time taken: 6.27 seconds
1960
1969
 
1961
1970
  ---
1962
1971
 
1972
+ ## Chess Solo (Puzzle Type #24)
1973
+
1974
+ * [**Play online**](https://www.puzzle-chess.com/solo-chess-11/)
1975
+
1976
+ * [**Solver Code**][24]
1977
+
1978
+ <details>
1979
+ <summary><strong>Rules</strong></summary>
1980
+
1981
+ You are given a chess board with $N$ pieces distributed on it. Your aim is to make $N-1$ sequence of moves where each move is a legal chess move and captures another piece and end up with the king as the only piece on the board. You are not allowed to move a piece more than twice.
1982
+
1983
+ - Pieces move as standard chess pieces.
1984
+ - You can perform only capture moves. A move that does not capture another piece is not allowed.
1985
+ - You can move a piece only twice.
1986
+ - You are NOT allowed to capture the king.
1987
+ - The goal is to end up with one single piece (the king) on the board.
1988
+
1989
+ </details>
1990
+
1991
+ **Unsolved puzzle**
1992
+
1993
+ <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/chess_solo_unsolved.png" alt="Chess solo unsolved" width="500">
1994
+
1995
+ Code to utilize this package and solve the puzzle:
1996
+
1997
+ (Note that this puzzle does not typically have a unique solution. Thus, we specify here that we only want the first valid solution that the solver finds.)
1998
+
1999
+ ```python
2000
+ # algebraic notation
2001
+ board = ['Kc6', 'Rc5', 'Rc4', 'Pb3', 'Bd3', 'Pd2', 'Pe3', 'Nf2', 'Ng2', 'Qg3', 'Pg6']
2002
+ binst = solver.Board(board)
2003
+ solutions = binst.solve_and_print(max_solutions=1)
2004
+ ```
2005
+ **Script Output**
2006
+
2007
+ The output is in the form of "pos -> pos" where "pos" is the algebraic notation of the position.
2008
+
2009
+ ```python
2010
+ Solution found
2011
+ ['Qg3->Pg6', 'Qg6->Bd3', 'Pd2->Pe3', 'Ng2->Pe3', 'Nf2->Qd3', 'Ne3->Rc4', 'Pb3->Nc4', 'Nd3->Rc5', 'Kc6->Nc5', 'Kc5->Pc4']
2012
+ Solutions found: 1
2013
+ status: FEASIBLE
2014
+ Time taken: 0.47 seconds
2015
+ ```
2016
+
2017
+ **Solved puzzle**
2018
+
2019
+ <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/chess_solo_solved.png" alt="Chess solo solved" width="500">
2020
+
2021
+ ---
2022
+
2023
+ ## Chess Melee (Puzzle Type #25)
2024
+
2025
+ * [**Play online**](https://www.puzzle-chess.com/chess-melee-13/)
2026
+
2027
+ * [**Solver Code**][25]
2028
+
2029
+ <details>
2030
+ <summary><strong>Rules</strong></summary>
2031
+
2032
+ You are given a chess board with $N$ pieces distributed on it (equal white and black pieces, one more black if $N$ is odd). Your aim is to make $N-1$ sequence of moves where each move is a legal chess move and captures another piece of the opposite color and end up with a single piece on the board. White starts and colors alternate as usual.
2033
+
2034
+ - Pieces move as standard chess pieces.
2035
+ - White moves first.
2036
+ - You can perform only capture moves. A move that does not capture another piece of the opposite color is not allowed.
2037
+ - The goal is to end up with one single piece on the board.
2038
+
2039
+ </details>
2040
+
2041
+ **Unsolved puzzle**
2042
+
2043
+ <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/chess_melee_unsolved.png" alt="Chess melee unsolved" width="500">
2044
+
2045
+ Code to utilize this package and solve the puzzle:
2046
+
2047
+ (Note that this puzzle does not typically have a unique solution. Thus, we specify here that we only want the first valid solution that the solver finds.)
2048
+
2049
+ ```python
2050
+ # algebraic notation
2051
+ board = ['Pb7', 'Nc7', 'Bc6', 'Ne6', 'Pb5', 'Rc4', 'Qb3', 'Rf7', 'Rb6', 'Pe5', 'Nc3', 'Pd3', 'Nf3']
2052
+ colors = ['B', 'B', 'B', 'B', 'B', 'B', 'B', 'W', 'W', 'W', 'W', 'W', 'W']
2053
+ binst = solver.Board(board, colors)
2054
+ solutions = binst.solve_and_print()
2055
+ ```
2056
+ **Script Output**
2057
+
2058
+ The output is in the form of "pos -> pos" where "pos" is the algebraic notation of the position.
2059
+
2060
+ ```python
2061
+ Solution found
2062
+ ['Rf7->Nc7', 'Ne6->Rc7', 'Pd3->Rc4', 'Qb3->Nc3', 'Pc4->Pb5', 'Qc3->Pe5', 'Nf3->Qe5', 'Nc7->Pb5', 'Ne5->Bc6', 'Pb7->Nc6', 'Rb6->Nb5', 'Pc6->Rb5']
2063
+ Solutions found: 1
2064
+ status: OPTIMAL
2065
+ Time taken: 6.24 seconds
2066
+ ```
2067
+
2068
+ **Solved puzzle**
2069
+
2070
+ <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/chess_melee_solved.png" alt="Chess melee solved" width="500">
2071
+
2072
+ ---
2073
+
1963
2074
  ---
1964
2075
 
1965
2076
  ## Why SAT / CP-SAT?
@@ -1974,36 +2085,6 @@ This repo builds those constraints in Python and uses SAT/CP-SAT (e.g., OR-Tools
1974
2085
 
1975
2086
  ---
1976
2087
 
1977
- ## What’s Inside
1978
-
1979
- Each sub directory in `src/puzzle_solver/puzzles/` targets a different puzzle type. The following are the sub directories:
1980
-
1981
- * `nonograms` — Picross/Griddlers (run-length constraints). ([Chapter 10][1])
1982
- * `sudoku` — Sudoku (rows/cols/blocks all-different). ([Chapter 11][2])
1983
- * `minesweeper` — Minesweeper (mines + counts). ([Chapter 12][3])
1984
- * `guess` — Guess (similar to wordle, guess the colored circles). ([Chapter 15][22])
1985
- * `dominosa` — Dominosa (dominoes + counts). ([Chapter 17][4])
1986
- * `light_up` — *Akari* / Light Up (lighting & adjacency). ([Chapter 21][5])
1987
- * `map` — Map (region coloring). ([Chapter 22][18])
1988
- * `inertia` — Inertia (collect all gems without dying (with least number of moves; my addition)). ([Chapter 24][21])
1989
- * `tents` — Tents (tree-tent matching). ([Chapter 25][6])
1990
- * `bridges` — Bridges (island connections). ([Chapter 26][20])
1991
- * `filling` — Filling (Fillomino-style), region sizes. ([Chapter 29][7])
1992
- * `keen` — Keen (arithmetic operations). ([Chapter 30][8])
1993
- * `towers` — Skyscrapers (permutation + visibility). ([Chapter 31][9])
1994
- * `singles` — Singles (hiding numbers). ([Chapter 32][10])
1995
- * `magnets` — Magnets (polarized dominoes + counts). ([Chapter 33][11])
1996
- * `signpost` — Signpost (visible dominoes + counts). ([Chapter 34][12])
1997
- * `range` — Range (rays & totals). ([Chapter 35][13])
1998
- * `pearl` — Pearl (pearl game). ([Chapter 36][19])
1999
- * `undead` — UnDead (Vampires/Zombies/Ghosts). ([Chapter 37][14])
2000
- * `unruly` — Unruly (no triples + balance). ([Chapter 38][15])
2001
- * `tracks` — Tracks (connected components). ([Chapter 40][16])
2002
- * `mosaic` — Mosaic (Tapa-like tiling). ([Chapter 42][17])
2003
- * `chess_range` — Chess Range (chess moves). ([Puzzle-Chess][23])
2004
-
2005
- ---
2006
-
2007
2088
  ## Testing
2008
2089
 
2009
2090
  To run the tests, simply run the following (to create a fresh conda environment and install the dev dependencies):
@@ -2063,4 +2144,6 @@ Issues and PRs welcome!
2063
2144
  [15]: https://github.com/Ar-Kareem/puzzle_solver/tree/master/src/puzzle_solver/puzzles/unruly "puzzle_solver/src/puzzle_solver/puzzles/unruly at master · Ar-Kareem/puzzle_solver · GitHub"
2064
2145
  [16]: https://github.com/Ar-Kareem/puzzle_solver/tree/master/src/puzzle_solver/puzzles/tracks "puzzle_solver/src/puzzle_solver/puzzles/tracks at master · Ar-Kareem/puzzle_solver · GitHub"
2065
2146
  [17]: https://github.com/Ar-Kareem/puzzle_solver/tree/master/src/puzzle_solver/puzzles/mosaic "puzzle_solver/src/puzzle_solver/puzzles/mosaic at master · Ar-Kareem/puzzle_solver · GitHub"
2066
- [23]: https://github.com/Ar-Kareem/puzzle_solver/tree/master/src/puzzle_solver/puzzles/chess_range "puzzle_solver/src/puzzle_solver/puzzles/chess_range at master · Ar-Kareem/puzzle_solver · GitHub"
2147
+ [23]: https://github.com/Ar-Kareem/puzzle_solver/tree/master/src/puzzle_solver/puzzles/chess_range "puzzle_solver/src/puzzle_solver/puzzles/chess_range at master · Ar-Kareem/puzzle_solver · GitHub"
2148
+ [24]: https://github.com/Ar-Kareem/puzzle_solver/tree/master/src/puzzle_solver/puzzles/chess_range#chess-solo-puzzle-type-24 "puzzle_solver/src/puzzle_solver/puzzles/chess_range at master · Ar-Kareem/puzzle_solver · GitHub"
2149
+ [25]: https://github.com/Ar-Kareem/puzzle_solver/tree/master/src/puzzle_solver/puzzles/chess_range#chess-melee-puzzle-type-25 "puzzle_solver/src/puzzle_solver/puzzles/chess_range at master · Ar-Kareem/puzzle_solver · GitHub"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: multi-puzzle-solver
3
- Version: 0.8.7
3
+ Version: 0.9.1
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
@@ -210,8 +210,16 @@ These are all the puzzles that are implemented in this repo. <br> Click on any o
210
210
  <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/chess_range_unsolved.png" alt="Chess range" height="120">
211
211
  </a>
212
212
  </td>
213
-
214
- </td><td></td><td></td>
213
+ <td align="center">
214
+ <a href="#chess-solo-puzzle-type-24"><b>Chess Solo</b><br><br>
215
+ <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/chess_solo_unsolved.png" alt="Chess solo" height="120">
216
+ </a>
217
+ </td>
218
+ <td align="center">
219
+ <a href="#chess-melee-puzzle-type-25"><b>Chess Melee</b><br><br>
220
+ <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/chess_melee_unsolved.png" alt="Chess melee" height="120">
221
+ </a>
222
+ </td>
215
223
  </tr>
216
224
  </table>
217
225
 
@@ -249,9 +257,10 @@ These are all the puzzles that are implemented in this repo. <br> Click on any o
249
257
  - [Bridges (Puzzle Type #20)](#bridges-puzzle-type-20)
250
258
  - [Inertia (Puzzle Type #21)](#inertia-puzzle-type-21)
251
259
  - [Guess (Puzzle Type #22)](#guess-puzzle-type-22)
252
- - [Chess Range(Puzzle Type #23)](#chess-rangepuzzle-type-23)
260
+ - [Chess Range (Puzzle Type #23)](#chess-range-puzzle-type-23)
261
+ - [Chess Solo (Puzzle Type #24)](#chess-solo-puzzle-type-24)
262
+ - [Chess Melee (Puzzle Type #25)](#chess-melee-puzzle-type-25)
253
263
  - [Why SAT / CP-SAT?](#why-sat--cp-sat)
254
- - [What’s Inside](#whats-inside)
255
264
  - [Testing](#testing)
256
265
  - [Contributing](#contributing)
257
266
  - [Build and push to PyPI](#build-and-push-to-pypi)
@@ -1935,7 +1944,7 @@ In the case when there's only one possible choice left, the solver will inform y
1935
1944
 
1936
1945
  ---
1937
1946
 
1938
- ## Chess Range(Puzzle Type #23)
1947
+ ## Chess Range (Puzzle Type #23)
1939
1948
 
1940
1949
  * [**Play online**](https://www.puzzle-chess.com/chess-ranger-11/)
1941
1950
 
@@ -1944,7 +1953,7 @@ In the case when there's only one possible choice left, the solver will inform y
1944
1953
  <details>
1945
1954
  <summary><strong>Rules</strong></summary>
1946
1955
 
1947
- You are given a chess board with $N$ pieces distributed on it. Your aim is to make $N-1$ range of moves where each move is a legal chess move and captures another piece.
1956
+ You are given a chess board with $N$ pieces distributed on it. Your aim is to make $N-1$ sequence of moves where each move is a legal chess move and captures another piece.
1948
1957
 
1949
1958
  - Pieces move as standard chess pieces.
1950
1959
  - You can perform only capture moves. A move that does not capture another piece is not allowed.
@@ -1977,7 +1986,7 @@ Solution found
1977
1986
  ['Rg2->Pc2', 'Rc2->Bc3', 'Rc3->Pd3', 'Kb6->Pb5', 'Pg4->Nf5', 'Rd3->Rb3', 'Rb3->Kb5', 'Nc6->Qe7', 'Ne7->Pf5', 'Rb5->Nf5']
1978
1987
  Solutions found: 1
1979
1988
  status: FEASIBLE
1980
- Time taken: 6.27 seconds
1989
+ Time taken: 1.16 seconds
1981
1990
  ```
1982
1991
 
1983
1992
  **Solved puzzle**
@@ -1986,6 +1995,108 @@ Time taken: 6.27 seconds
1986
1995
 
1987
1996
  ---
1988
1997
 
1998
+ ## Chess Solo (Puzzle Type #24)
1999
+
2000
+ * [**Play online**](https://www.puzzle-chess.com/solo-chess-11/)
2001
+
2002
+ * [**Solver Code**][24]
2003
+
2004
+ <details>
2005
+ <summary><strong>Rules</strong></summary>
2006
+
2007
+ You are given a chess board with $N$ pieces distributed on it. Your aim is to make $N-1$ sequence of moves where each move is a legal chess move and captures another piece and end up with the king as the only piece on the board. You are not allowed to move a piece more than twice.
2008
+
2009
+ - Pieces move as standard chess pieces.
2010
+ - You can perform only capture moves. A move that does not capture another piece is not allowed.
2011
+ - You can move a piece only twice.
2012
+ - You are NOT allowed to capture the king.
2013
+ - The goal is to end up with one single piece (the king) on the board.
2014
+
2015
+ </details>
2016
+
2017
+ **Unsolved puzzle**
2018
+
2019
+ <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/chess_solo_unsolved.png" alt="Chess solo unsolved" width="500">
2020
+
2021
+ Code to utilize this package and solve the puzzle:
2022
+
2023
+ (Note that this puzzle does not typically have a unique solution. Thus, we specify here that we only want the first valid solution that the solver finds.)
2024
+
2025
+ ```python
2026
+ # algebraic notation
2027
+ board = ['Kc6', 'Rc5', 'Rc4', 'Pb3', 'Bd3', 'Pd2', 'Pe3', 'Nf2', 'Ng2', 'Qg3', 'Pg6']
2028
+ binst = solver.Board(board)
2029
+ solutions = binst.solve_and_print(max_solutions=1)
2030
+ ```
2031
+ **Script Output**
2032
+
2033
+ The output is in the form of "pos -> pos" where "pos" is the algebraic notation of the position.
2034
+
2035
+ ```python
2036
+ Solution found
2037
+ ['Qg3->Pg6', 'Qg6->Bd3', 'Pd2->Pe3', 'Ng2->Pe3', 'Nf2->Qd3', 'Ne3->Rc4', 'Pb3->Nc4', 'Nd3->Rc5', 'Kc6->Nc5', 'Kc5->Pc4']
2038
+ Solutions found: 1
2039
+ status: FEASIBLE
2040
+ Time taken: 0.47 seconds
2041
+ ```
2042
+
2043
+ **Solved puzzle**
2044
+
2045
+ <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/chess_solo_solved.png" alt="Chess solo solved" width="500">
2046
+
2047
+ ---
2048
+
2049
+ ## Chess Melee (Puzzle Type #25)
2050
+
2051
+ * [**Play online**](https://www.puzzle-chess.com/chess-melee-13/)
2052
+
2053
+ * [**Solver Code**][25]
2054
+
2055
+ <details>
2056
+ <summary><strong>Rules</strong></summary>
2057
+
2058
+ You are given a chess board with $N$ pieces distributed on it (equal white and black pieces, one more black if $N$ is odd). Your aim is to make $N-1$ sequence of moves where each move is a legal chess move and captures another piece of the opposite color and end up with a single piece on the board. White starts and colors alternate as usual.
2059
+
2060
+ - Pieces move as standard chess pieces.
2061
+ - White moves first.
2062
+ - You can perform only capture moves. A move that does not capture another piece of the opposite color is not allowed.
2063
+ - The goal is to end up with one single piece on the board.
2064
+
2065
+ </details>
2066
+
2067
+ **Unsolved puzzle**
2068
+
2069
+ <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/chess_melee_unsolved.png" alt="Chess melee unsolved" width="500">
2070
+
2071
+ Code to utilize this package and solve the puzzle:
2072
+
2073
+ (Note that this puzzle does not typically have a unique solution. Thus, we specify here that we only want the first valid solution that the solver finds.)
2074
+
2075
+ ```python
2076
+ # algebraic notation
2077
+ board = ['Pb7', 'Nc7', 'Bc6', 'Ne6', 'Pb5', 'Rc4', 'Qb3', 'Rf7', 'Rb6', 'Pe5', 'Nc3', 'Pd3', 'Nf3']
2078
+ colors = ['B', 'B', 'B', 'B', 'B', 'B', 'B', 'W', 'W', 'W', 'W', 'W', 'W']
2079
+ binst = solver.Board(board, colors)
2080
+ solutions = binst.solve_and_print()
2081
+ ```
2082
+ **Script Output**
2083
+
2084
+ The output is in the form of "pos -> pos" where "pos" is the algebraic notation of the position.
2085
+
2086
+ ```python
2087
+ Solution found
2088
+ ['Rf7->Nc7', 'Ne6->Rc7', 'Pd3->Rc4', 'Qb3->Nc3', 'Pc4->Pb5', 'Qc3->Pe5', 'Nf3->Qe5', 'Nc7->Pb5', 'Ne5->Bc6', 'Pb7->Nc6', 'Rb6->Nb5', 'Pc6->Rb5']
2089
+ Solutions found: 1
2090
+ status: OPTIMAL
2091
+ Time taken: 6.24 seconds
2092
+ ```
2093
+
2094
+ **Solved puzzle**
2095
+
2096
+ <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/chess_melee_solved.png" alt="Chess melee solved" width="500">
2097
+
2098
+ ---
2099
+
1989
2100
  ---
1990
2101
 
1991
2102
  ## Why SAT / CP-SAT?
@@ -2000,36 +2111,6 @@ This repo builds those constraints in Python and uses SAT/CP-SAT (e.g., OR-Tools
2000
2111
 
2001
2112
  ---
2002
2113
 
2003
- ## What’s Inside
2004
-
2005
- Each sub directory in `src/puzzle_solver/puzzles/` targets a different puzzle type. The following are the sub directories:
2006
-
2007
- * `nonograms` — Picross/Griddlers (run-length constraints). ([Chapter 10][1])
2008
- * `sudoku` — Sudoku (rows/cols/blocks all-different). ([Chapter 11][2])
2009
- * `minesweeper` — Minesweeper (mines + counts). ([Chapter 12][3])
2010
- * `guess` — Guess (similar to wordle, guess the colored circles). ([Chapter 15][22])
2011
- * `dominosa` — Dominosa (dominoes + counts). ([Chapter 17][4])
2012
- * `light_up` — *Akari* / Light Up (lighting & adjacency). ([Chapter 21][5])
2013
- * `map` — Map (region coloring). ([Chapter 22][18])
2014
- * `inertia` — Inertia (collect all gems without dying (with least number of moves; my addition)). ([Chapter 24][21])
2015
- * `tents` — Tents (tree-tent matching). ([Chapter 25][6])
2016
- * `bridges` — Bridges (island connections). ([Chapter 26][20])
2017
- * `filling` — Filling (Fillomino-style), region sizes. ([Chapter 29][7])
2018
- * `keen` — Keen (arithmetic operations). ([Chapter 30][8])
2019
- * `towers` — Skyscrapers (permutation + visibility). ([Chapter 31][9])
2020
- * `singles` — Singles (hiding numbers). ([Chapter 32][10])
2021
- * `magnets` — Magnets (polarized dominoes + counts). ([Chapter 33][11])
2022
- * `signpost` — Signpost (visible dominoes + counts). ([Chapter 34][12])
2023
- * `range` — Range (rays & totals). ([Chapter 35][13])
2024
- * `pearl` — Pearl (pearl game). ([Chapter 36][19])
2025
- * `undead` — UnDead (Vampires/Zombies/Ghosts). ([Chapter 37][14])
2026
- * `unruly` — Unruly (no triples + balance). ([Chapter 38][15])
2027
- * `tracks` — Tracks (connected components). ([Chapter 40][16])
2028
- * `mosaic` — Mosaic (Tapa-like tiling). ([Chapter 42][17])
2029
- * `chess_range` — Chess Range (chess moves). ([Puzzle-Chess][23])
2030
-
2031
- ---
2032
-
2033
2114
  ## Testing
2034
2115
 
2035
2116
  To run the tests, simply run the following (to create a fresh conda environment and install the dev dependencies):
@@ -2090,3 +2171,5 @@ Issues and PRs welcome!
2090
2171
  [16]: https://github.com/Ar-Kareem/puzzle_solver/tree/master/src/puzzle_solver/puzzles/tracks "puzzle_solver/src/puzzle_solver/puzzles/tracks at master · Ar-Kareem/puzzle_solver · GitHub"
2091
2172
  [17]: https://github.com/Ar-Kareem/puzzle_solver/tree/master/src/puzzle_solver/puzzles/mosaic "puzzle_solver/src/puzzle_solver/puzzles/mosaic at master · Ar-Kareem/puzzle_solver · GitHub"
2092
2173
  [23]: https://github.com/Ar-Kareem/puzzle_solver/tree/master/src/puzzle_solver/puzzles/chess_range "puzzle_solver/src/puzzle_solver/puzzles/chess_range at master · Ar-Kareem/puzzle_solver · GitHub"
2174
+ [24]: https://github.com/Ar-Kareem/puzzle_solver/tree/master/src/puzzle_solver/puzzles/chess_range#chess-solo-puzzle-type-24 "puzzle_solver/src/puzzle_solver/puzzles/chess_range at master · Ar-Kareem/puzzle_solver · GitHub"
2175
+ [25]: https://github.com/Ar-Kareem/puzzle_solver/tree/master/src/puzzle_solver/puzzles/chess_range#chess-melee-puzzle-type-25 "puzzle_solver/src/puzzle_solver/puzzles/chess_range at master · Ar-Kareem/puzzle_solver · GitHub"
@@ -9,7 +9,9 @@ src/puzzle_solver/__init__.py
9
9
  src/puzzle_solver/core/utils.py
10
10
  src/puzzle_solver/core/utils_ortools.py
11
11
  src/puzzle_solver/puzzles/bridges/bridges.py
12
+ src/puzzle_solver/puzzles/chess_range/chess_melee.py
12
13
  src/puzzle_solver/puzzles/chess_range/chess_range.py
14
+ src/puzzle_solver/puzzles/chess_range/chess_solo.py
13
15
  src/puzzle_solver/puzzles/dominosa/dominosa.py
14
16
  src/puzzle_solver/puzzles/filling/filling.py
15
17
  src/puzzle_solver/puzzles/guess/guess.py
@@ -34,7 +36,9 @@ src/puzzle_solver/puzzles/tracks/tracks.py
34
36
  src/puzzle_solver/puzzles/undead/undead.py
35
37
  src/puzzle_solver/puzzles/unruly/unruly.py
36
38
  tests/test_bridges.py
39
+ tests/test_chess_melee.py
37
40
  tests/test_chess_range.py
41
+ tests/test_chess_solo.py
38
42
  tests/test_dominosa.py
39
43
  tests/test_filling.py
40
44
  tests/test_guess.py