在 JS 中表示数独的最小方式

问题描述 投票:0回答:1

我想存储 10,000 个数独谜题及其解决方案,即 20,000 x 81 位数字。

这仅用于存储,我会将其解析为其他内容以实际处理数据,因此如果需要,可以对其进行混淆。

如果我将拼图存储为字符串,例如:

".........4...56.....6...95..4...8....925..8.15..19.4.23...7..9.6.9.....8.8....1.."

它有 81 个字符,默认 UTF-16 编码为 162 个字节。总共有 3.2mb 的数据。

另一种选择是将谜题存储为 9 个(64 位)数字的数组,例如:

[
    000000000,
    000800050,
    810020304,
    380001060,
    600009007,
    004000000,
    500400002,
    400000000,
    762005900
]

即每个拼图 72 字节,或总共 1.4 mb。

有哪些更好的方法来存储数独?

javascript data-structures sudoku
1个回答
1
投票

与现代媒体相比,原始文件大小并不是那么大,因此您可能需要考虑它真正需要多小。基于纯文本,您可以将 .. 交换为 :使用其他符号进行较长的运行,也将 / 替换为行尾的空白。查看 FEN 国际象棋拼图编码以获取灵感。

只要您的数独谜题都有一个唯一的正确答案,您就根本不需要存储解决方案!一种相当简单的按位逻辑算法将解决只有一个唯一解决方案的干净数独难题。如果存在一个可能是 A 或 B 的值循环,并且其中一个选择是好的,或者是一个未解决的循环 A、B、C,其中只有一个选择是好的,那么它们就会陷入困境。这可以通过编程来解决,但处理不明确的特殊情况可能会变得复杂。

由于每个单元需要存储 10 个状态,如果您想选择机器支持的格式,BCD 十进制将是一个明显的自然选择。通过简单的固定长度记录,您可以将每个谜题减少到 40.5 字节(如果您确实想要这样做,则可以使用 81 字节来存储谜题解决方案对)。

如果您准备更努力地工作,您可以将它们存储为 36 个字节的 9x uint32,其中数字位置很重要(因此每对 72 个字节)。您必须小心旋转它们,以便前导数字位置不会出现 3 以上的数字!

之后,您将进入压缩阶段,并且解决方案无法做太多事情,因为它们的每个符号的频率相同且顺序随机。起始位置将先验地具有大量的空白,因此您可以利用这一点并将其编码为单个 0 位,然后分配 1bbbb (或者您可以对其进行霍夫曼编码),但我的猜测是符号 1 到 9 的频率会非常相似。这应该可以将典型的谜题减少到大约 16 个字节左右。

我认为 uint32 可能是最不痛苦的方式,并且不是人类可读的,但要小心溢出 maxint!

© www.soinside.com 2019 - 2024. All rights reserved.