introduzione
Supponiamo che tu e il tuo amico stiate giocando. Il tuo amico pensa a una particolare sequenza di nbit 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 Strova 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 ne una sequenza binaria Rdi 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 Rdirettamente alla sequenza . L' unica cosa che è permesso fare Rè di dargli come input per la funzione len_lcsinsieme a un'altra sequenza binaria S. La funzione len_lcs(R, S)restituisce la lunghezza della sottosequenza comune più lunga di Re S. Ciò significa che la sequenza di bit più lunga che si presenta come una sottosequenza (non necessariamente contigua) in entrambi Re S. I cui input len_lcspossono avere lunghezze diverse. Il programma dovrebbe richiamare questa funzione Re altre sequenze un numero di volte, quindi ricostruire la sequenza Rsulla base di tali informazioni.
Esempio
Considera gli input n = 4e 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 Rsi ottiene "110"inserendo un bit in una certa posizione. Quindi, potremmo provare len_lcs(R, "0110"), che ritorna 3poiché 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.txtcontenente 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 ae poi lanciando un atempo 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_lcsnella tua lingua preferita.
lcsinvece 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 ...