È tempo di intraprendere una pericolosa ricerca per sconfiggere l'Intelligence britannica. Lo scopo di questa sfida è quello di scrivere il codice più breve che risolverà un Nonogram.
Che cos'è un nonogramma?
Le regole sono semplici Hai una griglia di quadrati, che deve essere riempita in nero o lasciata vuota. Accanto a ciascuna riga della griglia sono elencate le lunghezze delle serie di quadrati neri su quella riga. Sopra ogni colonna sono elencate le lunghezze delle serie di quadrati neri in quella colonna. Il tuo obiettivo è trovare tutti i quadrati neri. In questo tipo di puzzle, i numeri sono una forma di tomografia discreta che misura quante linee ininterrotte di quadrati riempiti ci sono in una data riga o colonna. Ad esempio, un indizio di "4 8 3" significherebbe che ci sono gruppi di quattro, otto e tre quadrati pieni, in quell'ordine, con almeno un quadrato vuoto tra gruppi successivi. [ 1 ] [ 2 ]
Quindi la soluzione al nonogramma di cui sopra sarebbe:
Dettagli di implementazione
Puoi scegliere di rappresentare il Nonogram come preferisci e prenderlo come input nel modo che ritieni adatto alla tua lingua. Lo stesso vale per l'output. Lo scopo di questa sfida è letteralmente portare a termine il lavoro; se riesci a risolvere il nonogramma con qualunque output del tuo programma, questo è valido. Un avvertimento è che non puoi usare un risolutore online :)
Questo problema è molto impegnativo dal punto di vista algoritmico (np-complete) in quanto non esiste una soluzione completamente efficiente e come tale, non sarai penalizzato per non essere in grado di risolverne di più grandi, anche se la tua risposta sarà fortemente ricompensata se lo è in grado di gestire casi importanti (vedi bonus). Come punto di riferimento, la mia soluzione funziona fino a circa 25x25 entro 5-10 secondi. Per consentire flessibilità tra le diverse lingue, le soluzioni che richiedono meno di 5 minuti per un nonogramma 25x25 sono abbastanza buone.
Puoi assumere un puzzle sempre in un nonogramma NxN quadrato.
Puoi utilizzare questo creatore di puzzle nonogramma online per testare le tue soluzioni.
punteggio
Naturalmente, sei libero di usare qualsiasi lingua tu voglia e dato che questo è il golf del codice, le voci saranno ordinate nell'ordine: accuracy -> length of code -> speed.
Tuttavia, non scoraggiarti dal linguaggio del golf, risposte in tutte le lingue che mostrano tentativi di golf in modo interessante sarà votato!
indennità
In realtà ho imparato a conoscere Nonograms da una cartolina di Natale crittografica pubblicata dall'Intelligence britannica qui . La prima parte era sostanzialmente un Nonogram 25x25 massiccio. Se la tua soluzione è in grado di risolverlo, otterrai dei complimenti :)
Per semplificarti la vita in termini di immissione dei dati, ho fornito il modo in cui ho rappresentato i dati di questo specifico puzzle per il tuo uso gratuito. Le prime 25 linee sono gli indizi delle righe, seguite da una linea di separazione "-", seguite da 25 linee degli indizi col, seguite da una linea di separazione "#", quindi da una rappresentazione della griglia con gli indizi quadrati compilati.
7 3 1 1 7
1 1 2 2 1 1
1 3 1 3 1 1 3 1
1 3 1 1 6 1 3 1
1 3 1 5 2 1 3 1
1 1 2 1 1
7 1 1 1 1 1 7
3 3
1 2 3 1 1 3 1 1 2
1 1 3 2 1 1
4 1 4 2 1 2
1 1 1 1 1 4 1 3
2 1 1 1 2 5
3 2 2 6 3 1
1 9 1 1 2 1
2 1 2 2 3 1
3 1 1 1 1 5 1
1 2 2 5
7 1 2 1 1 1 3
1 1 2 1 2 2 1
1 3 1 4 5 1
1 3 1 3 10 2
1 3 1 1 6 6
1 1 2 1 1 2
7 2 1 2 5
-
7 2 1 1 7
1 1 2 2 1 1
1 3 1 3 1 3 1 3 1
1 3 1 1 5 1 3 1
1 3 1 1 4 1 3 1
1 1 1 2 1 1
7 1 1 1 1 1 7
1 1 3
2 1 2 1 8 2 1
2 2 1 2 1 1 1 2
1 7 3 2 1
1 2 3 1 1 1 1 1
4 1 1 2 6
3 3 1 1 1 3 1
1 2 5 2 2
2 2 1 1 1 1 1 2 1
1 3 3 2 1 8 1
6 2 1
7 1 4 1 1 3
1 1 1 1 4
1 3 1 3 7 1
1 3 1 1 1 2 1 1 4
1 3 1 4 3 3
1 1 2 2 2 6 1
7 1 3 2 1 1
#
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Ed ecco una versione leggermente diversa per tua comodità; una tupla separata da virgola (riga, col) in cui ogni elemento è un elenco di elenchi.
([[7, 3, 1, 1, 7],
[1, 1, 2, 2, 1, 1],
[1, 3, 1, 3, 1, 1, 3, 1],
[1, 3, 1, 1, 6, 1, 3, 1],
[1, 3, 1, 5, 2, 1, 3, 1],
[1, 1, 2, 1, 1],
[7, 1, 1, 1, 1, 1, 7],
[3, 3],
[1, 2, 3, 1, 1, 3, 1, 1, 2],
[1, 1, 3, 2, 1, 1],
[4, 1, 4, 2, 1, 2],
[1, 1, 1, 1, 1, 4, 1, 3],
[2, 1, 1, 1, 2, 5],
[3, 2, 2, 6, 3, 1],
[1, 9, 1, 1, 2, 1],
[2, 1, 2, 2, 3, 1],
[3, 1, 1, 1, 1, 5, 1],
[1, 2, 2, 5],
[7, 1, 2, 1, 1, 1, 3],
[1, 1, 2, 1, 2, 2, 1],
[1, 3, 1, 4, 5, 1],
[1, 3, 1, 3, 10, 2],
[1, 3, 1, 1, 6, 6],
[1, 1, 2, 1, 1, 2],
[7, 2, 1, 2, 5]],
[[7, 2, 1, 1, 7],
[1, 1, 2, 2, 1, 1],
[1, 3, 1, 3, 1, 3, 1, 3, 1],
[1, 3, 1, 1, 5, 1, 3, 1],
[1, 3, 1, 1, 4, 1, 3, 1],
[1, 1, 1, 2, 1, 1],
[7, 1, 1, 1, 1, 1, 7],
[1, 1, 3],
[2, 1, 2, 1, 8, 2, 1],
[2, 2, 1, 2, 1, 1, 1, 2],
[1, 7, 3, 2, 1],
[1, 2, 3, 1, 1, 1, 1, 1],
[4, 1, 1, 2, 6],
[3, 3, 1, 1, 1, 3, 1],
[1, 2, 5, 2, 2],
[2, 2, 1, 1, 1, 1, 1, 2, 1],
[1, 3, 3, 2, 1, 8, 1],
[6, 2, 1],
[7, 1, 4, 1, 1, 3],
[1, 1, 1, 1, 4],
[1, 3, 1, 3, 7, 1],
[1, 3, 1, 1, 1, 2, 1, 1, 4],
[1, 3, 1, 4, 3, 3],
[1, 1, 2, 2, 2, 6, 1],
[7, 1, 3, 2, 1, 1]])
s=[].fill([].fill(0,0,25),0,25);s[3][3]=s[3][4]=s3[3][12]=s3[3][13]=s3[3][21]=s[8][6]=s[8][7]=s[8][10]=s[8][14]=s[8][15]=s[8][18]=s[16][6]=s[16][11]=s[16][16]=s[16][20]=s[21][3]=s[21][4]=s[21][9]=s[21][10]=s[21][15]=s[21][20]=s[21][21]=1;