Skip to content

Commit b64781e

Browse files
authored
Merge pull request #47 from SmilingWayne/basic-dev
v0.3.2 update
2 parents 0343cd0 + 0016acd commit b64781e

25 files changed

+2740
-419
lines changed

README.CN.md

Lines changed: 0 additions & 12 deletions
This file was deleted.

README.md

Lines changed: 187 additions & 153 deletions
Large diffs are not rendered by default.

mkdocs.yml

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ nav:
2323
- cave: puzzles/cave.md
2424
- clueless_1_sudoku: puzzles/clueless_1_sudoku.md
2525
- clueless_2_sudoku: puzzles/clueless_2_sudoku.md
26+
- cojun: puzzles/cojun.md
2627
- country_road: puzzles/country_road.md
2728
- creek: puzzles/creek.md
2829
- detour: puzzles/detour.md
@@ -37,6 +38,7 @@ nav:
3738
- fuzuli: puzzles/fuzuli.md
3839
- gappy: puzzles/gappy.md
3940
- gattai_8_sudoku: puzzles/gattai_8_sudoku.md
41+
- geradeweg: puzzles/geradeweg.md
4042
- grand_tour: puzzles/grand_tour.md
4143
- hakoiri: puzzles/hakoiri.md
4244
- hakyuu: puzzles/hakyuu.md
@@ -66,24 +68,30 @@ nav:
6668
- moon_sun: puzzles/moon_sun.md
6769
- mosaic: puzzles/mosaic.md
6870
- munraito: puzzles/munraito.md
71+
- nanro: puzzles/nanro.md
6972
- nawabari: puzzles/nawabari.md
7073
- nondango: puzzles/nondango.md
7174
- nonogram: puzzles/nonogram.md
7275
- norinori: puzzles/norinori.md
7376
- number_cross: puzzles/number_cross.md
77+
- nurikabe: puzzles/nurikabe.md
7478
- nurimisaki: puzzles/nurimisaki.md
7579
- one_to_x: puzzles/one_to_x.md
7680
- paint_area: puzzles/paint_area.md
7781
- patchwork: puzzles/patchwork.md
7882
- pfeilzahlen: puzzles/pfeilzahlen.md
7983
- pills: puzzles/pills.md
84+
- pipes: puzzles/pipes.md
8085
- putteria: puzzles/putteria.md
8186
- regional_yajilin: puzzles/regional_yajilin.md
8287
- renban: puzzles/renban.md
8388
- samurai_sudoku: puzzles/samurai_sudoku.md
8489
- shikaku: puzzles/shikaku.md
90+
- shimaguni: puzzles/shimaguni.md
8591
- shingoki: puzzles/shingoki.md
92+
- shirokuro: puzzles/shirokuro.md
8693
- shogun_sudoku: puzzles/shogun_sudoku.md
94+
- shugaku: puzzles/shugaku.md
8795
- simple_loop: puzzles/simple_loop.md
8896
- skyscraper: puzzles/skyscraper.md
8997
- slitherlink: puzzles/slitherlink.md
@@ -97,12 +105,14 @@ nav:
97105
- sudoku: puzzles/sudoku.md
98106
- suguru: puzzles/suguru.md
99107
- sumo_sudoku: puzzles/sumo_sudoku.md
108+
- tatamibari: puzzles/tatamibari.md
100109
- tenner_grid: puzzles/tenner_grid.md
101110
- tent: puzzles/tent.md
102111
- terra_x: puzzles/terra_x.md
103112
- thermometer: puzzles/thermometer.md
104113
- tile_paint: puzzles/tile_paint.md
105114
- trinairo: puzzles/trinairo.md
115+
- usoone: puzzles/usoone.md
106116
- windmill_sudoku: puzzles/windmill_sudoku.md
107117
- yajikabe: puzzles/yajikabe.md
108118
- yajilin: puzzles/yajilin.md
@@ -134,7 +144,6 @@ theme:
134144
- navigation.top
135145
- navigation.indexes
136146

137-
138147
markdown_extensions:
139148
- admonition
140149
- meta
@@ -166,5 +175,4 @@ markdown_extensions:
166175
- pymdownx.snippets
167176
- pymdownx.emoji:
168177
emoji_index: !!python/name:material.extensions.emoji.twemoji
169-
emoji_generator:
170-
!!python/name:material.extensions.emoji.to_svg
178+
emoji_generator: !!python/name:material.extensions.emoji.to_svg

pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "puzzlekit"
7-
version = "0.3.1"
8-
description = "A comprehensive logic puzzle solver (90+) based on Google OR-Tools. e.g., solvers for Nonogram, Slitherlink, Akari, Yajilin, Hitori and Sudoku-variants."
7+
version = "0.3.2"
8+
description = "A comprehensive logic puzzle solver (100+) based on Google OR-Tools. e.g., solvers for Nonogram, Slitherlink, Akari, Yajilin, Hitori and Sudoku-variants."
99
readme = "README.md"
1010
requires-python = ">=3.10"
1111
authors = [{name = "SmilingWayne", email = "xiaoxiaowayne@gmail.com"}]

scripts/benchmark.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,12 +133,19 @@ def parse_args():
133133
group.add_argument("-p", "--puzzle", type=str,
134134
help="Specific puzzle name to benchmark (e.g. 'Akari', 'slitherlink'). Case-insensitive.")
135135

136+
parser.add_argument("--skip", type=str, default="",
137+
help="Comma-separated list of puzzle names to skip (e.g., 'Nurikabe,Fillomino').")
136138
return parser.parse_args()
137139

