Benzersiz Sudoku Bulucu


19

Meydan okuma:

Standart girişte bir Sudoku kartı verildiğinde, kartı benzersiz kılmak için eklenen minimum sayı sayısını bulun.

Özellikleri / Kurallar:

  • Giriş aşağıdaki gibi biçimlendirilir (tüm boşluklar önemlidir)

    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
    
  • Çıktı satır başına bir sayı ile biçimlendirilir, (x,y):z- x ve y gibi biçimlendirilir sol üstteki birinden başlar ve aşağı ve sağa doğru artar; z, eklenecek sayıdır.

    • Bu durumda bunların hepsi geçerli çıkışlar olacaktır: (3,4):3, (3,4):7, (5,4):3, (5,4):7, (3,6):3, (3,6):7, (5,6):3, ve (5,6):7, bunlardan herhangi biri kurulu çözülecek olanak sağlayacak şekilde.
  • Benzersiz / çözülmüş bir Sudoku kartı girilirse, program hiçbir şey yazdırmamalı, hatta yeni bir satır yazdırmamalıdır.
  • Program herhangi bir kart için bir saatten az bir sürede çalışmalıdır (Tamamen boş bir tahta veya üzerinde rastgele bir sayı bulunan bir tahta kullanarak test etmenizi öneririm ...).

puanlama:

  • Tüm boşluk dahil olmak üzere toplam (golf edilmiş) kod boyutunuzu karakter olarak alın ...

Bonuslar:

1/2 kod boyutu : Program tek bir ünlem işareti yazdırıyorsa ve çözüm bulunmayan bir kart olduğunda durur.

1/2 kod boyutu : Program iki ünlem işareti yazdırır ve dahili çelişki bulunan bir kart girildiğinde durursa (aynı satır / sütun / kare üzerinde iki sayı aynıdır).


3
Sıkıcı ve muhtemelen zor :(
Oleh Prypin

6
Boo. 'Hiçbir şey yazdırmayın, hatta yeni bir satır bile' GolfScript'i dışlar.
Peter Taylor

1
bunun için tam bir çözüm için asla geri dönmesi / tahmin etmesi gerekmeyen bir sudoku çözücüsü gereklidir (ve her "tahmin" gerektiğinde çıktı alın)
cırcır ucube

3
Bunu küçümsemek için bir neden göremiyorum. Güzel bir bulmacayı göstermek için çok çaba harcandı; çok açık ve düzgün bir şekilde ifade edilmiştir. Benim zevkime göre çok büyük, ama bu aşağılamak için bir sebep için çok öznel, değil mi?
kullanıcı bilinmiyor

Yanıtlar:


10

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

( Bu işlemden sonra dilin sürümünü kullanmanız gerektiğini unutmayın . Bu kod, Brachylog'un aşağıdaki sürümlerinde düzgün çalışması için bazı küçük değişikliklere ihtiyaç duyacaktır)

Bu "!!", verilen kartın dahili çelişkileri varsa yazdırır (Bu durumda TIO'da bu birkaç saniye sürer, bu yüzden sabırlı olun).

İlk bonusu doğru anladığımdan emin değilim, bu yüzden hitap etmiyorum.

Bu açıkça rekabet etmiyor, çünkü dil meydan okumadan çok daha yeni, ancak başka cevap olmadığı için bunun çok önemli olduğundan emin değilim…

açıklama

  • Ana yüklem:

    @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
    
  • Yüklem 1: Tüm "Kaldır |" hatlarında, dönüşümü ---+---+---içine -sonra bunları kaldırmak için

    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
    
  • Tahmin 2: Bir karakter bir tamsayıya veya boşsa 1 ile 9 arasındaki bir değişkene dönüştürülür.

    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
    )
    
  • Tahmin 3: Hücre giriş listesindeki tüm değerlerin farklı olması gerektiğini kabul edin

    :ha    Retrieve the head of each cell (i.e. the value) in the input 
    #d.    Apply a constraint of distinctness to those values
    
  • Tahmin 4: 3 * 3 bloktaki değerlere farklılık kısıtlaması uygulayın

    :@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
    
  • Tahmin 5:

    :3a.    Apply predicate 3 to each element of the input
    
  • Tahmin 6: Boş hücrelerin bir alt kümesine kısıtlamaları karşılayan değerler atayın, daha sonra bu değerlerle panoya yalnızca bir çözüm vardır.

    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
    
  • Tahmin 7: Tahtayı, her bir hücrenin şimdi [V:X:Y]sadece V(değer) yerine olacak şekilde dönüştürür .

    :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
    
  • Tahmin 8: Her hücre şimdi olacak şekilde bir çizgiyi dönüştürür [V:X].

    :Jm    Take the Jth element of the line
    :J.    Output is [That element:J]
    
  • Tahmin 9: Hücre değerlerini alma

    :ha.   Take the head of each element of the input
    
  • Tahmin 10: Bir alt kümenin uzunluğunu başına ekle

    lg     Put the length of the input in a list
    :?c.   Concatenate it with the input
    
  • Tahmin 11: Bir hücre yazdır

    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
Bunu sadece bir Prolog cevabına genişletemez misiniz? O zaman yarışacaktı! (Ayrı olarak gönderebilirsiniz.) Brachylog ve Prolog arasındaki eşlemenin ne kadar doğrudan olduğundan emin değilim.
Lynn

@Lynn Evet, Brachylog'un transpiler tarafından üretilen Prolog kodunu bile gönderebilirim (ki açıkça belli ki). Yine de yapmayacağım çünkü meydan okuma posterinin bir cevap kabul etmek için asla geri gelmeyeceğinden eminim: p
Fatalize
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.