> For the complete documentation index, see [llms.txt](https://sudoku.kazusa.tech/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://sudoku.kazusa.tech/appendix/sudoku-text-format.md).

# Ⅱ：数独文本格式

下面展示数独的一些常见文本格式。

## Susser 格式 <a href="#susser-format" id="susser-format"></a>

Susser 格式是数独最常见的格式。它采用 81 个字符表示每一个单元格的状态，用小数点或 0 表示空格，1 到 9 表示实际这个单元格的填数。

### 初盘格式 <a href="#initial-grid-format" id="initial-grid-format"></a>

拿这个题目举例：

<figure><img src="/files/cDNA1hVh97nJualJLcs0" alt="" width="375"><figcaption><p>一个题目</p></figcaption></figure>

如图所示。这个题目的 Susser 格式如下：

{% code overflow="wrap" %}

```
....8.......5.2.....3...1...5.....2.8...9...66..375..9.15.2.83.....5.......739...
```

{% endcode %}

也可将小数点更换为数字 0：

{% code overflow="wrap" %}

```
000080000000502000003000100050000020800090006600375009015020830000050000000739000
```

{% endcode %}

是等价的。

### 中间盘面格式 <a href="#interim-grid-format" id="interim-grid-format"></a>

当盘面进行到中间某个局面时，我们会使用额外的字符表达来表述这些情况。比如上面的题目已经到达这里：

<figure><img src="/files/TBDPmUy3uFWw1D1cWTv7" alt="" width="375"><figcaption><p>中间盘面</p></figcaption></figure>

此时它填入了一些数字的同时，也有一部分的候选数的删数状态。例如 `r8c46` 不含 4 和 6，但在未造成任何删数的盘面状态下是含有的，因为唯一余数的状态下，4 和 6 是不能排除到这里的。

换言之，在数独盘面里，如果你只看提示数和填入数的话，那么它能给盘面造成的候选数表则定义为初始状态。而基于此初始状态下还有二次删除的候选数，我们会单独进行记录。因为初始状态的候选数是可以推算出来的，但二次删除的候选数因为删除位置不定，所以不能进行推算。

我们使用 `+数字` 的形式表示一个单元格填入了一个数而非提示数。例如 `+3` 表示的是单元格是填入数 3，而非提示数 3。另外，我们使用三个数位一组的形式表达出这些二次删除的候选数。例如 `312` 表示 `3r1c2`，即 `r1c2(3)`。

那么按照此规则，这个盘面的文本如下：

{% code overflow="wrap" %}

```
....8+3......5.2.....3..+71...5+9....2.8..+29...66+2+1375+4+89+915.2.83+7....5.......739...:882 883 484 684 486 686 188 189
```

{% endcode %}

我们使用冒号将盘面和二次删数隔开以作区分。

## 多行文本格式 <a href="#multiple-line-grid-format" id="multiple-line-grid-format"></a>

有些时候也会将此文本排版为论坛可阅读的格式，所以会使用到多行文本格式。这个格式直接使用一些特殊字符对盘面进行打表处理。

{% hint style="info" %}
这种格式的名称就叫“多行文本格式”。后续的文本格式还会有若干也使用多行呈现的文本格式，但他们并非属于此文本格式的子集，是另外一套记号。
{% endhint %}

一个正确的盘面文本如下：

```
.-------.-------.-------.
| . . . | . 8 . | . . . |
| . . . | 5 . 2 | . . . |
| . . 3 | . . . | 1 . . |
:-------+-------+-------:
| . 5 . | . . . | . 2 . |
| 8 . . | . 9 . | . . 6 |
| 6 . . | 3 7 5 | . . 9 |
:-------+-------+-------:
| . 1 5 | . 2 . | 8 3 . |
| . . . | . 5 . | . . . |
| . . . | 7 3 9 | . . . |
'-------'-------'-------'
```

该文本格式只需要标注宫的线条即可，而单元格则不需要字符标识出来。

{% hint style="info" %}
这种文本格式并未严格规定宫线使用的字符集。例如，盘面四个角为了美观会使用小数点 `.` 表示上方两个边角，撇号 `'` 则表示下方两个边角。这样呈现起来会美观一些；另外，宫和宫之间一般用减号 `-` 和管道符 `|` 表示分隔，宫线的边角则会使用小数点 `.`、冒号 `:` 和加号 `+` 分隔。
{% endhint %}

## 铅笔盘面格式 <a href="#pencilmark-grid-format" id="pencilmark-grid-format"></a>

铅笔盘面格式也叫候选数盘面格式，指的是着重呈现候选数信息的多行文本格式表示。

一个正确的盘面文本如下：

```
.-----------------------.--------------------.-----------------------.
| 12457   4679    2467  | 1469   <8>   *3*   | 25679   45679   245   |
| 147     46789   4678  | <5>    146   <2>   | 3679    4679    348   |
| 245     4689    <3>   | 469    46    *7*   | <1>     4569    2458  |
:-----------------------+--------------------+-----------------------:
| 347     <5>     *9*   | 1468   146   1468  | 37      <2>     13    |
| <8>     347     47    | *2*    <9>   14    | 357     157     <6>   |
| <6>     *2*     *1*   | <3>    <7>   <5>   | *4*     *8*     <9>   |
:-----------------------+--------------------+-----------------------:
| *9*     <1>     <5>   | 46     <2>   46    | <8>     <3>     *7*   |
| 2347    3467    2467  | 18     <5>   18    | 269     469     24    |
| 24      468     2468  | <7>    <3>   <9>   | 256     1456    1245  |
'-----------------------'--------------------'-----------------------'
```

它是多行文本格式的推广，需要着重强调候选数状态。

{% hint style="warning" %}
这种格式并未规定提示数和填入数需要特殊表明的字符集。在这种格式下，即使是提示数或填入数，在一些论坛上你也可以看到它可能只是一个单一的数字字符占位表示它。所以，这种格式不会严格区分提示数、填入数或空格。换言之，如果一个单元格为空格，但是是唯一余数状态的话，是无法表示的。

一种推荐的做法是，使用星号 `*数字*` 表示填入数，而使用尖括号 `<数字>` 表示提示数。这样可以区分，但这样会造成解析上的不兼容（篡改了只有一个数字时的解析逻辑），请特殊注意此点。
{% endhint %}

{% hint style="success" %}
另外，此格式还支持一些别的特殊记号用于表示删数信息等。但这些并未有严格规定。一般使用 `-数字序列` 表示删数，而和原先的候选数配合起来的话，需要先写出原本的数字，然后再罗列删数。例如 `12-34` 表示这个单元格原来有 4 个候选数 1、2、3、4，但删除的是 3 和 4，1 和 2 仍在单元格里。
{% endhint %}

## 候选数数独格式 <a href="#sukaku-format" id="sukaku-format"></a>

另外一种比较类似标准数独的数独类型叫**候选数数独**（Sukaku），它在初盘就并不会给出任意的提示数，而是以候选数形式呈现每一个单元格的状态。你看到空格里有什么候选数，那就说明它在初盘状态下就只能从这些候选数里选择一个作为正确答案。

这种数独格式因为它和标准数独的描述和技巧几乎一样，所以也会有一些地方有支持和兼容处理。该格式采用 729 个候选数字符表示（81 个空格，每个空格 9 个数位表示是否存在此候选数）。使用小数点 `.` 或 0 表示这个数位代表的候选数不存在，而用实际数字 1 到 9 表达这个候选数是包含在题目里的。

例如上述题目的候选数数独下，兼容的格式写法是这样的：

{% code overflow="wrap" %}

```
12.45.7.....4.67.9.2.4.67..1..4.6..9.......8...3.......2..567.9...4567.9.2.45....1..4..7.....4.6789...4.678.....5....1..4.6....2.........3..67.9...4.67.9..34...8..2.45.......4.6.89..3.........4.6..9...4.6.........7..1...........456..9.2.45..8...34..7......5............91..4.6.8.1..4.6...1..4.6.8...3...7...2.......1.3.............8...34..7.....4..7...2...............91..4.......3.5.7..1...5.7.......6........6....2.......1..........3............7......5.......4............8.........9........91............5.......4.6....2..........4.6..........8...3............7...234..7....34.67...2.4.67..1......8.....5....1......8..2...6..9...4.6..9.2.4......2.4........4.6.8..2.4.6.8.......7....3..............9.2..56...1..456...12.45....
```

{% endcode %}

## Excel 表格格式 <a href="#excel-sheet-format" id="excel-sheet-format"></a>

另外一个是兼容 Excel 表格格式的文本。它使用制表符 `\t` 表示单元格分隔符，也是多行文本格式，但不使用任何的字符绘制格线。

例如上面的题目的 Excel 表格格式如下：

```
				8				
			5		2			
		3				1		
	5						2	
8				9				6
6			3	7	5			9
	1	5		2		8	3	
				5				
			7	3	9			
```

## OpenSudoku 文本格式 <a href="#opensudoku-format" id="opensudoku-format"></a>

这个是 OpenSudoku 安卓数独应用在本地存储的题库的文本格式。此格式会使用 243 个用管道符 `|` 分隔的数字表示构成（81 个单元格，每个单元格会使用三个数字表示一个单元格信息）。

其中，`0|0|1` 固定表示空格，而 `数字|0|0` 表示的是当前这个单元格的提示数或填入数。这个格式也不会区分提示数和填入数的类型。

例如上面的题目的 OpenSudoku 格式如下：

{% code overflow="wrap" %}

```
0|0|1|0|0|1|0|0|1|0|0|1|8|0|0|3|0|0|0|0|1|0|0|1|0|0|1|0|0|1|0|0|1|0|0|1|5|0|0|0|0|1|2|0|0|0|0|1|0|0|1|0|0|1|0|0|1|0|0|1|3|0|0|0|0|1|0|0|1|7|0|0|1|0|0|0|0|1|0|0|1|0|0|1|5|0|0|9|0|0|0|0|1|0|0|1|0|0|1|0|0|1|2|0|0|0|0|1|8|0|0|0|0|1|0|0|1|2|0|0|9|0|0|0|0|1|0|0|1|0|0|1|6|0|0|6|0|0|2|0|0|1|0|0|3|0|0|7|0|0|5|0|0|4|0|0|8|0|0|9|0|0|9|0|0|1|0|0|5|0|0|0|0|1|2|0|0|0|0|1|8|0|0|3|0|0|7|0|0|0|0|1|0|0|1|0|0|1|0|0|1|5|0|0|0|0|1|0|0|1|0|0|1|0|0|1|0|0|1|0|0|1|0|0|1|7|0|0|3|0|0|9|0|0|0|0|1|0|0|1|0|0|1
```

{% endcode %}

## HoDoKu 文本格式 <a href="#hodoku-format" id="hodoku-format"></a>

HoDoKu 文本格式是 HoDoKu 电脑数独分析软件采用的一种格式。这个格式较为复杂。它将一个题目的文本分为 7 个表述部分，并用冒号 `:` 分隔：

```
:技巧编号:涉及数字序列:Susser盘面:二次删数:删数结论:出数结论:额外信息
```

例如上述盘面，因为它跟技巧无关，只是单纯呈现盘面状态，所以缺省的部分会使用默认数值填充。其默认数值如下：

| 部分        | 可否缺省 | 缺省值  |
| --------- | ---- | ---- |
| 技巧编号      | ✅    | 0000 |
| 涉及数字序列    | ✅    | x    |
| Susser 盘面 | ❌    |      |
| 二次删数      | ✅    | 空字符串 |
| 删数结论      | ✅    | 空字符串 |
| 出数结论      | ✅    | 空字符串 |
| 额外信息      | ✅    | 空字符串 |

它的文本格式如下：

{% code overflow="wrap" %}

```
:0000:x:....8+3......5.2.....3..+71...5+9....2.8..+29...66+2+1375+4+89+915.2.83+7....5.......739...:882 883 484 684 486 686 188 189:::
```

{% endcode %}

几乎和 Susser 格式的内容一致。

如果需要呈现其技巧信息，则需要代入其技巧的编号信息。该编号需要查表得到。具体表格请参考 [Ⅴ：HoDoKu 技巧编号一览表](/appendix/01-hodoku-library-technique-codes.md) 页面提供的编号表。

例如，这个盘面下可以使用唯一矩形类型 4，所以它的完整表述如下：

{% code overflow="wrap" %}

```
:0603:18:....8+3......5.2.....3..+71...5+9....2.8..+29...66+2+1375+4+89+915.2.83+7....5.......739...:882 883 484 684 486 686 188 189:144 146::
```

{% endcode %}

其中，0603 是唯一矩形类型 4 的编号，而 `144 146` 代表的是删数结论删除 `r4c46(1)` 两处候选数。

## 总结 <a href="#conclusion" id="conclusion"></a>

下面总结一下前面文本格式的一些信息。

| 格式名称            | 是否呈现初盘 | 是否呈现中间盘面 | 是否区分提示数和填入数 | 是否呈现二次删数 |
| --------------- | ------ | -------- | ----------- | -------- |
| Susser 格式       | ✅      | ✅        | ✅           | ✅        |
| 多行文本格式          | ✅      | ❌        | ❌           | ❌        |
| 铅笔盘面格式          | ✅      | ✅        | ❓           | ✅        |
| 候选数数独格式         | ✅      | ❌        | ❌           | ✅        |
| Excel 表格格式      | ✅      | ✅        | ❌           | ❌        |
| OpenSudoku 文本格式 | ✅      | ✅        | ❌           | ❌        |
| HoDoKu 文本格式     | ✅      | ✅        | ✅           | ✅        |

## 正则表达式 <a href="#regular-expressions" id="regular-expressions"></a>

下面列举一下前面可能会用到的、用于匹配的正则表达式，方便你开发解析文本时候使用。

```regex
Susser 格式
[\d\.\+]{80,}(?:\:(\d{3}\s+)*\d{3})?

二次删数部分、HoDoKu 删数出数结论部分
(?<=\:)(?:\d{3}\s+)*\d{3}

候选数数独单元格候选数集合部分
\d*[\-\+]?\d+

OpenSudoku 格式
\d(?:\|\d){242}

铅笔盘面单个单元格
\<\d\>|\*\d\*|\d*[\+\-]?\d+

单一数字
[1-9\+\-]{1,9}

多行文本格式
(?:[\d\.\+]{9}(?:\r|\n|\r\n)){8}[\d\.\+]{9}
```