138140
def main():
139141
import time
140142
tic = time.perf_counter()
141143
args = parse_args()
144+
# Support skip func
145+
skip_set = set()
146+
if args.skip:
147+
skip_set = {name.strip() for name in args.skip.split(',') if name.strip()}
148+
print(f"NOTE: Will skip the following puzzles: {', '.join(skip_set)}")
142149

143150
# Default behavior: run all if no arguments specified
144151
target_puzzle = args.puzzle
@@ -216,7 +223,17 @@ def main():
216223
# Check solver availability
217224
solver_status = "❌"
218225
has_solver_impl = False
219-
if puzzle_type:
226+
# if puzzle_type:
227+
# try:
228+
# get_solver_class(puzzle_type)
229+
# has_solver_impl = True
230+
# solver_status = "✅"
231+
# except (ValueError, AttributeError):
232+
# pass
233+
if folder_name in skip_set:
234+
print(f"[{idx}/{len(sorted_assets)}] Skipping {folder_name} (Requested by user --skip)")
235+
236+
elif puzzle_type:
220237
try:
221238
get_solver_class(puzzle_type)
222239
has_solver_impl = True

scripts/quick_start.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,21 @@
44
# Raw input data
55
start_time = time.time()
66
problem_str = """
7-
10 10\n- - - - - 3sx - - - -\n- - - o - - - 3so - -\n- x - - - - - - - -\n- - - - 2eo - - - o -\n1nx - - - - - 1wo - - -\n- - - 1so - - - - - 2nx\n- x - - - 1sx - - - -\n- - - - - - - - o -\n- - 3nx - - - x - - -\n- - - - 2ex - - - - -
7+
10 10
8+
- - - - - b - - - -
9+
- b - - w - - b - -
10+
w - - - - - - - - -
11+
- - - - - - - - w -
12+
- - - - - b b - b -
13+
- w - w w - - - - -
14+
- w - - - - - - - -
15+
- - - - - - - - - b
16+
- - b - - b - - w -
17+
- - - - w - - - - -
818
"""
919

1020
# Solve
11-
res = puzzlekit.solve(problem_str, puzzle_type="castle_wall")
21+
res = puzzlekit.solve(problem_str, puzzle_type="masyu")
1222

1323
# Print solution grid
1424
print(res.solution_data.get('solution_grid', []))
@@ -17,4 +27,4 @@
1727
end_time = time.time()
1828
print(f"Time taken: {end_time - start_time} seconds")
1929
# Visualize (optional)
20-
res.show()
30+
res.show()

src/puzzlekit/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,4 +72,4 @@ def solver(puzzle_type: str, data: Dict[str, Any] = None, **kwargs) -> Any:
7272
return SolverClass(**init_params)
7373

7474
__all__ = ["solve", "solver"]
75-
__version__ = '0.3.1'
75+
__version__ = '0.3.2'

src/puzzlekit/core/solver.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,6 @@ def solve(self) -> dict:
209209
# If _check_and_add_cuts returns True, it means the current solution does not satisfy the connectivity constraint,
210210
# and new constraints have been added. We need to continue solving.
211211
cuts_added = self._check_and_add_cuts()
212-
213212
if not cuts_added:
214213
# No new cuts added -> All constraints satisfied -> Found final solution.
215214
final_status_str = "Optimal" if status == pywraplp.Solver.OPTIMAL else "Feasible"

src/puzzlekit/parsers/registry.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,16 @@
118118
"nurimisaki": standard_grid_parser,
119119
"aqre": standard_region_grid_parser,
120120
"canal_view": standard_grid_parser,
121+
"nurikabe": standard_grid_parser,
122+
"cojun": standard_region_grid_parser,
123+
"shugaku": standard_grid_parser,
124+
"geradeweg": standard_grid_parser,
125+
"nanro": standard_region_grid_parser,
126+
"shimaguni": standard_region_grid_parser,
127+
"usoone": standard_region_grid_parser,
128+
"tatamibari": standard_grid_parser,
129+
"shirokuro": standard_grid_parser,
130+
"pipes": standard_grid_parser,
121131
}
122132

123133

src/puzzlekit/solvers/__init__.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,16 @@
9797
from .nurimisaki import NurimisakiSolver
9898
from .aqre import AqreSolver
9999
from .canal_view import CanalViewSolver
100+
from .nurikabe import NurikabeSolver
101+
from .cojun import CojunSolver
102+
from .shugaku import ShugakuSolver
103+
from .geradeweg import GeradewegSolver
104+
from .nanro import NanroSolver
105+
from .shimaguni import ShimaguniSolver
106+
from .usoone import UsooneSolver
107+
from .tatamibari import TatamibariSolver
108+
from .shirokuro import ShirokuroSolver
109+
from .pipes import PipesSolver
100110
# ==========================================
101111
# Core: Mapping of puzzle type to solver class
102112
# ==========================================
@@ -202,6 +212,18 @@
202212
"nurimisaki": ("nurimisaki", "NurimisakiSolver"),
203213
"aqre": ("aqre", "AqreSolver"),
204214
"canal_view": ("canal_view", "CanalViewSolver"),
215+
"nurikabe": ("nurikabe", "NurikabeSolver"),
216+
"cojun": ("cojun", "CojunSolver"),
217+
"shugaku": ("shugaku", "ShugakuSolver"),
218+
"geradeweg": ("geradeweg", "GeradewegSolver"),
219+
"nanro": ("nanro", "NanroSolver"),
220+
"shimaguni": ("shimaguni", "ShimaguniSolver"),
221+
"usoone": ("usoone", "UsooneSolver"),
222+
"tatamibari": ("tatamibari", "TatamibariSolver"),
223+
"shirokuro": ("shirokuro", "ShirokuroSolver"),
224+
"pipes": ("pipes", "PipesSolver"),
225+
226+
205227
}
206228
# ==========================================
207229

0 commit comments

Comments
 (0)