Strategia dell'ala Y per il Sudoku


11

Di recente ho ottenuto una nuova app Sudoku che produce Sudoku davvero difficili, che non possono essere risolti utilizzando le strategie standard. Quindi ho dovuto imparare alcuni nuovi. Una di queste strategie è la strategia Y-Wing . È classificato in "Strategie difficili", ma in realtà non è poi così difficile.

Esempio

Per questa strategia sono importanti solo 4 celle. Pertanto ho ignorato tutte le altre celle nelle immagini.

Guardiamo tutti i candidati per ogni cella. Nell'esempio seguente abbiamo una cella con i candidati 3 7(ciò significa che abbiamo già rifiutato i candidati 1 2 4 5 6 8 9, ad esempio perché è presente una 1stessa riga, una 2nella stessa casella 3x3, ...), una cella con i candidati 6 7, una cella con i candidati 3 6e una cella con i candidati 2 6. La strategia dell'ala Y suggerirà che il 6può essere rimosso dai candidati della cella vera e propria, lasciando solo un 2candidato, che puoi compilare. Quindi abbiamo trovato un numero corretto e siamo un passo avanti nella risoluzione del Sudoku completo.

Primo esempio

Perché può 6essere rimosso?

Spiegazione

Supponiamo che 6sia il numero corretto per la cella vera e propria. Ora c'è un 6in questa colonna, quindi possiamo rimuovere il 6dai candidati della cella in alto a destra, lasciando solo un 7, che possiamo compilare. Lo stesso accade con la cella in basso a sinistra. Possiamo rimuovere 6e compilare il file 3. Ora se osserviamo la cella in alto a sinistra otteniamo una contraddizione. Perché ora c'è già un 7nella stessa riga e un 3nella stessa colonna, quindi possiamo rimuovere il 7e il 3dei candidati, senza lasciare alcun candidato. Ciò che chiaramente non è possibile. Pertanto il 6 non può essere il numero corretto della cella verticale.

Più precisamente: se abbiamo 4 celle con i candidati [A B] [A C] [C D] [B C](in questo ordine o ruotate circolarmente) e le celle sono collegate (tramite la stessa riga, la stessa colonna o la stessa casella 3x3) in un cerchio (la cella 1 è collegata alla cella 2, che è collegato alla cella 3, che è collegata alla cella 4, che è collegata alla cella 1), che è possibile rimuovere Cdalla [C D]cella. E 'fondamentale, che le tre celle [A B], [A C]e [B C]contengono solo due candidati ciascuno. Diversamente la cella [C D], che può contenere più o meno ( Dpuò essere zero, uno o anche più candidati).

Esempio con lettere anziché numeri

Si noti che ho esplicitamente detto che possono essere collegati in entrambi i modi. Nel prossimo esempio puoi vedere di nuovo la strategia applicata. Ma questa volta le 4 celle non formano un rettangolo. Le celle verso il basso a sinistra e verso il basso sono semplicemente collegate, perché sono nella stessa scatola 3x3. Y-Wing dice che possiamo rimuovere il 1candidato della cella in alto a sinistra. Questa volta ci sono ancora 2 candidati in questa cella, quindi non abbiamo trovato un nuovo numero corretto. Tuttavia, la rimozione della 1lattina apre le porte a diverse strategie.

Secondo esempio, non in un rettangolo

Se vuoi maggiori informazioni sulla strategia o vuoi qualche altro esempio, visita sudokuwiki.org .

Specifiche della sfida

Riceverai 4 liste come input, che rappresentano i candidati delle celle. Le quattro celle sono collegate come un cerchio (la cella 1 è collegata alla cella 2, che è collegata alla cella 3, che è collegata alla cella 4, che è collegata alla cella 1). Puoi presumere che ogni elenco sia ordinato in ordine crescente.

Il tuo compito è rimuovere un candidato (applicando la strategia Y-Wing) e restituendo le liste dei candidati risultanti nello stesso ordine. Se non riesci ad applicare la strategia, restituisci le stesse liste di candidati.

