独特的Sudoku Finder


19

挑战:

给定Sudoku开发板的标准输入,找到添加的最小数量以使开发板唯一。

具体/规则:

  • 输入的格式如下(所有空格均有效)

    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
    
  • 输出的格式为每行一个数字,格式如(x,y):z-x和y从左上角的一个开始,然后向下和向右递增;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,如其中任何一项将允许板来解决。
  • 如果输入了唯一/已解决的Sudoku开发板,则该程序不应打印任何内容,甚至不能换行。
  • 该程序对于任何开发板都应在不到一个小时的时间内运行(我建议使用完全空白的开发板或上面带有一个随机数字的开发板进行测试...)。

得分:

  • 以字符为单位的总(行进)代码大小,包括所有空格 ...

奖金:

1/2代码大小:如果程序只打印一个感叹号,并且在没有输入解决方案的电路板时停止。

1/2代码大小:如果程序打印两个感叹号并在输入内部矛盾的木板时停止(两个数字在同一行/列/正方形上相同)。


3
无聊且可能很困难:(
Oleh Prypin 2011年

6
嘘 GolfScript排除了“什么都不打印,甚至没有换行符”。
彼得·泰勒

1
为此,需要一个永远不需要回溯/猜测完整解决方案的数独解算器(并且每次需要输出“猜测”时)
棘轮怪胎

3
我看不出拒绝此票的理由。为了显示一个漂亮的难题,我们付出了很多努力。这是非常清楚的,并且正确地陈述了。对于我来说,太大了,但是出于主观原因,太主观了,不是吗?
用户未知,

Answers:


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:将一个char转换为整数,如果为空白,则转换为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:将满足约束条件的值分配给空白单元的子集,然后使用这些值,只有一个解决方案可用于开发板。

    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:打印一个单元格

    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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.