Desafío:
Tengo miles de canciones en mi colección de música y, por suerte, mi reproductor favorito tiene una función de búsqueda. También tengo un gran recuerdo: puedo recordar el título de cada canción de mi colección. Sin embargo, soy muy vago y no me gusta escribir, ¡cada pulsación de tecla adicional es una tarea!
- ¿Cuál es la cadena más corta que debo buscar para aislar una canción? ¡Ayúdame a memorizar una lista de teclas que puedo usar para minimizar la escritura al buscar!
Este es el código de golf , por lo que gana el código más corto.
Reglas:
Dada una lista de entrada de títulos de canciones, genere una lista de claves de búsqueda sujetas a las siguientes restricciones:
- El título de cada canción debe tener una clave de búsqueda.
- El número total de caracteres en la lista de salida debe ser el menor posible.
- Mi reproductor de música favorito es foobar2000 :
- La función de búsqueda no distingue entre mayúsculas y minúsculas. (
apple
es lo mismo queaPpLE
) - Cada clave de búsqueda debe constar de una o más "palabras", en cualquier orden, separadas por espacios:
- Cada palabra debe ser una subcadena del título de la canción correspondiente.
- Si la misma subcadena se especifica varias veces, entonces debe ocurrir tantas veces en el título de la canción correspondiente.
- Si una subcadena en sí contiene un espacio, entonces esa subcadena debe estar entre comillas.
- La función de búsqueda no distingue entre mayúsculas y minúsculas. (
Consejos:
- A menudo, para algunos títulos de canciones, hay varias claves de búsqueda que cumplen con la regla 2. En tal caso, cualquier clave servirá, pero obtienes puntos de brownie por enumerarlas todas.
- Puede suponer que la lista de entrada solo tendrá caracteres ASCII, pero se otorgarán puntos brownie por compatibilidad con UTF-8.
- ¿Fue difícil seguir la Regla 3? Así es como funciona:
Ejemplo:
Si mi colección de música consistiera solo en dos álbumes, Off the Wall y Thriler de Michael Jackson :
Puede usar las listas anteriores para probar su programa. Aquí está la versión en bruto de la segunda lista:
["Don't Stop 'Til You Get Enough","Rock with You","Working Day and Night","Get on the Floor","Off the Wall","Girlfriend","She's out of My Life","I Can't Help It","It's the Falling in Love","Burn This Disco Out","Wanna Be Startin' Somethin'","Baby Be Mine","The Girl Is Mine","Thriller","Beat It","Billie Jean","Human Nature","P.Y.T. (Pretty Young Thing)"]
["Wanta Be A Wanna B","Wanta Bea A Wanna B","Wanna Be A Wanna Bea"]
?Respuestas:
Python 2, 556 bytes
Pruébalo en línea.
-10 bytes, gracias a @Riker, @ovs
Me llevó un par de noches hacer que todo funcionara.
Muestra el nombre de la canción, la matriz de teclas de búsqueda y la longitud de las teclas de búsqueda combinadas (incluidos espacios y comillas)
Alguna explicación:
La función se
len()
usa muy a menudo aquí, por lo que este cambio de nombre ahorra bytesEvalúa todas las subcadenas posibles de la longitud de la cadena n.
eval(...)
crea comandozip(s,s[1:],s[2:],...,s[n:])
Crea subcadenas de longitud
n
de cada índice des
si es posible. Entonces paras='budd'
yn='2'
producirá bu, ud, ddFiltre para verificar si las teclas provistas (K) son para un nombre de canción único.
se solicita re.sub para varias claves idénticas, como ['nn', 'nn'] en los ejemplos.
La función interna
def R(r,t)
es recursiva para crear todas las combinaciones posibles de subcadenas, que pueden describir el nombre de la canción.Cada combinación se compara con la más corta actualmente (si hubiera alguna) para reducir el número de combinaciones creadas; si es más grande, no se aceptará como todas sus derivadas.
La función utiliza 2 variables para rastrear el estado:
n
para la longitud de la combinación de teclas más corta actual yy
para la combinación mismaEsto calcula la longitud de la combinación de teclas.
' '.join
agrega espacios entre claves y2*sum(...)
calcula el número de comillas necesarias para claves con espacios.Utiliza la primera función lambda para obtener todas las combinaciones de teclas posibles (de cada longitud posible) para la cadena actual.
Dos ciclos para ver todas las claves generadas y pasarlas individualmente al siguiente paso recursivo. Lugar clave (
j
se necesita) para encadenar rebanada correctamente al final de la misma:r[j+T(u[i][j]):]
.Slice proporciona una cadena, que comenzó donde termina la clave actual, por lo que no habrá superposiciones.
Si se desconoce el lugar, las teclas iguales estropearían todo.
Mucho más que solo
y
, pero las teclas con espacios deben estar entre comillasfuente
0,
uno de tus rangos:u=[L(r,i)for i in range(0,T(r))]
=>u=[L(r,i)for i in range(T(r))]
.S=map(str.lower,input())
para -5 bytes