Introducción
Supongamos que usted y su amigo están jugando un juego. Tu amigo piensa en una secuencia particular de n
bits, y tu tarea es deducir la secuencia haciéndoles preguntas. Sin embargo, el único tipo de pregunta que se le permite hacer es "¿Cuánto dura la subsecuencia común más larga de su secuencia y S
", dónde S
es cualquier secuencia de bits. Cuantas menos preguntas necesite, mejor.
La tarea
Su tarea es escribir un programa o función que tome como entrada un entero positivo n
y una secuencia binaria R
de longitud n
. La secuencia puede ser una matriz de enteros, una cadena o algún otro tipo razonable de su elección. Su programa generará la secuencia R
.
Su programa no puede acceder a la secuencia R
directamente. Lo único que se le permite hacer R
es darle como entrada a la función len_lcs
junto con otra secuencia binaria S
. La función len_lcs(R, S)
devuelve la longitud de la subsecuencia común más larga de R
y S
. Esto significa la secuencia más larga de bits que ocurre como una subsecuencia (no necesariamente contigua) en ambos R
y S
. Las entradas de las len_lcs
cuales pueden ser de diferentes longitudes. El programa debe invocar esta función R
y otras secuencias varias veces, y luego reconstruir la secuencia en R
función de esa información.
Ejemplo
Considere las entradas n = 4
y R = "1010"
. Primero, podríamos evaluar len_lcs(R, "110")
, lo que da 3
, ya que "110"
es la subsecuencia común más larga de "1010"
y "110"
. Entonces sabemos que R
se obtiene "110"
al insertar un bit en alguna posición. A continuación, podríamos intentar len_lcs(R, "0110")
, que regresa 3
ya que las subsecuencias comunes más largas son "110"
y "010"
, por "0110"
lo tanto, no es correcta. Luego intentamos len_lcs(R, "1010")
, que vuelve 4
. Ahora sabemos eso R == "1010"
, por lo que podemos devolver esa secuencia como la salida correcta. Esto requirió 3 llamadas a len_lcs
.
Reglas y puntaje
En este repositorio , encontrará un archivo llamado que subsequence_data.txt
contiene 100 secuencias binarias aleatorias de longitudes entre 75 y 124. Se generaron tomando tres flotadores aleatorios entre 0 y 1, tomando su promedio como a
, y luego volteando una a
moneda imparcial n
veces. Su puntaje es el número promedio de llamadas alen_lcs
estas secuencias, siendo menor el puntaje menor. Su envío debe registrar el número de llamadas. No hay límites de tiempo, excepto que debe ejecutar su programa en el archivo antes de enviarlo.
Su presentación será determinista. Los PRNG están permitidos, pero deben usar la fecha de hoy 200116
(o el equivalente más cercano) como semilla aleatoria. No está permitido optimizar su envío en relación con estos casos de prueba particulares. Si sospecho que esto está sucediendo, generaré un nuevo lote.
Este no es un código de golf, por lo que se recomienda escribir código legible. Rosetta Code tiene una página en la subsecuencia común más larga ; puede usar eso para implementar len_lcs
en su idioma de elección.
lcs
lugar de hacerlo len_lcs
.
lcs(R, "01"*2*n)
regresa R
. ;) Pero eso podría funcionar si llamar lcs(R, S)
aumentaría el puntaje en len(S)
lugar de 1, o algo así ...