introduzione
Supponiamo che tu e il tuo amico stiate giocando. Il tuo amico pensa a una particolare sequenza di n
bit e il tuo compito è quello di dedurre la sequenza ponendo loro delle domande. Tuttavia, l'unico tipo di domanda che ti è consentito porre è "Quanto tempo è la sottosequenza comune più lunga della sequenza e S
", dove si S
trova una sequenza di bit. Meno domande hai bisogno, meglio è.
L'obiettivo
Il tuo compito è scrivere un programma o una funzione che accetta come input un numero intero positivo n
e una sequenza binaria R
di lunghezza n
. La sequenza può essere una matrice di numeri interi, una stringa o qualche altro tipo ragionevole di tua scelta. Il programma deve generare la sequenza R
.
Il tuo programma non è autorizzato ad accedere R
direttamente alla sequenza . L' unica cosa che è permesso fare R
è di dargli come input per la funzione len_lcs
insieme a un'altra sequenza binaria S
. La funzione len_lcs(R, S)
restituisce la lunghezza della sottosequenza comune più lunga di R
e S
. Ciò significa che la sequenza di bit più lunga che si presenta come una sottosequenza (non necessariamente contigua) in entrambi R
e S
. I cui input len_lcs
possono avere lunghezze diverse. Il programma dovrebbe richiamare questa funzione R
e altre sequenze un numero di volte, quindi ricostruire la sequenza R
sulla base di tali informazioni.
Esempio
Considera gli input n = 4
e R = "1010"
. Innanzitutto, potremmo valutare len_lcs(R, "110")
, il che dà 3
, poiché "110"
è la sottosequenza comune più lunga di "1010"
e "110"
. Quindi sappiamo che R
si ottiene "110"
inserendo un bit in una certa posizione. Quindi, potremmo provare len_lcs(R, "0110")
, che ritorna 3
poiché le sottosezioni comuni più lunghe sono "110"
e "010"
, quindi "0110"
non è corretto. Quindi proviamo len_lcs(R, "1010")
, che ritorna 4
. Ora lo sappiamo R == "1010"
, quindi possiamo restituire quella sequenza come output corretto. Ciò ha richiesto 3 chiamate a len_lcs
.
Regole e punteggio
In questo repository , troverai un file chiamato subsequence_data.txt
contenente 100 sequenze binarie casuali di lunghezze comprese tra 75 e 124. Sono state generate prendendo tre float casuali tra 0 e 1, prendendo la loro media come a
e poi lanciando un a
tempo di moneta parziale n
. Il tuo punteggio è il numero medio di chiamate alen_lcs
queste sequenze, il punteggio più basso è migliore. Il tuo invio dovrebbe registrare il numero di chiamate. Non ci sono limiti di tempo, tranne che è necessario eseguire il programma sul file prima di inviarlo.
La tua richiesta deve essere deterministica. I PRNG sono consentiti, ma devono utilizzare la data odierna 200116
(o l'equivalente più vicino) come seme casuale. Non ti è consentito ottimizzare la tua presentazione rispetto a questi casi di test particolari. Se sospetto che ciò accada, genererò un nuovo batch.
Questo non è un codice golf, quindi sei incoraggiato a scrivere un codice leggibile. Il codice Rosetta ha una pagina sulla sottosequenza comune più lunga ; puoi usarlo per implementare len_lcs
nella tua lingua preferita.
lcs
invece di len_lcs
.
lcs(R, "01"*2*n)
ritorna R
. ;) Ma potrebbe funzionare se la chiamata lcs(R, S)
aumentasse il punteggio len(S)
invece di 1, o qualcosa del genere ...