Introducción
En este desafío, su tarea es encontrar subsecuencias generalizadas de cadenas. Las subsecuencias no son necesariamente contiguas, y también pueden "envolver" la cadena, pasando su final y comenzando de nuevo desde el principio. Sin embargo, querrás minimizar la cantidad de envolturas.
Más formalmente, deja u
y v
ser dos cuerdas, y k ≥ 0
un número entero. Decimos que u
es una k
subsecuencia de ajuste de v
, si hay índices distintos de ese tipo , y como máximo satisfacen los índices . Esto significa que se puede encontrar en el interior yendo de izquierda a derecha, eligiendo algunos de sus personajes en el camino y envolviéndose en la mayoría de las veces (de manera equivalente, haciendo como máximo barridos ). Tenga en cuenta que no se puede elegir ningún personaje más de una vez, incluso después de un ajuste, y que las subsecuencias de ajuste son exactamente las subsecuencias ordinarias con las que todos estamos familiarizados.i1, i2, ..., ilen(u)
u == v[i1] v[i2] ... v[ilen(u)]
k
ij
ij > ij+1
u
v
k
k+1
v
0
La tarea
Sus entradas son dos cadenas alfanuméricas u
y no vacías v
, y su salida es el entero más pequeño k
, que u
es una k
subsecuencia de ajuste de v
. Si no k
existe tal , la salida será -1
.
Ejemplo
Considere las entradas u := xyzyxzzxyx
y v := yxzzazzyxxxyz
. Si partimos en busca de los personajes de u
en v
de una manera codiciosa, vamos a envolver alrededor de 3 veces:
yxzzazzyxxxyz
>─x─────y────z┐
┌─────────────┘
└y───────x────┐
┌─────────────┘
└──zz─────x─y─┐
┌─────────────┘
└──────────x──>
Por lo tanto, la salida correcta es como máximo 3. Observe cómo x
se selecciona el carácter más a la izquierda una vez, y luego se ignora en el segundo barrido, ya que no se puede reutilizar. Sin embargo, existe un método más corto con solo 2 envolturas:
yxzzazzyxxxyz
>──────────xyz┐
┌─────────────┘
└yxzz────x────┐
┌─────────────┘
└───────y─x───>
Resulta que una envoltura (es decir, dos barridos) no es suficiente, por lo que la salida correcta es 2
.
Reglas y bonos
Puede escribir una función o un programa completo, y también puede cambiar el orden de las entradas si es necesario. El conteo de bytes más bajo gana, y las lagunas estándar no se permiten.
Hay una bonificación de -10% para calcular todos los casos de prueba en menos de 10 segundos en total. Probaré casos poco claros en mi máquina; Mi implementación de referencia en Python toma alrededor de 0.6 segundos. Tengo una computadora portátil de 7 años con una CPU de doble núcleo de 1.86 GHz, que es posible que desee tener en cuenta.
Casos de prueba
"me" "moe" -> 0
"meet" "metro" -> -1
"ababa" "abaab" -> 1
"abaab" "baabaa" -> 1
"1c1C1C2B" "1111CCCcB2" -> 3
"reverse" "reserved" -> 2
"abcdefg" "gfedcba" -> 6
"xyzyxzzxyx" "yxzzazzyxxxyz" -> 2
"aasdffdaasdf" "asdfddasdfsdaafsds" -> 2
fuente
x
se usa en tres barridos distintos. Solo se puede usar una vez.Respuestas:
Pyth, 34 bytes
Esto define una función
g
, que toma dos cadenas como parámetro. Pruébelo en línea: Pyth Compiler / ExecutorEste código es muy ineficiente. Tiene una complejidad de tiempo y memoria de
len(v)!/(len(v)-len(u))!
. No puede resolver los casos de prueba más largos en menos de 10 segundos. (También se bloqueará muy probablemente, ya que se quedará sin memoria).fuente
Haskell, 160 * 0.9 = 144 bytes
Tiempo para todos los casos de prueba (nota: se invierten los argumentos):
Cómo funciona (versión corta): fuerza bruta simple que requiere el mínimo uso de un personaje coincidente y omitirlo. Paro la búsqueda cuando finalizo (devolviendo el número de ciclos) o cuando hice un ciclo más que el mínimo hasta ahora (devolviendo -1).
Ahorré muchos bytes en comparación con mi primera versión, principalmente porque cambié de un programa completo a una función.
Con algunos comentarios y un espaciado adecuado, Haskell es bastante legible:
Para referencia: versión anterior, programa completo, 187 bytes
fuente
JavaScript (ES6) 174 (193 - 10%)
Búsqueda recursiva, como la respuesta de @ nimi, manteniendo el mínimo de envolturas. El espacio de soluciones es grande (sobre todo para el último ejemplo), pero cortar la búsqueda en el mínimo encontrado actualmente mantiene el tiempo bajo. Editar 1 Agregar un caso de prueba faltante, acortar un poco Editar 2 No es necesario pasar el parámetro w, está solucionado
Sin golf
Prueba en la consola Firefox / FireBug
Salida (la última línea es el tiempo de ejecución en ms)
fuente