跳转到主要内容

Python中的一个简单、基础的数独类。适合编程教程或实验。

项目描述

Python中的一个简单、基础的数独类。适合编程教程或实验。

basicsudoku模块仅提供9x9数独板的数据结构,以及一个基本的求解器。此模块可用于

安装

pip install basicsudoku

入门指南

>>> import basicsudoku
>>> board = basicsudoku.SudokuBoard() # Get a blank board.
>>> print(board)
>>> print(board)
. . . | . . . | . . .
. . . | . . . | . . .
. . . | . . . | . . .
------+-------+------
. . . | . . . | . . .
. . . | . . . | . . .
. . . | . . . | . . .
------+-------+------
. . . | . . . | . . .
. . . | . . . | . . .
. . . | . . . | . . .
>>> board[0, 0] = 1
>>> board[1, 0] = '2'
>>> board[8, 8] = 3
>>> print(board)
1 2 . | . . . | . . .
. . . | . . . | . . .
. . . | . . . | . . .
------+-------+------
. . . | . . . | . . .
. . . | . . . | . . .
. . . | . . . | . . .
------+-------+------
. . . | . . . | . . .
. . . | . . . | . . .
. . . | . . . | . . 3
>>> board.symbols
'12..............................................................................3'
>>> board.symbols = '2...8.3...6..7..84.3.5..2.9...1.54.8.........4.27.6...3.1..7.4.72..4..6...4.1...3'
>>> print(board)
2 . . | . 8 . | 3 . .
. 6 . | . 7 . | . 8 4
. 3 . | 5 . . | 2 . 9
------+-------+------
. . . | 1 . 5 | 4 . 8
. . . | . . . | . . .
4 . 2 | 7 . 6 | . . .
------+-------+------
3 . 1 | . . 7 | . 4 .
7 2 . | . 4 . | . 6 .
. . 4 | . 1 . | . . 3
>>> solver = basicsudoku.BasicSolver(board)
>>> print(board)
2 4 5 | 9 8 1 | 3 7 6
1 6 9 | 2 7 3 | 5 8 4
8 3 7 | 5 6 4 | 2 1 9
------+-------+------
9 7 6 | 1 2 5 | 4 3 8
5 1 3 | 4 9 8 | 6 2 7
4 8 2 | 7 3 6 | 9 5 1
------+-------+------
3 9 1 | 6 5 7 | 8 4 2
7 2 8 | 3 4 9 | 1 6 5
6 5 4 | 8 1 2 | 7 9 3
>>> board2 = basicsudoku.SudokuBoard(symbols='2...8.3...6..7..84.3.5..2.9...1.54.8.........4.27.6...3.1..7.4.72..4..6...4.1...3')
>>> print(board2)
2 . . | . 8 . | 3 . .
. 6 . | . 7 . | . 8 4
. 3 . | 5 . . | 2 . 9
------+-------+------
. . . | 1 . 5 | 4 . 8
. . . | . . . | . . .
4 . 2 | 7 . 6 | . . .
------+-------+------
3 . 1 | . . 7 | . 4 .
7 2 . | . 4 . | . 6 .
. . 4 | . 1 . | . . 3

定义

  • board - 由81个空间组成的完整的9x9板。

  • space - 板上可以放置符号的81个位置之一。

  • symbol - 放在板上的1到9的数字。空间也可以为空。

  • length - 板的长度(高度或宽度),在标准数独中为9。

  • unit - 来自行、列或盒子的9个符号的集合。

  • box - 板上九个3x3子网格之一。

  • column - 板上的九个垂直空间。

  • row - 板上的九个水平空间。

  • given - 在谜题开始时放在板上的符号。

  • peer - 与指定空间相同的行、列或盒中的空间。

API

basicsudoku模块旨在易于学习。所有方法都有描述性文档字符串,代码有良好的注释。

创建数独板

创建一个空数独板

>>> board = basicsudoku.SudokuBoard()

预填充符号的板

>>> board = basicsudoku.SudokuBoard(symbols='2...8.3...6..7..84.3.5..2.9...1.54.8.........4.27.6...3.1..7.4.72..4..6...4.1...3')

禁用严格模式(严格模式会在你将无效符号放在棋盘上时引发异常。)

>>> board = basicsudoku.SudokuBoard(strict=False)

或者

>>> board = basicsudoku.SudokuBoard()
>>> board.strict = False

设置和获取符号

您可以将1到9的整数或字符串分配给一个xy元组索引

>>> board = basicsudoku.SudokuBoard()
>>> board[0, 0] = '1'
>>> board[0, 0]
'1'
>>> board[1, 0] = 2
>>> board[1, 0]
'2'

您可以使用 symbols 属性一次性获取或设置所有符号

>>> board = basicsudoku.SudokuBoard()
>>> board.symbols = '4.....8.5.3..........7......2.....6.....8.4......1.......6.3.7.5..2.....1.4......'
>>> print(board)
4 . . | . . . | 8 . 5
. 3 . | . . . | . . .
. . . | 7 . . | . . .
------+-------+------
. 2 . | . . . | . 6 .
. . . | . 8 . | 4 . .
. . . | . 1 . | . . .
------+-------+------
. . . | 6 . 3 | . 7 .
5 . . | 2 . . | . . .
1 . 4 | . . . | . . .

