フラクタルな数独


言いたいこと

何の変哲もない次の数独

実は3つのブロックのみで構成されている。

さらにそれらのブロックも同じ構成である。({1, 4, 7}, {2, 5, 8}, {3, 6, 9}で色分け)

以上

おまけ

ちょっと待って、プログラミング要素がないやん!
と言われそうなので任意のフラクタル数独が作れるプログラムを雑に作った。

const n = 4; // ブロックの一辺のセル数

const numPatternList = [];
const sudokuResult = [];

let numPattern = [];
for (let i = 1; i <= n * n; i++) {
    if (i % n === 1) {
        numPattern = [];
        numPatternList.push(numPattern);
    }
    numPattern.push(i);
}

for (let i = 0; i < n * n; i++) {
    const row = [];
    const ii = Math.floor(i / n);

    for (let j = 0; j < n; j++) {
        const jj = (j - ii + n) % n;
        for (let k = 0; k < n; k++) {
            row.push(numPatternList[(n - i % n + k) % n][(jj + i) % n]);
        }
    }

    sudokuResult.push(row);
}

for (let i = 0; i < n * n; i++) {
    console.log(sudokuResult[i].join(", "));
}

実行

1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15, 4, 8, 12, 16
14, 2, 6, 10, 15, 3, 7, 11, 16, 4, 8, 12, 13, 1, 5, 9
11, 15, 3, 7, 12, 16, 4, 8, 9, 13, 1, 5, 10, 14, 2, 6
8, 12, 16, 4, 5, 9, 13, 1, 6, 10, 14, 2, 7, 11, 15, 3
4, 8, 12, 16, 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15
13, 1, 5, 9, 14, 2, 6, 10, 15, 3, 7, 11, 16, 4, 8, 12
10, 14, 2, 6, 11, 15, 3, 7, 12, 16, 4, 8, 9, 13, 1, 5
7, 11, 15, 3, 8, 12, 16, 4, 5, 9, 13, 1, 6, 10, 14, 2
3, 7, 11, 15, 4, 8, 12, 16, 1, 5, 9, 13, 2, 6, 10, 14
16, 4, 8, 12, 13, 1, 5, 9, 14, 2, 6, 10, 15, 3, 7, 11
9, 13, 1, 5, 10, 14, 2, 6, 11, 15, 3, 7, 12, 16, 4, 8
6, 10, 14, 2, 7, 11, 15, 3, 8, 12, 16, 4, 5, 9, 13, 1
2, 6, 10, 14, 3, 7, 11, 15, 4, 8, 12, 16, 1, 5, 9, 13
15, 3, 7, 11, 16, 4, 8, 12, 13, 1, 5, 9, 14, 2, 6, 10
12, 16, 4, 8, 9, 13, 1, 5, 10, 14, 2, 6, 11, 15, 3, 7
5, 9, 13, 1, 6, 10, 14, 2, 7, 11, 15, 3, 8, 12, 16, 4

以上!