数独パズルに配置できるすべてのマークを取得する[終了]


8

数独パズルを考えて、各空のセルに記入できるすべての可能なマークを見つけます。

テストケース

入力:

[
    [
        // Top left:
        [
            0, 0, 0,
            3, 4, 0,
            0, 0, 2
        ],
        // Top middle:
        [
            7, 4, 0,
            0, 0, 0,
            0, 0, 3
        ],
        // Top right:
        [
            8, 0, 0,
            1, 7, 0,
            0, 0, 0
        ]
    ],
    [
        // Middle left:
        [
            9, 0, 4,
            7, 0, 0,
            1, 0, 3
        ],
        // Center:
        [
            0, 5, 0,
            0, 0, 0,
            0, 7, 0
        ],
        // Middle right:
        [
            0, 0, 0,
            6, 4, 0,
            0, 0, 0
        ]
    ],
    [
        // Bottom left:
        [
            0, 0, 7,
            6, 3, 0,
            0, 0, 0
        ],
        // Bottom middle:
        [
            0, 0, 5,
            0, 0, 0,
            9, 1, 0
        ],
        // Bottom right:
        [
            0, 0, 0,
            5, 2, 0,
            7, 0, 0
        ]
    ]
]

出力:

[
    [
        // Top left:
        [
            [5], [1, 5, 6, 9], [1, 5, 6, 9],
            [], [], [5, 6, 8, 9],
            [5, 8], [1, 5, 6, 7, 8, 9], []
        ],
        // Top middle:
        [
            [], [], [1, 2, 6, 9],
            [2, 5, 6, 8], [2, 6, 8, 9], [2, 6, 8, 9],
            [1, 5, 6, 8], [6, 8, 9], []
        ],
        // Top right:
        [
            [], [3, 5, 6, 9], [2, 3, 5, 6, 9],
            [], [], [2, 5, 6, 9],
            [4, 9], [5, 6, 9], [4, 5, 6, 9]
        ]
    ],
    [
        // Middle left:
        [
            [], [2, 6, 8], [],
            [], [2, 5, 8], [5, 8],
            [], [2, 5, 6, 8], []
        ],
        // Center:
        [
            [1, 2, 3, 6, 8], [], [1, 2, 6, 8],
            [1, 2, 3, 8], [2, 3, 8, 9], [1, 2, 8, 9],
            [2, 4, 6, 8], [], [2, 4, 6, 8, 9]
        ],
        // Middle right:
        [
            [2, 3], [1, 3, 8], [1, 2, 3, 7, 8],
            [], [], [1, 2, 3, 5, 8, 9],
            [2, 9], [5, 8, 9], [2, 5, 8, 9]
        ]
    ],
    [
        // Bottom left:
        [
            [2, 4, 8], [1, 2, 8, 9], [],
            [], [], [1, 8, 9],
            [2, 4, 5, 8], [2, 5, 8], [5, 8]
        ],
        // Bottom middle:
        [
            [2, 3, 4, 6, 8], [2, 3, 6, 8], [],
            [4, 8], [8], [4, 7, 8],
            [], [], [2, 4, 6, 8]
        ],
        // Bottom right:
        [
            [3, 4, 9], [1, 3, 6, 8, 9], [1, 3, 4, 6, 8, 9],
            [], [], [1, 4, 8, 9],
            [], [3, 6, 8], [3, 4, 6, 8]
        ]
    ]
]

出力の視覚化; 小さな数字:

すべての有効なマークが付いた不完全な数独グリッド

ルール

  • これはです。バイト(または同等)での最短の回答が優先されます。
  • 入力は、配列または文字列形式にすることができます。
  • 入力は上記の順序(左上、中央上、右上など)である必要があります。
  • 期待される結果を論理的に表すことができる限り、出力は配列形式または文字列形式にすることができます。
  • 出力は入力と同じ順序でなければなりません(左上、中央上、右上など)。
  • 出力をきれいにする必要はありません。
  • コードは、有効な不完全な数独グリッドに適用できる必要があります。
  • 標準のゴルフ規則が適用されます。

その他の注意事項:

プログラムまたは関数が数独パズルを解いてセル値を論理的に解くことができなくなるポイントまでその結果を使用する場合、追加の偽のインターネットポイントを取得します。たとえば、テストケースの最初のセルには数値5しか含めることができないため、他の値を入力するときに考慮する必要があります。これは単に面白くて追加の課題のためのものです。それ以外の場合は、この基準が満たされているかどうかに関係なく、最も短い答えが勝ちます。


