multi-puzzle-solver 0.9.18__py3-none-any.whl → 0.9.22__py3-none-any.whl

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.

@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: multi-puzzle-solver
3
- Version: 0.9.18
3
+ Version: 0.9.22
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
@@ -299,6 +299,21 @@ These are all the puzzles that are implemented in this repo. <br> Click on any o
299
299
  <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/unequal_solved.png" alt="Unequal" width="140">
300
300
  </a>
301
301
  </td>
302
+ <td align="center">
303
+ <a href="#norinori-puzzle-type-38"><b>Norinori</b><br><br>
304
+ <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/norinori_solved.png" alt="Norinori" width="140">
305
+ </a>
306
+ </td>
307
+ <td align="center">
308
+ <a href="#slitherlink-puzzle-type-39"><b>Slitherlink</b><br><br>
309
+ <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/slitherlink_solved.png" alt="Slitherlink" width="140">
310
+ </a>
311
+ </td>
312
+ <td align="center">
313
+ <a href="#yin-yang-puzzle-type-40"><b>Yin-Yang</b><br><br>
314
+ <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/yin_yang_solved.png" alt="Yin-Yang" width="140">
315
+ </a>
316
+ </td>
302
317
  </tr>
303
318
  </table>
304
319
 
@@ -351,6 +366,9 @@ These are all the puzzles that are implemented in this repo. <br> Click on any o
351
366
  - [Galaxies (Puzzle Type #35)](#galaxies-puzzle-type-35)
352
367
  - [Slant (Puzzle Type #36)](#slant-puzzle-type-36)
353
368
  - [Unequal (Puzzle Type #37)](#unequal-puzzle-type-37)
369
+ - [Norinori (Puzzle Type #38)](#norinori-puzzle-type-38)
370
+ - [Slitherlink (Puzzle Type #39)](#slitherlink-puzzle-type-39)
371
+ - [Yin-Yang (Puzzle Type #40)](#yin-yang-puzzle-type-40)
354
372
  - [Why SAT / CP-SAT?](#why-sat--cp-sat)
355
373
  - [Testing](#testing)
356
374
  - [Contributing](#contributing)
@@ -476,6 +494,13 @@ You are given some of the numbers as clues; your aim is to place the rest of the
476
494
  <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/sudoku_unsolved.png" alt="Sudoku unsolved" width="500">
477
495
 
478
496
  Code to utilize this package and solve the puzzle:
497
+
498
+ Note:
499
+
500
+ - The solver also supports solving the ["Sandwich" sudoku variant](https://dkmgames.com/SandwichSudoku/) through the optional parameter ``sandwich={'side': [...], 'bottom': [...] }``。
501
+
502
+ - The solver also supports solving the ["Sudoku-X" variant](https://www.sudopedia.org/wiki/Sudoku-X) through the optional parameter ``unique_diagonal=True``。
503
+
479
504
  ```python
480
505
  import numpy as np
481
506
  from puzzle_solver import sudoku_solver as solver
@@ -2208,6 +2233,7 @@ The numbers outside the grid show the number of filled cells horizontally and ve
2208
2233
  Code to utilize this package and solve the puzzle:
2209
2234
 
2210
2235
  ```python
2236
+ import numpy as np
2211
2237
  from puzzle_solver import thermometers_solver as solver
2212
2238
  board = np.array([
2213
2239
  ['R', 'R', 'D', 'R', 'D', 'R', 'X', 'D', 'L', 'X', 'L', 'L', 'L', 'L', 'L'],
@@ -2287,6 +2313,7 @@ The numbers outside the grid show the number of filled cells horizontally and ve
2287
2313
  Code to utilize this package and solve the puzzle:
2288
2314
 
2289
2315
  ```python
2316
+ import numpy as np
2290
2317
  from puzzle_solver import aquarium_solver as solver
2291
2318
  board = np.array([
2292
2319
  ['01', '01', '01', '01', '02', '02', '02', '03', '03', '03', '03', '04', '05', '05', '05'],
@@ -2364,6 +2391,7 @@ Time taken: 0.02 seconds
2364
2391
  Code to utilize this package and solve the puzzle:
2365
2392
 
2366
2393
  ```python
2394
+ import numpy as np
2367
2395
  from puzzle_solver import stitches_solver as solver
2368
2396
  board = np.array([
2369
2397
  ["00", "00", "00", "00", "00", "01", "01", "01", "01", "01", "01", "01", "01", "02", "02"],
@@ -2444,6 +2472,7 @@ Time taken: 0.01 seconds
2444
2472
  Code to utilize this package and solve the puzzle:
2445
2473
 
2446
2474
  ```python
2475
+ import numpy as np
2447
2476
  from puzzle_solver import battleships_solver as solver
2448
2477
  board = np.array([
2449
2478
  [' ', ' ', ' ', ' ', ' ', 'S', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
@@ -2526,6 +2555,7 @@ The goal is to make some of the cells black in such a way that:
2526
2555
  Code to utilize this package and solve the puzzle:
2527
2556
 
2528
2557
  ```python
2558
+ import numpy as np
2529
2559
  from puzzle_solver import kakurasu_solver as solver
2530
2560
  side = np.array([27, 6, 1, 12, 37, 37, 11, 4, 29, 23, 66, 55])
2531
2561
  bottom = np.array([22, 1, 25, 36, 10, 22, 25, 35, 32, 28, 45, 45])
@@ -2586,6 +2616,7 @@ Code to utilize this package and solve the puzzle:
2586
2616
  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.
2587
2617
 
2588
2618
  ```python
2619
+ import numpy as np
2589
2620
  from puzzle_solver import star_battle_solver as solver
2590
2621
  board = np.array([
2591
2622
  ['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'],
@@ -2685,7 +2716,8 @@ Code to utilize this package and solve the puzzle:
2685
2716
  The `star_count` parameter depenends on the puzzle type.
2686
2717
 
2687
2718
  ```python
2688
- from puzzle_solver import star_battle_shapeless_solver as shapeless_solver
2719
+ import numpy as np
2720
+ from puzzle_solver import star_battle_shapeless as solver
2689
2721
  board = np.array([
2690
2722
  [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
2691
2723
  ['B', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
@@ -2698,7 +2730,7 @@ board = np.array([
2698
2730
  ['B', 'B', ' ', ' ', ' ', ' ', 'B', 'B', 'B', ' '],
2699
2731
  ['B', ' ', ' ', ' ', 'B', ' ', ' ', ' ', ' ', ' '],
2700
2732
  ])
2701
- binst = shapeless_solver.Board(board=board, star_count=2)
2733
+ binst = solver.Board(board=board, star_count=2)
2702
2734
  solutions = binst.solve_and_print()
2703
2735
  ```
2704
2736
 
@@ -2755,6 +2787,8 @@ Note: The solver is capable of solving variations where the puzzle pieces the ma
2755
2787
  Code to utilize this package and solve the puzzle:
2756
2788
 
2757
2789
  ```python
2790
+ import numpy as np
2791
+ from puzzle_solver import lits_solver as solver
2758
2792
  board = np.array([
2759
2793
  ['00', '00', '00', '01', '01', '02', '02', '02', '03', '03', '03', '04', '04', '05', '06', '07', '07', '08', '08', '09'],
2760
2794
  ['00', '00', '00', '00', '01', '02', '03', '03', '03', '10', '04', '04', '05', '05', '06', '07', '08', '08', '09', '09'],
@@ -2951,6 +2985,7 @@ Code to utilize this package and solve the puzzle:
2951
2985
  Note: The number are arbitrary and simply number each galaxy as an integer.
2952
2986
 
2953
2987
  ```python
2988
+ import numpy as np
2954
2989
  from puzzle_solver import galaxies_solver as solver
2955
2990
  galaxies = np.array([
2956
2991
  [' ', ' ', '00', ' ', ' ', '01', '01', '02', '02', '03', '03', ' ', '04', '04', ' '],
@@ -3035,6 +3070,7 @@ Code to utilize this package and solve the puzzle:
3035
3070
  Note: For an NxM board you need an (N+1)x(M+1) array because the puzzle is to solve for the cells while the input is the values at the corners (there's always one more corner than cells in each dimension).
3036
3071
 
3037
3072
  ```python
3073
+ import numpy as np
3038
3074
  from puzzle_solver import slant_solver as solver
3039
3075
  board = np.array([
3040
3076
  [' ', ' ', '1', ' ', '1', ' ', '1', ' ', '1', ' ', ' ', ' ', ' '],
@@ -3083,6 +3119,8 @@ Applying the solution to the puzzle visually:
3083
3119
 
3084
3120
  ## Unequal (Puzzle Type #37)
3085
3121
 
3122
+ Also called "Futoshiki" or Renzoku"
3123
+
3086
3124
  * [**Play online**](https://www.chiark.greenend.org.uk/~sgtatham/puzzles/js/unequal.html)
3087
3125
 
3088
3126
  * [**Instructions**](https://www.chiark.greenend.org.uk/~sgtatham/puzzles/doc/unequal.html#unequal)
@@ -3117,6 +3155,8 @@ Code to utilize this package and solve the puzzle:
3117
3155
  Note: For an NxM board you need an (2N-1)x(2M-1) array because the puzzle involves input in between the cells. Each numbered cell has neighbors horizontally to represent ">", "<", and "|" (where "|" represents adjacency) and vertically to represent "∧", "∨" and "-" (where "-" represents adjacency). The "X" in the input are unused corners that shouldnt contain anything (just a corner). The numbers should never appear orthogonal to an "X", only diagonally to it. vice-versa for the comparison operators.
3118
3156
 
3119
3157
  ```python
3158
+ import numpy as np
3159
+ from puzzle_solver import unequal_solver as solver
3120
3160
  board = np.array([
3121
3161
  [' ', ' ', ' ', ' ', '9', ' ', '1', ' ', '7', '>', ' ', '>', ' ', ' ', ' ', ' ', ' ', '>', ' '],
3122
3162
  [' ', 'X', 'V', 'X', ' ', 'X', ' ', 'X', ' ', 'X', ' ', 'X', '∧', 'X', ' ', 'X', ' ', 'X', ' '],
@@ -3170,6 +3210,299 @@ Applying the solution to the puzzle visually:
3170
3210
 
3171
3211
  ---
3172
3212
 
3213
+ ## Norinori (Puzzle Type #38)
3214
+
3215
+ * [**Play online**](https://www.puzzle-norinori.com)
3216
+
3217
+ * [**Solver Code**][38]
3218
+
3219
+ <details>
3220
+ <summary><strong>Rules</strong></summary>
3221
+
3222
+ You have to shade some of the cells in such a way that:
3223
+ - Exactly 2 cells are shaded in each region.
3224
+ - Each shaded cell should be a part of a domino*. Dominoes can cross the region borders.
3225
+ - The dominoes cannot touch each other except diagonally.
3226
+
3227
+ * A domino is a shape made of 2 shaded cells next to each other (1x2 or 2x1).
3228
+
3229
+ </details>
3230
+
3231
+ **Unsolved puzzle**
3232
+
3233
+ <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/norinori_unsolved.png" alt="Norinori unsolved" width="500">
3234
+
3235
+ Code to utilize this package and solve the puzzle:
3236
+
3237
+ ```python
3238
+ import numpy as np
3239
+ from puzzle_solver import norinori_solver as solver
3240
+ board = np.array([
3241
+ ['00', '01', '01', '01', '01', '02', '03', '03', '04', '04', '04', '05', '05', '05', '06', '07', '08', '08', '09', '09'],
3242
+ ['00', '00', '01', '01', '01', '02', '03', '04', '04', '10', '11', '11', '05', '06', '06', '07', '08', '08', '12', '12'],
3243
+ ['13', '13', '13', '01', '01', '03', '03', '10', '10', '10', '11', '14', '05', '14', '07', '07', '07', '12', '12', '12'],
3244
+ ['13', '15', '13', '16', '16', '16', '17', '17', '17', '18', '18', '14', '14', '14', '07', '07', '07', '07', '07', '12'],
3245
+ ['13', '15', '15', '16', '19', '19', '17', '17', '17', '18', '18', '18', '14', '20', '07', '07', '21', '21', '21', '21'],
3246
+ ['13', '19', '19', '19', '19', '19', '17', '22', '22', '22', '22', '18', '14', '20', '20', '07', '21', '23', '23', '21'],
3247
+ ['24', '24', '25', '25', '25', '25', '26', '27', '27', '27', '28', '28', '20', '20', '29', '29', '30', '30', '31', '31'],
3248
+ ['24', '24', '25', '32', '33', '33', '26', '27', '27', '34', '28', '35', '35', '36', '36', '29', '37', '30', '31', '31'],
3249
+ ['38', '32', '32', '32', '33', '27', '27', '27', '27', '34', '28', '28', '35', '35', '29', '29', '37', '37', '31', '37'],
3250
+ ['38', '38', '32', '39', '33', '40', '34', '34', '34', '34', '28', '35', '35', '35', '41', '37', '37', '37', '37', '37'],
3251
+ ['42', '38', '39', '39', '40', '40', '43', '43', '34', '44', '28', '35', '45', '45', '41', '41', '41', '41', '46', '46'],
3252
+ ['42', '42', '39', '47', '47', '40', '40', '44', '44', '44', '48', '48', '48', '48', '48', '41', '49', '49', '49', '46'],
3253
+ ['50', '50', '39', '39', '40', '40', '40', '40', '51', '51', '51', '52', '48', '48', '53', '41', '54', '54', '49', '46'],
3254
+ ['50', '39', '39', '55', '55', '40', '40', '40', '56', '51', '51', '52', '53', '48', '53', '41', '41', '54', '49', '46'],
3255
+ ['39', '39', '39', '57', '56', '56', '56', '56', '56', '56', '53', '53', '53', '53', '53', '58', '58', '58', '59', '59'],
3256
+ ['60', '39', '39', '57', '57', '61', '61', '61', '62', '56', '56', '63', '63', '63', '63', '63', '59', '59', '59', '59'],
3257
+ ['60', '64', '65', '65', '61', '61', '66', '66', '62', '62', '62', '67', '63', '63', '68', '69', '69', '69', '69', '69'],
3258
+ ['60', '64', '65', '65', '65', '65', '66', '70', '70', '70', '70', '67', '67', '71', '68', '69', '72', '73', '73', '69'],
3259
+ ['60', '60', '60', '65', '66', '66', '66', '66', '74', '75', '75', '75', '67', '71', '68', '68', '72', '73', '73', '73'],
3260
+ ['76', '76', '76', '76', '76', '77', '77', '74', '74', '74', '74', '67', '67', '71', '71', '71', '72', '73', '78', '78']
3261
+ ])
3262
+ binst = solver.Board(board=board)
3263
+ solutions = binst.solve_and_print()
3264
+ ```
3265
+ **Script Output**
3266
+
3267
+ ```python
3268
+ Solution found
3269
+ [
3270
+ [ 'X', ' ', ' ', ' ', ' ', 'X', ' ', 'X', ' ', 'X', ' ', 'X', ' ', ' ', 'X', ' ', 'X', ' ', 'X', 'X' ],
3271
+ [ 'X', ' ', 'X', ' ', ' ', 'X', ' ', 'X', ' ', 'X', ' ', 'X', ' ', ' ', 'X', ' ', 'X', ' ', ' ', ' ' ],
3272
+ [ ' ', ' ', 'X', ' ', 'X', ' ', 'X', ' ', 'X', ' ', 'X', ' ', 'X', 'X', ' ', ' ', ' ', 'X', ' ', ' ' ],
3273
+ [ 'X', 'X', ' ', ' ', 'X', ' ', 'X', ' ', 'X', ' ', 'X', ' ', ' ', ' ', ' ', ' ', ' ', 'X', ' ', 'X' ],
3274
+ [ ' ', ' ', 'X', 'X', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'X', 'X', ' ', ' ', 'X', 'X', ' ', ' ', 'X' ],
3275
+ [ ' ', 'X', ' ', ' ', 'X', ' ', ' ', 'X', 'X', ' ', ' ', ' ', ' ', 'X', 'X', ' ', ' ', 'X', 'X', ' ' ],
3276
+ [ ' ', 'X', ' ', ' ', 'X', ' ', 'X', ' ', ' ', 'X', ' ', 'X', ' ', ' ', ' ', 'X', 'X', ' ', ' ', 'X' ],
3277
+ [ 'X', ' ', 'X', 'X', ' ', ' ', 'X', ' ', ' ', 'X', ' ', 'X', ' ', 'X', 'X', ' ', ' ', 'X', ' ', 'X' ],
3278
+ [ 'X', ' ', ' ', ' ', 'X', ' ', ' ', ' ', 'X', ' ', ' ', ' ', ' ', ' ', ' ', 'X', ' ', 'X', ' ', ' ' ],
3279
+ [ ' ', 'X', 'X', ' ', 'X', ' ', ' ', ' ', 'X', ' ', 'X', 'X', ' ', ' ', ' ', 'X', ' ', ' ', ' ', ' ' ],
3280
+ [ 'X', ' ', ' ', ' ', ' ', ' ', 'X', 'X', ' ', 'X', ' ', ' ', 'X', 'X', ' ', ' ', ' ', 'X', 'X', ' ' ],
3281
+ [ 'X', ' ', ' ', 'X', 'X', ' ', ' ', ' ', ' ', 'X', ' ', ' ', ' ', ' ', 'X', ' ', 'X', ' ', ' ', ' ' ],
3282
+ [ ' ', 'X', 'X', ' ', ' ', ' ', ' ', 'X', 'X', ' ', ' ', 'X', ' ', ' ', 'X', ' ', 'X', ' ', 'X', 'X' ],
3283
+ [ 'X', ' ', ' ', 'X', 'X', ' ', 'X', ' ', ' ', 'X', ' ', 'X', ' ', 'X', ' ', 'X', ' ', 'X', ' ', ' ' ],
3284
+ [ 'X', ' ', ' ', ' ', ' ', ' ', 'X', ' ', ' ', 'X', ' ', ' ', ' ', 'X', ' ', 'X', ' ', 'X', ' ', ' ' ],
3285
+ [ ' ', ' ', ' ', 'X', 'X', ' ', ' ', 'X', 'X', ' ', ' ', 'X', ' ', ' ', 'X', ' ', 'X', ' ', ' ', 'X' ],
3286
+ [ ' ', 'X', ' ', ' ', ' ', 'X', 'X', ' ', ' ', 'X', ' ', 'X', ' ', ' ', 'X', ' ', 'X', ' ', ' ', 'X' ],
3287
+ [ ' ', 'X', ' ', 'X', 'X', ' ', ' ', 'X', ' ', 'X', ' ', ' ', 'X', 'X', ' ', ' ', ' ', 'X', 'X', ' ' ],
3288
+ [ 'X', ' ', 'X', ' ', ' ', ' ', ' ', 'X', ' ', ' ', 'X', 'X', ' ', ' ', 'X', ' ', 'X', ' ', ' ', ' ' ],
3289
+ [ 'X', ' ', 'X', ' ', ' ', 'X', 'X', ' ', 'X', 'X', ' ', ' ', ' ', ' ', 'X', ' ', 'X', ' ', 'X', 'X' ],
3290
+ ]
3291
+ Solutions found: 1
3292
+ status: OPTIMAL
3293
+ Time taken: 0.04 seconds
3294
+ ```
3295
+
3296
+ **Solved puzzle**
3297
+
3298
+ Applying the solution to the puzzle visually:
3299
+
3300
+ <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/norinori_solved.png" alt="Norinori solved" width="500">
3301
+
3302
+ ---
3303
+
3304
+ ## Slitherlink (Puzzle Type #39)
3305
+
3306
+ Also known as Fences and Loop the Loop
3307
+
3308
+ * [**Play online**](https://www.puzzle-loop.com)
3309
+
3310
+ * [**Solver Code**][39]
3311
+
3312
+ <details>
3313
+ <summary><strong>Rules</strong></summary>
3314
+
3315
+ You have to draw lines between the dots to form a single loop without crossings or branches. The numbers indicate how many lines surround it.
3316
+
3317
+ A line forming a single loop without crossings or branches means that every corner has either 2 or 0 lines touching it.
3318
+
3319
+ </details>
3320
+
3321
+ **Unsolved puzzle**
3322
+
3323
+ <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/slitherlink_unsolved.png" alt="Slitherlink unsolved" width="500">
3324
+
3325
+ Code to utilize this package and solve the puzzle:
3326
+
3327
+ ```python
3328
+ import numpy as np
3329
+ from puzzle_solver import slitherlink_solver as solver
3330
+ board = np.array([
3331
+ ['3', ' ', ' ', '2', ' ', ' ', ' ', ' ', ' ', '3', ' ', ' ', ' ', ' ', ' ', '3', ' ', ' ', '1', ' '],
3332
+ [' ', ' ', '3', ' ', '3', ' ', ' ', ' ', '3', ' ', '2', '2', ' ', '2', ' ', '2', '2', ' ', '2', '3'],
3333
+ ['2', '2', ' ', ' ', ' ', '2', '1', ' ', '1', '1', ' ', ' ', '3', '1', ' ', '2', ' ', ' ', ' ', '2'],
3334
+ [' ', ' ', '2', ' ', ' ', '2', '2', ' ', ' ', ' ', '3', ' ', ' ', ' ', ' ', ' ', '2', '2', '3', ' '],
3335
+ ['1', '2', '1', ' ', ' ', ' ', '2', '1', ' ', '3', '2', ' ', '3', '2', '2', '3', ' ', '3', '2', '2'],
3336
+ [' ', '3', '2', '2', '1', '2', ' ', '3', ' ', ' ', ' ', ' ', '2', '2', '3', ' ', '1', '1', ' ', '2'],
3337
+ ['1', ' ', ' ', ' ', ' ', ' ', '2', ' ', ' ', '2', ' ', '1', '3', ' ', ' ', ' ', ' ', '2', '2', '2'],
3338
+ [' ', '3', ' ', '2', '0', '1', '2', '1', ' ', '1', '3', ' ', '2', ' ', ' ', '2', ' ', '2', '1', ' '],
3339
+ ['2', ' ', ' ', ' ', '2', ' ', '3', ' ', ' ', ' ', ' ', '2', ' ', ' ', '1', '2', ' ', ' ', '1', '3'],
3340
+ [' ', ' ', '1', ' ', ' ', ' ', ' ', '2', '0', ' ', '1', ' ', '2', ' ', '0', ' ', '2', ' ', '3', '2'],
3341
+ [' ', '3', ' ', '3', ' ', '1', '3', ' ', '3', ' ', '2', ' ', ' ', '2', '2', '2', '3', ' ', ' ', ' '],
3342
+ ['3', ' ', ' ', ' ', ' ', ' ', ' ', '0', '2', '1', ' ', ' ', '2', ' ', ' ', '1', ' ', '0', '2', ' '],
3343
+ [' ', ' ', ' ', ' ', ' ', ' ', '3', ' ', '3', '2', '3', ' ', ' ', '2', ' ', '1', ' ', ' ', ' ', ' '],
3344
+ ['2', '2', ' ', '3', '0', ' ', ' ', '3', ' ', ' ', '2', ' ', ' ', ' ', ' ', '2', '2', ' ', '3', ' '],
3345
+ [' ', '2', '0', ' ', ' ', '3', ' ', '1', ' ', ' ', '2', ' ', '2', '2', ' ', ' ', ' ', '2', ' ', '2'],
3346
+ [' ', ' ', '1', '3', '1', ' ', ' ', ' ', ' ', ' ', '2', ' ', '2', '1', ' ', '1', '2', '2', ' ', ' '],
3347
+ ['2', ' ', '2', '2', ' ', '1', '3', ' ', '2', ' ', '3', '1', '2', ' ', '3', '2', ' ', '1', '1', ' '],
3348
+ [' ', ' ', '2', ' ', '1', ' ', ' ', ' ', '2', ' ', ' ', ' ', '2', ' ', '1', '0', ' ', ' ', ' ', '3'],
3349
+ [' ', '2', ' ', ' ', '2', ' ', '2', '3', '2', ' ', '2', '2', ' ', '3', '2', '2', '3', '3', '1', ' '],
3350
+ ['0', '0', ' ', '3', '2', ' ', ' ', ' ', ' ', ' ', '2', '1', '2', '1', ' ', ' ', ' ', '2', '1', ' '],
3351
+ ])
3352
+ binst = solver.Board(board=board)
3353
+ solutions = binst.solve_and_print()
3354
+ ```
3355
+ **Script Output**
3356
+
3357
+ ```python
3358
+ Solution found
3359
+ 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1
3360
+ 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
3361
+ ┌───┐ ┌───────┐ ┌───────────────────┐ ┌───────┐ ┌───┐ ┌───────────┐
3362
+ 0│ 3 │ · │ · 2 │ · │ · · · · 3 │ · · │ · · │ · │ 3 │ · │ · 1 · │
3363
+ │ │ └───┐ │ │ ┌───────┐ ┌───┘ ┌───┘ ┌───┘ │ │ └───┐ ┌───┘
3364
+ 1│ · │ · 3 │ · │ 3 │ · │ · · │ 3 │ · 2 │ 2 · │ 2 · │ 2 │ 2 · │ 2 │ 3
3365
+ │ │ ┌───┘ └───┘ │ └───┘ ┌───┘ ┌───┘ │ └───────┘ └───┐
3366
+ 2│ 2 │ 2 │ · · · 2 │ 1 · 1 1 │ · · │ 3 1 · │ 2 · · · 2 │
3367
+ │ │ │ ┌───────────┘ ┌───┐ └───┐ └───────┐ └───────┐ ┌───┐ │
3368
+ 3│ · │ · │ 2 │ · · 2 2 │ · │ · · 3 │ · · · │ · · 2 │ 2 │ 3 │ · │
3369
+ │ └───┘ └───────────────┘ └───┐ ┌───┘ ┌───┐ │ ┌───┐ │ │ │ │
3370
+ 4│ 1 2 1 · · · 2 1 · │ 3 │ 2 · │ 3 │ 2 │ 2 │ 3 │ · │ 3 │ 2 │ 2 │
3371
+ │ ┌───────────────────────────┐ └───┘ ┌───┘ │ │ │ │ └───┘ │ │
3372
+ 5│ · │ 3 2 2 1 2 · 3 │ · · · │ · 2 │ 2 │ 3 │ · │ 1 1 · │ 2 │
3373
+ │ └───────────┐ ┌───────────┘ ┌───────┘ ┌───┘ └───┘ │ ┌───┘ │
3374
+ 6│ 1 · · · │ · │ · 2 · · │ 2 · 1 │ 3 · · · │ · 2 │ 2 2 │
3375
+ │ ┌───────────┘ └───────────────┘ ┌───┐ └───────────┐ └───────┘ ┌───┘
3376
+ 7│ · │ 3 · 2 0 1 2 1 · 1 │ 3 │ · 2 · · │ 2 · 2 1 │ ·
3377
+ │ └───┐ ┌───┐ ┌───┐ ┌───┐ │ └───────────┐ └───┐ ┌───┐ └───┐
3378
+ 8│ 2 · │ · │ · │ 2 · │ 3 │ · │ · │ · │ · 2 · · │ 1 2 │ · │ · │ 1 3 │
3379
+ └───┐ └───┘ └───┐ │ └───┘ └───┘ ┌───┐ ┌───┘ └───┘ │ ┌───┘
3380
+ 9 · │ · 1 · · │ · │ · 2 0 · 1 │ · │ 2 │ · 0 · 2 · │ 3 │ 2
3381
+ └───┐ ┌───────┘ │ ┌───┐ ┌───┐ │ │ │ ┌───────┐ └───┘
3382
+ 10 · 3 │ · │ 3 · 1 │ 3 │ · │ 3 │ · │ 2 │ · │ · │ 2 2 │ 2 3 │ · · ·
3383
+ ┌───────┘ └───────┐ └───┘ └───┘ │ │ │ └───────┘ ┌───┘ ┌───┐
3384
+ 11│ 3 · · · · │ · · 0 2 1 │ · │ · │ 2 · · 1 │ · 0 2 │ · │
3385
+ └───┐ ┌───────┐ │ ┌───┐ ┌───┐ │ │ └───┐ ┌───┐ └───┐ ┌───┘ │
3386
+ 12 · │ · │ · · │ · │ · │ 3 │ · │ 3 │ 2 │ 3 │ · · │ 2 │ · │ 1 · │ · │ · · │
3387
+ ┌───┘ │ ┌───┘ └───┘ │ │ │ └───┘ ┌───┘ │ │ ┌───┘ └───┐ │
3388
+ 13│ 2 2 │ · │ 3 0 · · │ 3 │ · │ · 2 · │ · · │ · │ 2 │ 2 · 3 │ · │
3389
+ │ ┌───┘ └───┐ ┌───┐ └───┘ └───────────┘ ┌───┘ │ │ ┌───────┘ │
3390
+ 14│ · │ 2 0 · │ · │ 3 │ · 1 · · 2 · 2 │ 2 · │ · │ · │ 2 · 2 │
3391
+ │ │ ┌───┘ │ │ ┌───────────────────┘ └───┘ │ ┌───────┘
3392
+ 15│ · │ · 1 │ 3 1 │ · │ · · │ · · 2 · 2 1 · 1 2 │ 2 │ · ·
3393
+ │ └───┐ └───┐ │ └───┐ │ ┌───────────────────┐ ┌───┘ └───────┐
3394
+ 16│ 2 · │ 2 2 │ · │ 1 3 │ · │ 2 · │ 3 1 2 · 3 │ 2 │ · 1 1 · │
3395
+ └───┐ └───┐ └───┘ ┌───┘ └───┐ └───┐ ┌───────────┘ └───────┐ ┌───┘
3396
+ 17 · │ · 2 │ · 1 · │ · · 2 │ · · │ · │ 2 · 1 0 · · │ · │ 3
3397
+ └───┐ └───┐ ┌───┘ ┌───┐ │ │ │ ┌───┐ ┌───┐ │ └───┐
3398
+ 18 · 2 │ · · │ 2 │ · 2 │ 3 │ 2 │ · 2 │ 2 │ · │ 3 │ 2 2 │ 3 │ 3 │ 1 · │
3399
+ └───┐ │ │ ┌───┘ │ └───────┘ └───┘ └───────┘ └───┘ │
3400
+ 19 0 0 · │ 3 │ 2 │ · │ · · │ · · 2 1 2 1 · · · 2 1 · │
3401
+ └───┘ └───┘ └───────────────────────────────────────────────┘
3402
+ Solutions found: 1
3403
+ status: OPTIMAL
3404
+ Time taken: 2.39 seconds
3405
+ ```
3406
+
3407
+ **Solved puzzle**
3408
+
3409
+ Applying the solution to the puzzle visually:
3410
+
3411
+ <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/slitherlink_solved.png" alt="Slitherlink solved" width="500">
3412
+
3413
+ ---
3414
+
3415
+
3416
+ ## Yin-Yang (Puzzle Type #40)
3417
+
3418
+ * [**Play online**](https://www.puzzle-yin-yang.com)
3419
+
3420
+ * [**Solver Code**][40]
3421
+
3422
+ <details>
3423
+ <summary><strong>Rules</strong></summary>
3424
+
3425
+ Yin-Yang is played on a rectangular grid with no standard size. Some cells start out filled with black or white. The rest of the cells are empty. The goal is to color all cells in such a way that:
3426
+ 1. All black cells should be connected orthogonally in a single group.
3427
+ 2. All white cells should be connected orthogonally in a single group.
3428
+ 3. 2x2 areas of the same color are not allowed.
3429
+
3430
+ </details>
3431
+
3432
+ **Unsolved puzzle**
3433
+
3434
+ <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/yin_yang_unsolved.png" alt="Yin-Yang unsolved" width="500">
3435
+
3436
+ Code to utilize this package and solve the puzzle:
3437
+
3438
+ ```python
3439
+ import numpy as np
3440
+ from puzzle_solver import yin_yang_solver as solver
3441
+ board = np.array([
3442
+ [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
3443
+ [' ', ' ', ' ', ' ', ' ', 'W', ' ', ' ', ' ', 'B', ' ', ' ', 'W', ' ', 'W', ' ', ' ', 'W', ' ', ' '],
3444
+ [' ', ' ', 'B', ' ', 'B', ' ', 'W', ' ', ' ', 'W', 'B', ' ', ' ', ' ', ' ', 'W', ' ', 'W', ' ', ' '],
3445
+ [' ', ' ', ' ', ' ', ' ', 'W', ' ', 'W', ' ', 'B', ' ', ' ', ' ', ' ', 'W', ' ', ' ', 'W', ' ', ' '],
3446
+ [' ', 'W', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'W', 'W', ' ', ' ', ' ', ' ', ' ', ' ', 'W', ' ', ' '],
3447
+ [' ', ' ', ' ', ' ', 'W', ' ', ' ', ' ', 'W', 'B', ' ', ' ', ' ', ' ', ' ', 'W', ' ', 'W', ' ', ' '],
3448
+ [' ', ' ', ' ', ' ', ' ', 'W', ' ', ' ', ' ', ' ', 'B', ' ', 'B', ' ', 'B', 'W', ' ', 'W', ' ', ' '],
3449
+ [' ', ' ', 'B', 'W', 'W', ' ', 'W', ' ', ' ', ' ', 'B', ' ', 'B', ' ', 'B', ' ', ' ', ' ', ' ', ' '],
3450
+ [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'B', ' ', 'B', ' ', 'B', ' ', 'B', ' ', 'B', ' ', 'B', ' '],
3451
+ [' ', 'W', ' ', 'W', ' ', ' ', 'W', ' ', ' ', ' ', 'B', ' ', 'B', ' ', 'B', ' ', 'B', ' ', 'B', ' '],
3452
+ [' ', ' ', ' ', ' ', 'W', 'B', ' ', ' ', ' ', 'B', ' ', ' ', 'B', ' ', 'B', ' ', 'B', ' ', 'B', ' '],
3453
+ [' ', ' ', 'B', ' ', ' ', ' ', 'B', 'B', ' ', 'W', 'B', ' ', 'B', ' ', 'B', ' ', ' ', 'B', ' ', ' '],
3454
+ [' ', 'W', 'W', 'W', ' ', 'B', ' ', 'W', ' ', ' ', 'B', ' ', 'B', ' ', 'B', ' ', ' ', ' ', 'B', ' '],
3455
+ [' ', ' ', ' ', ' ', ' ', ' ', 'W', ' ', ' ', 'B', ' ', 'B', ' ', ' ', 'B', ' ', 'B', ' ', 'B', ' '],
3456
+ [' ', 'W', ' ', 'B', 'W', 'B', ' ', 'W', ' ', ' ', ' ', ' ', 'B', 'B', ' ', ' ', 'B', ' ', 'B', ' '],
3457
+ [' ', ' ', ' ', ' ', 'W', ' ', ' ', 'B', 'B', 'B', 'B', 'B', ' ', ' ', ' ', 'B', ' ', ' ', 'B', ' '],
3458
+ [' ', 'W', ' ', ' ', ' ', 'W', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'B', ' ', 'B', ' '],
3459
+ ['W', ' ', ' ', 'W', ' ', ' ', 'B', ' ', ' ', 'B', 'B', 'B', 'B', 'B', ' ', ' ', 'B', ' ', 'B', ' '],
3460
+ [' ', 'W', 'W', ' ', 'W', ' ', ' ', 'B', ' ', ' ', ' ', ' ', ' ', ' ', 'B', ' ', 'B', ' ', 'B', ' '],
3461
+ ['B', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 'B', 'W']
3462
+ ])
3463
+ binst = solver.Board(board=board)
3464
+ solutions = binst.solve_and_print()
3465
+ ```
3466
+
3467
+ **Script Output**
3468
+
3469
+ ```python
3470
+ Solution found
3471
+ [
3472
+ [ 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'W' ],
3473
+ [ 'W', 'B', 'B', 'W', 'B', 'W', 'B', 'B', 'B', 'B', 'B', 'B', 'W', 'B', 'W', 'B', 'B', 'W', 'B', 'W' ],
3474
+ [ 'W', 'W', 'B', 'W', 'B', 'W', 'W', 'W', 'W', 'W', 'B', 'W', 'W', 'B', 'W', 'W', 'B', 'W', 'B', 'W' ],
3475
+ [ 'W', 'B', 'B', 'B', 'B', 'W', 'B', 'W', 'B', 'B', 'B', 'B', 'B', 'B', 'W', 'B', 'B', 'W', 'B', 'W' ],
3476
+ [ 'W', 'W', 'W', 'B', 'W', 'W', 'B', 'W', 'W', 'W', 'W', 'W', 'B', 'W', 'W', 'W', 'B', 'W', 'B', 'W' ],
3477
+ [ 'W', 'B', 'W', 'B', 'W', 'B', 'B', 'B', 'W', 'B', 'B', 'W', 'B', 'W', 'B', 'W', 'B', 'W', 'B', 'W' ],
3478
+ [ 'W', 'B', 'B', 'B', 'W', 'W', 'W', 'B', 'W', 'W', 'B', 'W', 'B', 'W', 'B', 'W', 'B', 'W', 'B', 'W' ],
3479
+ [ 'W', 'W', 'B', 'W', 'W', 'B', 'W', 'B', 'B', 'W', 'B', 'W', 'B', 'W', 'B', 'W', 'B', 'W', 'B', 'W' ],
3480
+ [ 'W', 'B', 'B', 'B', 'B', 'B', 'W', 'W', 'B', 'W', 'B', 'W', 'B', 'W', 'B', 'W', 'B', 'W', 'B', 'W' ],
3481
+ [ 'W', 'W', 'W', 'W', 'W', 'B', 'W', 'B', 'B', 'W', 'B', 'W', 'B', 'W', 'B', 'W', 'B', 'W', 'B', 'W' ],
3482
+ [ 'W', 'B', 'W', 'B', 'W', 'B', 'W', 'W', 'B', 'B', 'B', 'W', 'B', 'W', 'B', 'W', 'B', 'W', 'B', 'W' ],
3483
+ [ 'W', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'W', 'B', 'W', 'B', 'W', 'B', 'W', 'B', 'B', 'B', 'W' ],
3484
+ [ 'W', 'W', 'W', 'W', 'W', 'B', 'W', 'W', 'W', 'W', 'B', 'W', 'B', 'W', 'B', 'W', 'W', 'W', 'B', 'W' ],
3485
+ [ 'W', 'B', 'B', 'B', 'B', 'B', 'W', 'B', 'B', 'B', 'B', 'B', 'B', 'W', 'B', 'W', 'B', 'W', 'B', 'W' ],
3486
+ [ 'W', 'W', 'W', 'B', 'W', 'B', 'W', 'W', 'W', 'W', 'W', 'W', 'B', 'B', 'B', 'W', 'B', 'W', 'B', 'W' ],
3487
+ [ 'W', 'B', 'B', 'B', 'W', 'B', 'W', 'B', 'B', 'B', 'B', 'B', 'B', 'W', 'B', 'B', 'B', 'W', 'B', 'W' ],
3488
+ [ 'W', 'W', 'B', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'B', 'W', 'B', 'W' ],
3489
+ [ 'W', 'B', 'B', 'W', 'B', 'B', 'B', 'B', 'W', 'B', 'B', 'B', 'B', 'B', 'B', 'W', 'B', 'W', 'B', 'W' ],
3490
+ [ 'W', 'W', 'W', 'W', 'W', 'W', 'W', 'B', 'W', 'W', 'W', 'W', 'W', 'W', 'B', 'W', 'B', 'W', 'B', 'W' ],
3491
+ [ 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'W' ],
3492
+ ]
3493
+ Solutions found: 1
3494
+ status: OPTIMAL
3495
+ Time taken: 3.10 seconds
3496
+ ```
3497
+
3498
+ **Solved puzzle**
3499
+
3500
+ Applying the solution to the puzzle visually:
3501
+
3502
+ <img src="https://raw.githubusercontent.com/Ar-Kareem/puzzle_solver/master/images/yin_yang_solved.png" alt="Yin-Yang solved" width="500">
3503
+
3504
+ ---
3505
+
3173
3506
  ---
3174
3507
 
3175
3508
  ## Why SAT / CP-SAT?
@@ -3258,3 +3591,6 @@ Issues and PRs welcome!
3258
3591
  [35]: https://github.com/Ar-Kareem/puzzle_solver/tree/master/src/puzzle_solver/puzzles/galaxies "puzzle_solver/src/puzzle_solver/puzzles/galaxies at master · Ar-Kareem/puzzle_solver · GitHub"
3259
3592
  [36]: https://github.com/Ar-Kareem/puzzle_solver/tree/master/src/puzzle_solver/puzzles/slant "puzzle_solver/src/puzzle_solver/puzzles/slant at master · Ar-Kareem/puzzle_solver · GitHub"
3260
3593
  [37]: https://github.com/Ar-Kareem/puzzle_solver/tree/master/src/puzzle_solver/puzzles/unequal "puzzle_solver/src/puzzle_solver/puzzles/unequal at master · Ar-Kareem/puzzle_solver · GitHub"
3594
+ [38]: https://github.com/Ar-Kareem/puzzle_solver/tree/master/src/puzzle_solver/puzzles/norinori "puzzle_solver/src/puzzle_solver/puzzles/norinori at master · Ar-Kareem/puzzle_solver · GitHub"
3595
+ [39]: https://github.com/Ar-Kareem/puzzle_solver/tree/master/src/puzzle_solver/puzzles/slitherlink "puzzle_solver/src/puzzle_solver/puzzles/slitherlink at master · Ar-Kareem/puzzle_solver · GitHub"
3596
+ [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"
@@ -1,4 +1,4 @@
1
- puzzle_solver/__init__.py,sha256=nqXtO2JuY0r7gNM1HwP_5apXmLX7OeriApzXNaJZjDA,2704
1
+ puzzle_solver/__init__.py,sha256=H7Tpw9yF9TDqwck6bXv1jiS9TGtO5nsVwcDd0Fp1Xyg,2926
2
2
  puzzle_solver/core/utils.py,sha256=_LA81kHrsgvqPvq7RISBeaurXmYMKAU9N6qmV8n0G7s,8063
3
3
  puzzle_solver/core/utils_ortools.py,sha256=2xEL9cMEKmNhRD9lhr2nGdZ3Lbmc9cnHY8xv6iLhUr0,10542
4
4
  puzzle_solver/puzzles/aquarium/aquarium.py,sha256=BUfkAS2d9eG3TdMoe1cOGGeNYgKUebRvn-z9nsC9gvE,5708
@@ -26,18 +26,19 @@ puzzle_solver/puzzles/map/map.py,sha256=sxc57tapB8Tsgam-yoDitln1o-EB_SbIYvO6WEYy
26
26
  puzzle_solver/puzzles/minesweeper/minesweeper.py,sha256=LiQVOGkWCsc1WtX8CdPgL_WwAcaeUFuoi5_eqH8U2Og,5876
27
27
  puzzle_solver/puzzles/mosaic/mosaic.py,sha256=QX_nVpVKQg8OfaUcqFk9tKqsDyVqvZc6-XWvfI3YcSw,2175
28
28
  puzzle_solver/puzzles/nonograms/nonograms.py,sha256=1jmDTOCnmivmBlwtMDyyk3TVqH5IjapzLn7zLQ4qubk,6056
29
- puzzle_solver/puzzles/norinori/norinori.py,sha256=Z2c0iEn7a6S6gaaJlvNMNNbAQwpztNLB0LTH_XVgu74,12269
29
+ puzzle_solver/puzzles/norinori/norinori.py,sha256=uC8vXAw35xsTmpmTeKqYW7tbcssms9LCcXFBONtV2Ng,4743
30
30
  puzzle_solver/puzzles/pearl/pearl.py,sha256=OhzpMYpxqvR3GCd5NH4ETT0NO4X753kRi6p5omYLChM,6798
31
31
  puzzle_solver/puzzles/range/range.py,sha256=rruvD5ZSaOgvQuX6uGV_Dkr82nSiWZ5kDz03_j7Tt24,4425
32
32
  puzzle_solver/puzzles/signpost/signpost.py,sha256=-0_S6ycwzwlUf9-ZhP127Rgo5gMBOHiTM6t08dLLDac,3869
33
33
  puzzle_solver/puzzles/singles/singles.py,sha256=3wACiUa1Vmh2ce6szQ2hPjyBuH7aHiQ888p4R2jFkW4,3342
34
34
  puzzle_solver/puzzles/slant/slant.py,sha256=xF-N4PuXYfx638NP1f1mi6YncIZB4mLtXtdS79XyPbg,6122
35
35
  puzzle_solver/puzzles/slant/parse_map/parse_map.py,sha256=dxnALSDXe9wU0uSD0QEXnzoh1q801mj1ePTNLtG0n60,4796
36
+ puzzle_solver/puzzles/slitherlink/slitherlink.py,sha256=jw-Buwzo_eZADL45zD5-Hs8HaT3AU4dZn6eifCUPnhA,11701
36
37
  puzzle_solver/puzzles/star_battle/star_battle.py,sha256=IX6w4H3sifN01kPPtrAVRCK0Nl_xlXXSHvJKw8K1EuE,3718
37
38
  puzzle_solver/puzzles/star_battle/star_battle_shapeless.py,sha256=lj05V0Y3A3NjMo1boMkPIwBhMtm6SWydjgAMeCf5EIo,225
38
39
  puzzle_solver/puzzles/stitches/stitches.py,sha256=iK8t02q43gH3FPbuIDn4dK0sbaOgZOnw8yHNRNvNuIU,6534
39
- puzzle_solver/puzzles/stitches/parse_map/parse_map.py,sha256=dbd7DoqjR4qkMQAeD_lPpuLB_KCFCIHfDauTbjB3W80,8880
40
- puzzle_solver/puzzles/sudoku/sudoku.py,sha256=M_pry7XyKKzlfCF5rFi02lyOrj5GWZzXnDAxmD3NXvI,3588
40
+ puzzle_solver/puzzles/stitches/parse_map/parse_map.py,sha256=1LNJkIqpcz1LvY0H0uRedABQWm44dgNf9XeQuKm36WM,10275
41
+ puzzle_solver/puzzles/sudoku/sudoku.py,sha256=SE4TM_gic6Jj0fkDR_NzUJdX2XKyQ8eeOnVAQ011Xbo,8870
41
42
  puzzle_solver/puzzles/tents/tents.py,sha256=iyVK2WXfIT5j_9qqlQg0WmwvixwXlZSsHGK3XA-KpII,6283
42
43
  puzzle_solver/puzzles/thermometers/thermometers.py,sha256=nsvJZkm7G8FALT27bpaB0lv5E_AWawqmvapQI8QcYXw,4015
43
44
  puzzle_solver/puzzles/towers/towers.py,sha256=QvL0Pp-Z2ewCeq9ZkNrh8MShKOh-Y52sFBSudve68wk,6496
@@ -45,8 +46,10 @@ puzzle_solver/puzzles/tracks/tracks.py,sha256=98xds9SKNqtOLFTRUX_KSMC7XYmZo567LO
45
46
  puzzle_solver/puzzles/undead/undead.py,sha256=IrCUfzQFBem658P5KKqldG7vd2TugTHehcwseCarerM,6604
46
47
  puzzle_solver/puzzles/unequal/unequal.py,sha256=ExY2XDCrqROCDpRLfHo8uVr1zuli1QvbCdNCiDhlCac,6978
47
48
  puzzle_solver/puzzles/unruly/unruly.py,sha256=sDF0oKT50G-NshyW2DYrvAgD9q9Ku9ANUyNhGSAu7cQ,3827
49
+ puzzle_solver/puzzles/yin_yang/yin_yang.py,sha256=WrRdNhmKhIARdGOt_36gpRxRzrfLGv3wl7igBpPFM64,5259
50
+ puzzle_solver/puzzles/yin_yang/parse_map/parse_map.py,sha256=l4b6eO30kspmiP20b60WbvxEEKNKgLQU1SgwDNhhLOA,6459
48
51
  puzzle_solver/utils/visualizer.py,sha256=tsX1yEKwmwXBYuBJpx_oZGe2UUt1g5yV73G3UbtmvtE,6817
49
- multi_puzzle_solver-0.9.18.dist-info/METADATA,sha256=q9i19rwenN_tEUfhsP8ayNEVfeKcRTm4xK4AmWyzw9M,163560
50
- multi_puzzle_solver-0.9.18.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
51
- multi_puzzle_solver-0.9.18.dist-info/top_level.txt,sha256=exwVUQa-anK9vYrpKzBPvH8bX43iElWI4VeNiAyBGJY,14
52
- multi_puzzle_solver-0.9.18.dist-info/RECORD,,
52
+ multi_puzzle_solver-0.9.22.dist-info/METADATA,sha256=X8hwi1PYI_Yka0rUuxUy5vck0_lSHt-Gwy0m1w8tS_k,187121
53
+ multi_puzzle_solver-0.9.22.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
54
+ multi_puzzle_solver-0.9.22.dist-info/top_level.txt,sha256=exwVUQa-anK9vYrpKzBPvH8bX43iElWI4VeNiAyBGJY,14
55
+ multi_puzzle_solver-0.9.22.dist-info/RECORD,,
puzzle_solver/__init__.py CHANGED
@@ -18,12 +18,14 @@ from puzzle_solver.puzzles.map import map as map_solver
18
18
  from puzzle_solver.puzzles.minesweeper import minesweeper as minesweeper_solver
19
19
  from puzzle_solver.puzzles.mosaic import mosaic as mosaic_solver
20
20
  from puzzle_solver.puzzles.nonograms import nonograms as nonograms_solver
21
+ from puzzle_solver.puzzles.norinori import norinori as norinori_solver
21
22
  from puzzle_solver.puzzles.lits import lits as lits_solver
22
23
  from puzzle_solver.puzzles.pearl import pearl as pearl_solver
23
24
  from puzzle_solver.puzzles.range import range as range_solver
24
25
  from puzzle_solver.puzzles.signpost import signpost as signpost_solver
25
26
  from puzzle_solver.puzzles.singles import singles as singles_solver
26
27
  from puzzle_solver.puzzles.slant import slant as slant_solver
28
+ from puzzle_solver.puzzles.slitherlink import slitherlink as slitherlink_solver
27
29
  from puzzle_solver.puzzles.star_battle import star_battle as star_battle_solver
28
30
  from puzzle_solver.puzzles.star_battle import star_battle_shapeless as star_battle_shapeless_solver
29
31
  from puzzle_solver.puzzles.stitches import stitches as stitches_solver
@@ -35,7 +37,8 @@ from puzzle_solver.puzzles.tracks import tracks as tracks_solver
35
37
  from puzzle_solver.puzzles.undead import undead as undead_solver
36
38
  from puzzle_solver.puzzles.unequal import unequal as unequal_solver
37
39
  from puzzle_solver.puzzles.unruly import unruly as unruly_solver
40
+ from puzzle_solver.puzzles.yin_yang import yin_yang as yin_yang_solver
38
41
 
39
42
  from puzzle_solver.puzzles.inertia.parse_map.parse_map import main as inertia_image_parser
40
43
 
41
- __version__ = '0.9.18'
44
+ __version__ = '0.9.22'