Trình tìm Sudoku độc đáo


19

Thử thách:

Đưa ra một bảng Sudoku trên đầu vào tiêu chuẩn, tìm số lượng tối thiểu các số được thêm vào để làm cho bảng duy nhất.

Cụ thể / Quy tắc:

  • Đầu vào được định dạng như sau (tất cả khoảng trắng là đáng kể)

    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
    
  • Đầu ra được định dạng với một số trên mỗi dòng, được định dạng như (x,y):z- x và y bắt đầu từ một ở phía trên bên trái và tăng xuống và phải; z là số cần thêm.

    • Trong trường hợp này những sẽ tất cả được kết quả đầu ra hợp lệ: (3,4):3, (3,4):7, (5,4):3, (5,4):7, (3,6):3, (3,6):7, (5,6):3, và (5,6):7, như bất kỳ một trong những sẽ cho phép hội đồng quản trị để được giải quyết.
  • Nếu một bảng Sudoku duy nhất / đã giải quyết được nhập, chương trình sẽ không in bất cứ thứ gì, ngay cả một dòng mới.
  • Chương trình sẽ chạy trong vòng chưa đầy một giờ cho bất kỳ bảng nào (Tôi khuyên bạn nên thử nghiệm bằng cách sử dụng một bảng hoàn toàn trống hoặc một bảng có một số ngẫu nhiên trên đó ...).

Ghi điểm:

  • Lấy tổng kích thước mã (được đánh gôn) của bạn theo các ký tự, bao gồm tất cả khoảng trắng ...

Tiền thưởng:

Kích thước mã 1/2 : Nếu chương trình in một dấu chấm than duy nhất và dừng lại khi có một bảng không có giải pháp nào được nhập.

Kích thước mã 1/2 : Nếu chương trình in hai dấu chấm than và dừng lại khi có một bảng có mâu thuẫn nội bộ được nhập (hai số giống nhau trên cùng một hàng / cột / ô vuông).


3
Chán và có lẽ khó :(
Oleh Prypin

6
Boo. 'Không in bất cứ điều gì, thậm chí không phải là một dòng mới' quy định GolfScript.
Peter Taylor

1
một bộ giải sudoku không bao giờ cần quay lại / đoán cho một giải pháp đầy đủ là cần thiết cho điều này, (và mỗi lần cần một "đoán" là cần thiết)
ratchet freak

3
Tôi không thấy lý do để hạ thấp điều này. Nhiều nỗ lực đã được thực hiện để hiển thị một câu đố đẹp; nó rất rõ ràng, và được nêu rõ. Nó quá lớn so với sở thích của tôi, nhưng điều đó quá chủ quan vì một lý do để hạ thấp, phải không?
người dùng không xác định

Câu trả lời:


10

Brachylog , 245 byte / 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

(Lưu ý rằng bạn phải sử dụng phiên bản ngôn ngữ theo cam kết này . Mã này sẽ cần một số thay đổi nhỏ để nó hoạt động chính xác trong các phiên bản sau của Brachylog)

Bản in này "!!"nếu bảng đã cho có mâu thuẫn nội bộ (Điều này mất vài giây trong trường hợp đó tuy nhiên trên TIO, vì vậy hãy kiên nhẫn).

Tôi không chắc là tôi hiểu chính xác phần thưởng đầu tiên nên tôi không giải quyết nó.

Điều này rõ ràng là không cạnh tranh vì ngôn ngữ gần đây hơn nhiều so với thử thách, tuy nhiên vì không có câu trả lời nào khác nên tôi không chắc vấn đề này có rất nhiều vấn đề

Giải trình

  • Vị ngữ chính:

    @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
    
  • Vị ngữ 1: Xóa tất cả " |" trên các dòng, chuyển đổi ---+---+---thành -loại bỏ chúng sau

    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
    
  • Vị ngữ 2: Chuyển đổi một char thành một số nguyên hoặc nếu để trống thành một biến trong khoảng từ 1 đến 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
    )
    
  • Vị ngữ 3: Giả sử rằng tất cả các giá trị của danh sách đầu vào của các ô phải khác biệt

    :ha    Retrieve the head of each cell (i.e. the value) in the input 
    #d.    Apply a constraint of distinctness to those values
    
  • Vị ngữ 4: Áp dụng ràng buộc phân biệt cho các giá trị trong các khối 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
    
  • Vị ngữ 5:

    :3a.    Apply predicate 3 to each element of the input
    
  • Dự đoán 6: Gán các giá trị thỏa mãn các ràng buộc cho một tập hợp con của các ô trống, sau đó với các giá trị đó chỉ có một giải pháp cho bảng.

    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
    
  • Dự đoán 7: Biến đổi bảng sao cho mỗi ô bây giờ [V:X:Y]thay vì chỉ V(giá trị).

    :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
    
  • Vị ngữ 8: Biến đổi một dòng sao cho mỗi ô hiện tại [V:X].

    :Jm    Take the Jth element of the line
    :J.    Output is [That element:J]
    
  • Vị ngữ 9: Lấy các giá trị của các ô

    :ha.   Take the head of each element of the input
    
  • Vị ngữ 10: Nối chiều dài của tập hợp con vào đầu của nó

    lg     Put the length of the input in a list
    :?c.   Concatenate it with the input
    
  • Vị ngữ 11: In một ô

    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
Bạn không thể mở rộng điều này thành một câu trả lời Prolog? Sau đó, nó sẽ được cạnh tranh! (Bạn có thể đăng riêng nó.) Tôi không chắc cách ánh xạ trực tiếp giữa Brachylog và Prolog.
Lynn

@Lynn Có, tôi thậm chí có thể đăng mã Prolog được tạo bởi bộ chuyển mã của Brachylog (rõ ràng là rất khó hiểu). Mặc dù vậy, tôi sẽ không làm điều đó bởi vì tôi khá chắc chắn rằng poster của thử thách sẽ không bao giờ quay lại để chấp nhận câu trả lời nào nữa: p
Fatalize 22/07/16
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.