sfondo
Considera una catena (chiusa) di aste, ognuna delle quali ha una lunghezza intera. Quanti distinti poliomino senza fori puoi formare con una data catena? O in altre parole, quanti diversi poligoni non autointersecanti con lati allineati agli assi puoi formare con una data catena?
Diamo un'occhiata a un esempio. Considera una catena particolare composta da 8 aste di lunghezza 1 e 2, che possiamo rappresentare come [1, 1, 2, 2, 1, 1, 2, 2]
. Fino a rotazioni e traduzioni, ci sono solo 8 possibili poliomino (contiamo diverse riflessioni):
Questa prima asta è blu scuro, quindi attraversiamo il poligono in senso antiorario .
Il senso di rotazione non influisce sul risultato nell'esempio sopra. Ma consideriamo un'altra catena [3, 1, 1, 1, 2, 1, 1]
, che produce i seguenti 3 poliomino:
Si noti che non includiamo un riflesso dell'ultimo poliomino, perché richiederebbe un movimento in senso orario.
Se avessimo una catena più flessibile della stessa lunghezza, [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
saremmo effettivamente in grado di formare entrambe le riflessioni tra alcuni altri polyonino, per un totale di 9:
La sfida
Data una descrizione di una catena, come una matrice o simile, determina il numero di poliomino distinti che puoi formare (fino a rotazioni e traslazioni) usando le aste in ordine mentre percorrono il perimetro in senso antiorario.
Scrivi un programma completo e includi i comandi per compilare (se applicabile) ed eseguire il codice dalla riga di comando. Includi anche un link a un compilatore / interprete gratuito per la tua lingua.
Il programma dovrebbe leggere l'input da STDIN. La prima riga conterrà un numero intero M . Le prossime linee M saranno casi di test, ognuno dei quali sarà un elenco separato da spazi di lunghezze di aste. Il tuo programma dovrebbe stampare M righe su STDOUT, ognuna delle quali è costituita da un singolo numero intero - il numero di poliomino distinti che possono essere formati.
Devi usare solo un singolo thread.
Il programma non deve utilizzare più di 1 GB di memoria in qualsiasi momento. (Questo non è un limite del tutto rigoroso, ma monitorerò l'utilizzo della memoria del tuo eseguibile e ucciderò qualsiasi processo che utilizza costantemente più di 1 GB o picchi significativamente al di sopra di esso.)
Per evitare quantità eccessive di pre-calcolo, il codice non deve superare i 20.000 byte e non è necessario leggere alcun file.
Inoltre, non è necessario ottimizzare i casi di test specifici scelti (ad es. Codificandone i risultati). Se sospetto che lo facciate, mi riservo il diritto di generare nuovi set di parametri. I set di test sono casuali, quindi le prestazioni del tuo programma su quelle dovrebbero essere rappresentative per le sue prestazioni su input arbitrari. L'unico presupposto che puoi fare è che la somma delle lunghezze delle aste sia pari.
punteggio
Ho fornito set di parametri di riferimento per catene di N = 10, 11, ..., 20 aste. Ogni set di test contiene 50 catene casuali con lunghezze comprese tra 1 e 4 incluso.
Il tuo punteggio principale è la N più grande per la quale il tuo programma completa l'intero set di test entro 5 minuti (sulla mia macchina, sotto Windows 8). Il tie breaker sarà il tempo effettivo impiegato dal programma su quel set di test.
Se qualcuno batte il set di test più grande, continuerò ad aggiungerne di più grandi.
Casi test
È possibile utilizzare i seguenti casi di test per verificare la correttezza dell'implementazione.
Input Output
1 1 0
1 1 1 1 1
1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 3
1 1 1 1 1 1 1 1 1 1 9
1 1 1 1 1 1 1 1 1 1 1 1 36
1 1 1 1 1 1 1 1 1 1 1 1 1 1 157
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 758
1 1 2 2 1 1 2 2 8
1 1 2 2 1 1 2 2 1 1 23
1 1 2 2 1 1 2 2 1 1 2 2 69
1 2 1 2 1 2 1 2 3
1 2 1 2 1 2 1 2 1 2 1 2 37
1 2 3 2 1 2 3 2 5
1 2 3 2 1 2 3 2 1 2 3 2 23
3 1 1 1 2 1 1 3
1 2 3 4 5 6 7 1
1 2 3 4 5 6 7 8 3
1 2 3 4 5 6 7 8 9 10 11 5
2 1 5 3 3 2 3 3 4
4 1 6 5 6 3 1 4 2
3 5 3 5 1 4 1 1 3 5
1 4 3 2 2 5 5 4 6 4
4 1 3 2 1 2 3 3 1 4 18
1 1 1 1 1 2 3 3 2 1 24
3 1 4 1 2 2 1 1 2 4 1 2 107
2 4 2 4 2 2 3 4 2 4 2 3 114
Puoi trovare un file di input con questi qui .
Classifica
User Language Max N Time taken (MM:SS:mmm)
1. feersum C++ 11 19 3:07:430
2. Sp3000 Python 3 18 2:30:181