入力フォーマットはどの程度柔軟ですか?たとえば、9つの文字列の配列でしょうか?(など["000340002", "740000003", ...]
Arnauld

1
左から右、上から下への単一の文字列は入力として許可されますか?このような?そして同じ順序で出力しますか?
orlp

1
解決できるセルと解決できないセルを特定するためのロジックを適用しない場合、実際に何をするように求めているのでしょうか。
Peter Taylor

1
それとパズルを解くことの間であなたが描いている違いは何ですか?
Peter Taylor

1
では、どのような状況でセルに誤った値が入れられるのでしょうか?繰り返すのをやめて、用語の定義を始めましょう。
Peter Taylor

回答:


4

C(gcc)、193バイト

#define F(x)for(x=0;x<9;++x)
char s[99];main(k,r,c){gets(s);F(r)F(c){
int d[99]={};F(k)d[s[r*9+k]]=d[s[k*9+c]]=d[s[r/3*27+k/3*9+c/3*3+k%3]]=1;
F(k)s[r*9+c]<48&&!d[49+k]&&putchar(49+k);puts("");}}

次の形式の入力を想定しています(上記と同じ数独)。

..74.8..34....17...2..3...9.4.5....7.....64.1.3.7......7..5...63....52....91.7..

そして、次の形式で出力します。

5
1569
1569


1269

3569
23569


5689
etc

2

Python 2、178バイト

lambda s,R=range(9):[[[(s[Y][X][i]<1)*[q+1for q in R if~-(q+1in sum([[s[j/3][X][j%3*3+i%3],s[Y][j/3][j%3+i/3*3]]for j in R],[])+s[Y][X])]for i in R]for X in R[:3]]for Y in R[:3]]

intの3次元配列を取り、intの4次元配列を返す無名関数。


2

JavaScript(ES6)、208 196 190 188 186バイト

g=>g.map((B,i)=>[...B].map((s,x)=>+s||[..."123456789"].filter(n=>(t=i=>(k=g[i].search(n)%m)<a|k>b)(j=i%3,m=3,a=b=x%3)&t(j+3)&t(j+6)&t(j=i-j,m=9,a=x-a,b=a+2)&t(j+1)&t(j+2)&t(i,a=0,b=8))))

入力
9つの文字列の配列(ボックスごとに1つ、左上から右下まで)。

出力
9つの配列の配列。各項目は、この位置にある元の番号、または可能な数字を表す文字の配列のいずれかで構成されます。

フォーマットとコメント

g => g.map((B, i) =>              // for each box B at position i in the grid:
  [...B].map((s, x) =>            // for each cell s at position x in this box:
    +s ||                         // if there already is a number at this position, use it
    [..."123456789"].filter(n =>  // else, for each digit n in [1 .. 9]:
      (t = i =>                   // t() = helper function that looks for the digit n inside
        (k = g[i].search(n) % m)  // a given box i and returns a truthy value if its
        < a | k > b               // position modulo m is not in the range [a .. b]
      )(                          //
        j = i % 3,                // test the top box in the current column, using:
        m = 3,                    // modulo = 3 and
        a = b = x % 3             // range = [x % 3 .. x % 3]
      ) &                         //
      t(j + 3) &                  // test the middle box in the current column
      t(j + 6) &                  // test the bottom box in the current column
      t(                          //
        j = i - j,                // test the left box in the current row, using:
        m = 9,                    // modulo = 9 and
        a = x - a, b = a + 2      // range = [floor(x / 3) .. floor(x / 3) + 2]
      ) &                         //
      t(j + 1) &                  // test the middle box in the current row
      t(j + 2) &                  // test the right box in the current row
      t(i, a = 0, b = 8)          // finally test the current box, using:
    )                             // modulo = 9 (unchanged) and
  )                               // range = [0 .. 8] (thus testing the entire box)
)                                 //

デモ

let f =

g=>g.map((B,i)=>[...B].map((s,x)=>+s||[..."123456789"].filter(n=>(t=i=>(k=g[i].search(n)%m)<a|k>b)(j=i%3,m=3,a=b=x%3)&t(j+3)&t(j+6)&t(j=i-j,m=9,a=x-a,b=a+2)&t(j+1)&t(j+2)&t(i,a=0,b=8))))

console.log(f([
  "000340002",
  "740000003",
  "800170000",
  "904700103",
  "050000070",
  "000640000",
  "007630000",
  "005000910",
  "000520700"
]));


1

Haskell、135バイト

(%)=mod
x!y=x-x%y
f a=[[j|j<-[1..9],and[a!!k/=j|k<-[i!3-i!9%27+p%3+p!3*3|p<-[0..8]]++[i!9..i!9+8]++[i%9,i%9+9..80]],a!!i<1]|i<-[0..80]]

f81 Intのリストからのリストのリストまでの関数を定義しますInt

IOはorlpの答えに似ていますが、の[0,1,2,3,4,5,6,7,8,9]代わりに使用します".123456789"

dianneは数バイトを節約しました。


1

JavaScript(ES6)、185バイト

a=>a.map((b,r)=>b.map((d,c)=>d.map((e,i)=>e.map((g,j)=>[1,2,3,4,5,6,7,8,9].filter(v=>a.every(b=>b[c].every(e=>e[j]-v))&b.every(d=>d[i].every(g=>g-v))&d.every(e=>e.every(g=>g-v))&!g)))))

入力として、整数のセルの3 x 3配列の3列の配列の3行の配列を取り、すべての整数が配列に置き換えられた5次元配列を返します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.