Unico Sudoku Finder


19

Sfida:

Data una scheda Sudoku sull'input standard, trova il numero minimo di numeri aggiunti per rendere unica la scheda.

Specifics / Regole:

  • L'input è formattato come segue (tutto lo spazio bianco è significativo)

    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
    
  • L'output è formattato con un numero per riga, formattato come (x,y):z- xey inizia da uno in alto a sinistra e aumenta in basso e a destra; z è il numero da aggiungere.

    • In questo caso questi sarebbero tutti uscite validi: (3,4):3, (3,4):7, (5,4):3, (5,4):7, (3,6):3, (3,6):7, (5,6):3, e (5,6):7, come uno qualsiasi di questi consentirebbe il bordo da risolvere.
  • Se viene inserita una scheda Sudoku unica / risolta, il programma non dovrebbe stampare nulla, nemmeno una nuova riga.
  • Il programma dovrebbe funzionare in meno di un'ora per qualsiasi scheda (suggerisco di provare usando una scheda completamente vuota o una scheda con un numero casuale su di essa ...).

punteggio:

  • Prendi la dimensione del tuo codice totale (golfizzata) in caratteri, incluso tutto lo spazio bianco ...

bonus:

1/2 codice : se il programma stampa un singolo punto esclamativo e si interrompe dopo aver inserito una scheda senza soluzioni.

1/2 codice : Se il programma stampa due punti esclamativi e si interrompe dopo aver inserito una scheda con una contraddizione interna (due numeri uguali sulla stessa riga / colonna / quadrato).


3
Noioso e probabilmente difficile :(
Oleh Prypin,

6
Boo. "Non stampare nulla, nemmeno una nuova riga" esclude GolfScript.
Peter Taylor,

1
un risolutore di sudoku che non ha mai bisogno di tornare indietro / indovinare per una soluzione completa è necessario per questo, (e ogni volta che è necessaria una "ipotesi" emetterlo)
maniaco del cricchetto

3
Non vedo il motivo per votare questo. Sono stati fatti molti sforzi per mostrare un bel puzzle; è molto chiaro e dichiarato correttamente. È troppo grande per i miei gusti, ma è troppo soggettivo per un motivo da sottovalutare, non è vero?
utente sconosciuto

Risposte:


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

(Si noti che è necessario utilizzare la versione della lingua al momento del commit . Questo codice avrebbe bisogno di alcune lievi modifiche per funzionare correttamente nelle seguenti versioni di Brachylog)

Questo stampa "!!"se la scheda data presenta contraddizioni interne (in tal caso, tuttavia, su TIO sono necessari alcuni secondi, quindi sii paziente).

Non sono sicuro di aver capito correttamente il primo bonus, quindi non lo sto affrontando.

Questo ovviamente non è in competizione poiché la lingua è molto più recente della sfida, tuttavia poiché non ci sono altre risposte, non sono sicuro che questo sia molto importante ...

Spiegazione

  • Predicato principale:

    @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
    
  • Predicato 1: Rimuovi tutto " |" sulle linee, trasformale ---+---+---in -per rimuoverle dopo

    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
    
  • Predicato 2: converti un carattere in un numero intero o, se vuoto, in una variabile tra 1 e 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
    )
    
  • Predicato 3: imporre che tutti i valori dell'elenco di input delle celle debbano essere distinti

    :ha    Retrieve the head of each cell (i.e. the value) in the input 
    #d.    Apply a constraint of distinctness to those values
    
  • Predicato 4: applicare il vincolo di distinzione ai valori in blocchi 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
    
  • Predicato 5:

    :3a.    Apply predicate 3 to each element of the input
    
  • Predicato 6: assegnare valori che soddisfano i vincoli a un sottoinsieme delle celle vuote, quindi con quei valori c'è solo una soluzione alla scheda.

    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
    
  • Predicato 7: trasforma la scheda in modo che ogni cella sia ora [V:X:Y]anziché solo V(il valore).

    :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
    
  • Predicato 8: trasforma una linea in modo tale che ogni cella sia ora [V:X].

    :Jm    Take the Jth element of the line
    :J.    Output is [That element:J]
    
  • Predicato 9: recupera i valori delle celle

    :ha.   Take the head of each element of the input
    
  • Predicato 10: aggiungere la lunghezza di un sottoinsieme all'inizio di esso

    lg     Put the length of the input in a list
    :?c.   Concatenate it with the input
    
  • Predicato 11: stampa una cella

    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
Non puoi semplicemente espanderlo in una risposta Prolog? Quindi sarebbe in competizione! (Potresti pubblicarlo separatamente.) Non sono sicuro di quanto sia diretta la mappatura tra Brachylog e Prolog.
Lynn,

@Lynn Sì, potrei anche solo pubblicare il codice Prolog che viene generato dal transpiler di Brachylog (che sarebbe altamente non golfato ovviamente). Non lo farò però perché sono abbastanza sicuro che il poster della sfida non tornerà mai ad accettare una risposta comunque: p
Fatalizza il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.