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 1
stessa riga, una 2
nella stessa casella 3x3, ...), una cella con i candidati 6 7
, una cella con i candidati 3 6
e una cella con i candidati 2 6
. La strategia dell'ala Y suggerirà che il 6
può essere rimosso dai candidati della cella vera e propria, lasciando solo un 2
candidato, che puoi compilare. Quindi abbiamo trovato un numero corretto e siamo un passo avanti nella risoluzione del Sudoku completo.
Perché può 6
essere rimosso?
Spiegazione
Supponiamo che 6
sia il numero corretto per la cella vera e propria. Ora c'è un 6
in questa colonna, quindi possiamo rimuovere il 6
dai 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 6
e compilare il file 3
. Ora se osserviamo la cella in alto a sinistra otteniamo una contraddizione. Perché ora c'è già un 7
nella stessa riga e un 3
nella stessa colonna, quindi possiamo rimuovere il 7
e il 3
dei 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 C
dalla [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 ( D
può essere zero, uno o anche più candidati).
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 1
candidato 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 1
lattina apre le porte a diverse strategie.
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] # -||-
7 8
sono i candidati per la prima e la seconda cella. La strategia dell'ala Y può ancora essere applicata.