ユニークな数独ファインダー


19

チャレンジ:

標準入力の数独ボードを使用して、ボードを一意にするために追加される最小数を見つけます。

詳細/ルール:

  • 入力は次のようにフォーマットされます(すべての空白が重要です)

    516|827|943
    278|394|615
    349|615|872
    ---+---+---
    98 |4 2|156
    465|189|237
    12 |5 6|489
    ---+---+---
    892|743|561
    634|951|728
    751|268|394
    
  • 出力は、行ごとに1つの数値でフォーマットされます(x,y):z。xおよびyは、左上の1から始まり、右下に向かって増加します。zは追加する番号です。

    • この場合、これらはすべての有効な出力を次のようになります(3,4):3(3,4):7(5,4):3(5,4):7(3,6):3(3,6):7(5,6):3、および(5,6):7、これらのいずれかがボードを解決することができるようになると。
  • 一意/解決された数独ボードが入力された場合、プログラムは改行を含めて何も印刷しません。
  • プログラムは、どのボードでも1時間以内に実行する必要があります(完全にブランクのボード、または1つのランダムな番号のボードを使用してテストすることをお勧めします...)。

得点:

  • すべての空白を含めて、文字で合計(ゴルフ)コードサイズを取得します ...

ボーナス:

1/2コードサイズ:プログラムが単一の感嘆符を出力し、解答が入力されていないボードがあると停止します。

1/2コードサイズ:プログラムが2つの感嘆符を印刷し、内部矛盾(同じ行/列/正方形で同じ2つの数字)が入力されたボードがあると停止する場合。


3
退屈でおそらく難しい:(
オレPrypin

6
ブー。「何も印刷せず、改行も含めない」とGolfScriptが除外されます。
ピーターテイラー

1
完全なソリューションのためにバックトラック/推測する必要のない数独ソルバーがこれに必要です(「推測」が必要になるたびに出力します)
ラチェットフリーク

3
これに反対票を投じる理由はわかりません。かなりのパズルを示すために多くの努力が払われました。それは非常に明確であり、適切に述べられています。私の好みには大きすぎますが、それは投票する理由のためにあまりにも主観的ですよね?
ユーザー不明

回答:


10

Brachylog、245バイト/ 2 = 122.5

@n:1a:"-"x:7fF:3a$\:3a@3:4a,Fc~bCh[0:0:0]gO,Co~c[V:O:T]h:F:6f:10ao:ba(h:11a;!);"!!"w!
h"-".|:"|"x:2f.
e(~m["0123456789":.]`;0<.<=9)
:ha#d.
:@3az:ca:5a.
:3a.
hs.:=a,?t:9ac:=fl1
:Im:8f:[[I]]z:ca.
:Jm:J.
:ha.
lg:?c.
b:+a[X:Y],?h:Y:Xr:"(~d,~d):~d
"w

このコミットの時点で言語のバージョンを使用する必要があることに注意してください。このコードは、以下のバージョンのBrachylogで適切に動作するために若干の変更が必要です)

これは"!!"、指定されたボードに内部矛盾がある場合に出力されます(ただし、TIOではこの場合数秒かかりますので、しばらくお待ちください)。

最初のボーナスを正しく理解しているかどうかわからないので、対処しません。

言語はチャレンジよりもはるかに新しいため、これは明らかに競合していませんが、他に答えがないため、これが非常に重要であるかはわかりません...

説明

  • 主な述語:

    @n                Split the input on line breaks
    :1a:"-"x          Transform into a list of lists, each sublist contains a line's values
    :7fF              Transform so that cells are [Value:X:Y]
    :3a               All values on lines must be different
    $\:3a             All values on columns must be different (by transposition)
    @3:4a,            All 3*3 block values must be different
    Fc~bCh[0:0:0]gO,  Append a fake cell [0:0:0]
    Co~c[V:O:T]       Sort the board, the blank cells V will be those before O ([0:0:0])
    h:F:6f            Find all subsets of blank cells with specific values for which 
                          the board has only one solution
    :10ao             Sort the subsets by lengths
    :ba               Discard the lengths
    (                 
      h:11a             Print the first subset = an answer
    ;                 Or (board is already fully determined)
      !                 Terminate
    )          
    ;                 Or (Some values don't respect the constraints)
    "!!"w!            Print "!!" and terminate
    
  • 述語1:|行のすべての " " を削除し、を変換し---+---+----から削除します

    h"-".    If the first char is "-", then Output is "-"
    |        Or
    :"|"x    Remove all occurences of "|" from the input
    :2f.     Output is the result of all outputs of predicate 2 on the filtered string
    
  • 述語2:1つの文字を整数に変換するか、空白の場合は1〜9の変数に変換します。

    e                      Take a char of the input string
    (
      ~m["0123456789":.]     Output is the index of the char in "0123456789"
      `                      Discard the choice point caused by the ;
    ;                      Or
      0<.<=9                 Output is an integer between 1 and 9
    )
    
  • 述語3:セルの入力リストのすべての値が明確でなければならないことを課します

    :ha    Retrieve the head of each cell (i.e. the value) in the input 
    #d.    Apply a constraint of distinctness to those values
    
  • 述語4:3 * 3ブロックの値に明確性制約を適用する

    :@3a            Split 3 lines of the board in 3 parts
        z           Zip them together
         :ca:5a.    Concatenate each element of the zip, apply predicate 5 to that
    
  • 述語5:

    :3a.    Apply predicate 3 to each element of the input
    
  • 述語6:制約を満たす値を空白セルのサブセットに割り当てます。これらの値では、ボードに対する解決策は1つだけです。

    hs.       Output is a subset of the blank cells
    :=a,      Assign values to those cells
    ?t:9ac    Concatenate the values of all cells of the board
    :=f       Find all solved boards
    l1        There is only 1 such solved board
    
  • 述部7:各セルが(値)[V:X:Y]だけではなくようにボードを変換Vします。

    :Im       Take the Ith line of the board
    :8f       Transform all elements of the line using predicate 8
    :[[I]]z   Zip the result with [I]
    :ca.      Concatenate each element of the zip
    
  • 述部8:各セルがになるように線を変換します[V:X]

    :Jm    Take the Jth element of the line
    :J.    Output is [That element:J]
    
  • 述部9:セルの値を取得する

    :ha.   Take the head of each element of the input
    
  • 述語10:サブセットの長さを先頭に追加します

    lg     Put the length of the input in a list
    :?c.   Concatenate it with the input
    
  • 述部11:1つのセルを印刷する

    b:+a[X:Y],        Increment coordinates by 1 to get X and Y
    ?h:Y:Xr:          Build the list [X:Y:Value]
    "(~d,~d):~d\n"w   Format that list as "('X','Y'):'Value'\n" to STDOUT
    

2
これをPrologの回答に展開することはできませんか?その後、競合することになります!(個別に投稿することもできます。)BrachylogとPrologの間のマッピングがどれほど直接的かはわかりません。
リン

@Lynnはい、できます。Brachylogのトランスパイラーによって生成されるPrologコードを投稿することもできます(明らかに、非常に手に負えないでしょう)。私はかなり確信しているので、挑戦者のポスターはとにかく答えを受け入れるように戻ってくることはありませんけれども、私はそれを行うことはありません:P
Fatalize
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.