Se ci sono due possibili soluzioni (è possibile rimuovere A della cella B o rimuovere C della cella D), quindi restituire solo una soluzione. Non importa quale.

L'input può essere in qualsiasi elenco nativo o formato array. È inoltre possibile utilizzare un elenco di elenchi o qualcosa di simile. È possibile ricevere l'input tramite STDIN, argomento della riga di comando, argomento prompt o funzione e restituire l'output tramite il valore restituito o semplicemente stampando su STDOUT.

Questo è code-golf. Vince il codice più breve (in byte).

Casi test

[3 7] [6 7] [2 6] [3 6]       => [3 7] [6 7] [2] [3 6]   # Example 1
[6 7] [2 6] [3 6] [3 7]       => [6 7] [2] [3 6] [3 7]   # Example 1, different order
[2 6] [3 6] [3 7] [6 7]       => [2] [3 6] [3 7] [6 7]   # Example 1, different order
[3 6] [3 7] [6 7] [2 6]       => [3 6] [3 7] [6 7] [2]   # Example 1, different order
[1 2 8] [1 8] [8 9] [1 9]     => [2 8] [1 8] [8 9] [1 9] # Example 2
[3 8] [4 8] [3 4 8] [3 4]     => [3 8] [4 8] [3 8] [3 4]
[1 3 6 7 8] [3 8] [3 4] [4 8] => [1 3 6 7] [3 8] [3 4] [4 8]
[7 8] [7 8] [4 7] [4 8]       => [7 8] [8] [4 7] [4 8] or [7] [7 8] [4 7] [4 8]
[4 7] [7 8] [4 8] [4]         => [4 7] [7 8] [4 8] []    # Fictional example
[3 7] [2 6] [6 7] [3 6]       => [3 7] [2 6] [6 7] [3 6] # Y-Wing can't be applied here
[4 7] [2 7 8] [4 8] [1 4]     => [4 7] [2 7 8] [4 8] [1 4] # -||-

Più set in un singolo input possono essere esattamente gli stessi?
Ottimizzatore

@Optimizer Sì, ad esempio nell'ottavo caso di test, 7 8sono i candidati per la prima e la seconda cella. La strategia dell'ala Y può ancora essere applicata.
Jakube,

@Jakube ah ok, non l'ho visto.
Ottimizzatore

Se sono possibili più di 1 soluzioni, posso emetterne una?
Ottimizzatore

Sì, l'ho chiarito nella domanda.
Jakube,

Risposte:


3

CJam, 90 byte

Ugghhh, questo è troppo lungo a causa del vincolo che le altre 3 celle dovrebbero avere solo 2 candidati.

l~_:_(a+2/::&_{,}$2>:&:Y;{:PY&Y{P1<}?~}%:X,3>1${,}$W=_,2>\Y&,1?*{X:_(+2/{~:I=}#)_2$=I-t}&p

Questo prevede input come un elenco di elenchi in formato CJam. Per es .:

[[2 6] [3 6] [3 7] [6 7]]

fornisce l'output in un elenco CJam del formato elenco:

[[2] [3 6] [3 7] [6 7]]

Aggiungerò una spiegazione dopo aver finito di giocare a golf

Provalo online qui o prova l'intera suite di test qui .


3

Mathematica, 124 110 byte

Cases[e@n_:>n]/@(Plus@@e/@#&/@#/.NestList[RotateLeft/@#&,{x:a_+b_,y:b_+c_,z:c_+a_,w:a_+_.}->{x,y,z,w-a+1},3])&

Esempi:

In[1]:= yWing = Cases[e@n_:>n]/@(Plus@@e/@#&/@#/.NestList[RotateLeft/@#&,{x:a_+b_,y:b_+c_,z:c_+a_,w:a_+_.}->{x,y,z,w-a+1},3])& ;

In[2]:= yWing[{{3, 7}, {6, 7}, {2, 6}, {3, 6}}]

Out[2]= {{3, 7}, {6, 7}, {2}, {3, 6}}

In[3]:= yWing[{{4, 7}, {7, 8}, {4, 8}, {4}}]

Out[3]= {{4, 7}, {7, 8}, {4, 8}, {}}
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.