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的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | e5b01183c1e8c203ba6a7c9a356e78e3957e1fba26ed8fad34cceccabefc8200 |
|
MD5 | 7bd9b76bbb4323cc1c43a6e7e8ead50b |
|
BLAKE2b-256 | 3c9a5e070969ede69c29dbb8f5dfec6cd96792e799b918d7d409069d21a48919 |