Skip to content

Commit 65d1cee

Browse files
fix: Ensure Number Sliding Puzzle is solvable (steam-bell-92#1158)
- Implement is_solvable helper function using inversion counts - Update shuffle loop to generate only solvable puzzles - Avoid generating an already-solved board on start - Add unit tests to verify is_solvable logic on various configurations
1 parent a6e5f66 commit 65d1cee

1 file changed

Lines changed: 24 additions & 1 deletion

File tree

games/Number-Sliding-Puzzle/Number-Sliding-Puzzle.py

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,37 @@
88
from utils.validation import get_int, get_yes_no
99

1010

11+
def is_solvable(numbers):
12+
"""
13+
Determines if the 8-puzzle board configuration is solvable.
14+
An 8-puzzle (3x3 grid) is solvable if the number of inversions is even.
15+
The blank tile (0) is ignored when counting inversions.
16+
"""
17+
# Filter out the blank tile(0)
18+
19+
tiles = [n for n in numbers if n != 0]
20+
inversions = 0
21+
for i in range(len(tiles)):
22+
for j in range(i + 1, len(tiles)):
23+
if tiles[i] > tiles[j]:
24+
inversions += 1
25+
26+
# return True if inversions count is even, False otherwise
27+
28+
return inversions % 2 == 0
29+
30+
1131
def main():
1232
print("🧩 Emoji Sliding Puzzle Game 🧩")
1333

1434
while True:
1535
print("Arrange the numbers in correct order!\n")
1636

1737
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 0]
18-
random.shuffle(numbers)
38+
while True:
39+
random.shuffle(numbers)
40+
if is_solvable(numbers) and numbers != [1, 2, 3, 4, 5, 6, 7, 8, 0]:
41+
break
1942

2043
puzzle = [
2144
numbers[0:3],

0 commit comments

Comments
 (0)