sfondo
Il nonogramma , noto anche come Picross o Griddlers, è un enigma in cui l'obiettivo è determinare se ogni cella sulla griglia 2D deve essere colorata o lasciata vuota, utilizzando il numero di celle colorate consecutive su ciascuna linea.
Di seguito è riportato un esempio di puzzle Nonogram con soluzione.
Il problema è che alcuni giochi / app mobili Nonogram commerciali hanno enigmi che non sono risolvibili manualmente (ad es. Hanno soluzioni multiple o richiedono un backtracking profondo). Tuttavia, offrono anche alcune vite al giocatore, dove si perde una vita quando si tenta di colorare una cella la cui risposta corretta è vuota . Quindi ora è il momento di forzare quei brutti "puzzle"!
Per semplificare l'attività, immagina solo una riga con il suo indizio e nient'altro:
3 7 | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
La [3,7]
sono gli indizi, e la lunghezza della linea è 15 celle. Dal momento che ha molteplici possibili soluzioni, dobbiamo rischiare alcune vite per risolvere completamente questa linea (cioè determinare tutte le celle colorate).
Sfida
Data una linea con indizi (un elenco di numeri interi positivi) e la lunghezza della linea, trova il numero massimo di vite che perderai, supponendo che la forza bruta la linea con una strategia ottimale.
Nota che indovina sempre le celle colorate . Nei giochi reali, indovinare le celle vuote (giuste o sbagliate) non ha alcun effetto sulla tua vita, quindi non puoi "risolvere" il puzzle in quel modo.
Inoltre, puoi presumere che l'input rappresenti sempre una linea Nonogram valida, quindi non devi preoccuparti di qualcosa del genere [6], 5
.
Spiegazione
Vediamo prima alcuni esempi più semplici.
[1,2], 5
Esistono esattamente tre possibilità per questa linea ( O
è una cella colorata, .
è vuota):
O . O O .
O . . O O
. O . O O
Se proviamo a colorare la cella 0 (indice basato su 0 da sinistra), si verifica una delle seguenti condizioni:
- La cella è colorata correttamente. Ora abbiamo due possibilità e possiamo scegliere tra la cella 2 e la cella 4 per risolvere completamente la linea. In entrambi i casi, nel peggiore dei casi perderemo una vita.
- La cella è vuota e perdiamo una vita. In questo caso, abbiamo già identificato la soluzione unica per questa linea, quindi abbiamo finito con 1 punto vita perso.
Pertanto, la risposta per [1,2], 5
è 1.
[5], 10
Ricerca binaria? No.
La prima scelta più ovvia è 4 o 5, che rivelerà una possibilità se è vuota (al costo di 1 vita). Diciamo che abbiamo scelto prima 4. Se la cella 4 è effettivamente colorata, la estendiamo a sinistra, cioè proviamo 3, 2, 1 e 0 fino a quando una vita non viene persa (o la cella 0 viene colorata, quindi finiamo per non spendere affatto vite). Ogni volta che si perde una vita, possiamo determinare in modo univoco la soluzione, ad esempio se vediamo qualcosa del genere:
_ _ X O O _ _ _ _ _
allora sappiamo già che la risposta è questa:
. . . O O O O O . .
Pertanto, la risposta [5], 10
è anche 1.
[3,7], 15
Inizia con la cella 11, che, se vuota, rivelerà immediatamente la seguente soluzione.
O O O . O O O O O O O X . . .
Quindi prova 12, che, se vuoto, offre due possibilità che possono essere risolte al costo di 1 vita extra.
O O O . . O O O O O O O X . .
. O O O . O O O O O O O X . .
Ora prova 2. Se vuoto, porta a tre possibilità che possono essere risolte in modo simile [1,2], 5
all'esempio.
. . X O O O . O O O O O O O .
. . X O O O . . O O O O O O O
. . X . O O O . O O O O O O O
Se continui a ridurre al minimo il rischio in questo modo, puoi raggiungere qualsiasi soluzione con max. 2 vite trascorse.
Casi test
[1,2] 5 => 1
[2] 5 => 2
[1] 5 => 4
[] 5 => 0
[5] 10 => 1
[2,1,5] 10 => 0
[2,4] 10 => 2
[6] 15 => 2
[5] 15 => 2
[4] 15 => 3
[3,7] 15 => 2
[3,4] 15 => 3
[2,2,4] 15 => 4
[1,1,1,1,1,1,1] 15 => 2
[2,1,1,3,1] 15 => 3
[1,1,1,2,1] 15 => 5
Negli ultimi due casi, la strategia ottimale non passa attraverso gli spazi minimi, ma va semplicemente da sinistra a destra (o da destra a sinistra). Grazie a @crashoz per averlo segnalato.
Regole
Si applicano le regole standard del code-golf . Vince l'invio valido più breve in byte.
generosità
Se qualcuno esce con un algoritmo del tempo polinomiale (con la prova della correttezza), assegnerò una taglia di +100 a tale soluzione.
[6], 5
?