您还可以使用这些方法从行、列或方块中获取一个单元(9个符号)

>>> board = basicsudoku.SudokuBoard(symbols='4.....8.5.3..........7......2.....6.....8.4......1.......6.3.7.5..2.....1.4......')
>>> print(board)
4 . . | . . . | 8 . 5
. 3 . | . . . | . . .
. . . | 7 . . | . . .
------+-------+------
. 2 . | . . . | . 6 .
. . . | . 8 . | 4 . .
. . . | . 1 . | . . .
------+-------+------
. . . | 6 . 3 | . 7 .
5 . . | 2 . . | . . .
1 . 4 | . . . | . . .
>>> board.get_row(0)
['4', '.', '.', '.', '.', '.', '8', '.', '5']
>>> board.get_row(1)
['.', '3', '.', '.', '.', '.', '.', '.', '.']
>>> board.get_column(0)
['4', '.', '.', '.', '.', '.', '.', '5', '1']
>>> board.get_box(0, 0)
['4', '.', '.', '.', '3', '.', '.', '.', '.']
>>> board.get_box(1, 0)
['.', '.', '.', '.', '.', '.', '7', '.', '.']

验证检查

默认情况下,SudokuBoard 对象处于 严格模式,这意味着任何使棋盘 无效(即在相同的行、列或方块中有重复符号)的符号都会引发 SudokuBoardException。您可以在构造方法调用中设置关键字参数 strict=False 来禁用此功能。还有几个验证检查方法

  • is_valid_symbol(self, symbol) - 如果符号是介于1和9之间的str或为EMPTY_SPACE,则返回True。

  • is_complete_unit(self, unit) - 如果单元是所有9个符号的str且没有重复,则返回True。

  • is_valid_unit(self, unit) - 如果单元是9个符号的str,可以包含EMPTY_SPACE但没有重复符号,则返回True。

  • is_valid_board(self) - 如果棋盘处于有效状态(即使不完整),则返回True;否则,如果棋盘的行、列或方块中有重复符号,则返回False。

  • is_full(self) - 如果棋盘上没有空格,则返回True。

  • is_solved(self) - 如果棋盘当前已解决,则返回True。

迭代器

您可以从左上角开始迭代棋盘上的符号,然后向右,然后向下。例如

>>> board = basicsudoku.SudokuBoard(symbols='4.....8.5.3..........7......2.....6.....8.4......1.......6.3.7.5..2.....1.4......')
>>> for symbol in board:
...     print(symbol, end=' ')
...
4 . . . . . 8 . 5 . 3 . . . . . . . . . . 7 . . . . . . 2 . . . . . 6 . . . . . 8 . 4 . . . . . . 1 . . . . . . . 6 . 3 . 7 . 5 . . 2 . . . . . 1 . 4 . . . . . .

解决数独谜题

BasicSolver 类被传递一个 SudokuBoard 对象并立即解决它。

>>> board = SudokuBoard(symbols='4.....8.5.3..........7......2.....6.....8.4......1.......6.3.7.5..2.....1.4......')
>>> print(board)
4 . . | . . . | 8 . 5
. 3 . | . . . | . . .
. . . | 7 . . | . . .
------+-------+------
. 2 . | . . . | . 6 .
. . . | . 8 . | 4 . .
. . . | . 1 . | . . .
------+-------+------
. . . | 6 . 3 | . 7 .
5 . . | 2 . . | . . .
1 . 4 | . . . | . . .
>>> solver = BasicSolver(board)
>>> print(board)
4 1 7 | 3 6 9 | 8 2 5
6 3 2 | 1 5 8 | 9 4 7
9 5 8 | 7 2 4 | 3 1 6
------+-------+------
8 2 5 | 4 3 7 | 1 6 9
7 9 1 | 5 8 6 | 4 3 2
3 4 6 | 9 1 2 | 7 5 8
------+-------+------
2 8 9 | 6 4 3 | 5 7 1
5 7 3 | 2 9 1 | 6 8 4
1 6 4 | 8 7 5 | 2 9 3

包含的数独谜题

Peter Norvig的数独页面上提供的谜题已包含在内。 basicsudoku.easy50 列表包含50个简单谜题,basicsudoku.top95 列表包含95个谜题,basicsudoku.hardest 包含11个非常困难的谜题。将这些列表中的81个字符字符串传递给 SudokuBoard 构造函数中的 symbols 关键字参数,以将其加载到棋盘上。

单元测试

该模块在 tests/test_basic.py 文件中有pytest单元测试,以及在主模块的文档字符串中的doctests。您还可以使用 coverage.py 工具运行模块,最新的报告在 htmlcov/index.html 文件中。

路线图

未来我计划添加一个谜题生成器,具有可变难度设置。我还希望求解器能够检测棋盘是否有多个解。

basicsudoku 是为了可读性而编写的,而不是为了性能。在许多地方可以改进性能,特别是在求解器中。没有计划提高性能。本模块是一个学习工具,而不是一个高效的数独求解器(其中已经有很多)。

项目详情


下载文件

下载适合您平台的文件。如果您不确定要选择哪个,请了解更多关于 安装包 的信息。

源分布

basicsudoku-0.1.2.tar.gz (23.4 kB 查看哈希)

上传时间

由以下组织支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面