독특한 스도쿠 파인더


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
    
  • 출력은 행당 하나의 숫자로 형식화되며 다음과 같이 형식화됩니다. (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이들 중 어느 하나의 보드를 해결할 수있게하는 것처럼.
  • 독창적이거나 해결 된 스도쿠 보드를 입력하면 프로그램은 줄 바꿈을 포함하여 아무 것도 인쇄하지 않아야합니다.
  • 프로그램은 모든 보드에 대해 1 시간 이내에 실행되어야합니다 (완전히 빈 보드 또는 임의의 숫자가 하나 인 보드를 사용하여 테스트하는 것이 좋습니다).

채점 :

  • 모든 공백을 포함 하여 총 코드 크기를 문자로 가져옵니다 ...

보너스 :

1/2 코드 크기 : 프로그램이 단일 느낌표를 인쇄하고 솔루션이 입력되지 않은 보드가 있으면 중지됩니다.

1/2 코드 크기 : 프로그램이 두 개의 느낌표를 인쇄하고 내부 모순이 입력 된 보드가있을 때 중지됩니다 (두 행은 같은 행 / 열 / 사각에서 동일).


3
지루한 아마도 어려운 :(
올레 Prypin

6
우우. '아무것도 인쇄하지 않고 줄 바꿈조차하지 않습니다'는 GolfScript를 배제합니다.
피터 테일러

1
완전한 솔루션을 찾기 위해 역 추적 / 추측 할 필요가없는 스도쿠 솔버가 필요하며, "추측"이 필요할 때마다 출력됩니다.
ratchet freak

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에서 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
이것을 프롤로그 답변으로 확장 할 수 없습니까? 그렇다면 경쟁이 될 것입니다! (별도로 게시 할 수 있습니다.) Brachylog와 Prolog 간의 매핑이 얼마나 직접적인지 잘 모르겠습니다.
Lynn

@Lynn 네, 가능합니다. Brachylog의 트랜스 파일러에 의해 생성 된 Prolog 코드를 게시 할 수도 있습니다. 어쨌든 도전의 포스터가 답을 받기 위해 돌아 오지 않을 것이라고 확신하기 때문에 나는 그것을하지 않을 것입니다 : p
Fatalize
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.