En este desafío, se te pasan dos cosas:
- Una longitud de cuerda,
N
- Una lista de cadenas,
L
cada una con un valor de punto asignado. Cualquier cadena que no se pasa tiene un valor de punto de 0
Necesita construir una cadena de longitud N
tal que la suma de todos los puntos de la subcadena sea lo más grande posible.
Por ejemplo:
5 [("ABC", 3), ("DEF", 4), ("CDG", 2)]
debería salir
ABCDG
Debido a que las dos subcadenas con puntos ( ABC
y CDG
) tienen un total de 5 puntos, y ninguna otra construcción posible puede dar 5 o más puntos.
Las subcadenas se pueden usar varias veces en una cadena y pueden superponerse. Puede suponer que los puntos siempre serán positivos, las longitudes de las subcadenas estarán entre 1 y los N
caracteres, y eso N > 0
. Si las construcciones múltiples son máximas, imprima cualquiera de ellas.
Su programa debe ejecutarse en un período de tiempo razonable (no más de un minuto para cada uno de los ejemplos):
1 [("A", 7), ("B", 4), ("C", 100)] => C
2 [("A", 2), ("B", 3), ("AB", 2)] => AB
2 [("A", 1), ("B", 2), ("CD", 3)] => BB
2 [("AD", 1), ("B", 2), ("ZB", 3)] => ZB
3 [("AB", 2), ("BC", 1), ("CA", 3)] => CAB
3 [("ABC", 4), ("DEF", 4), ("E", 1)] => DEF
4 [("A", 1), ("BAB", 2), ("ABCD", 3)] => AAAA or ABAB or BABA or ABCD
5 [("A", 1), ("BAB", 2), ("ABCD", 3)] => BABCD or BABAB
5 [("ABC", 3), ("DEF", 4), ("CDG", 2)] => ABCDG
5 [("AB", 10), ("BC", 2), ("CA", 2)] => ABCAB
6 [("AB", 10), ("BC", 2), ("CA", 2)] => ABABAB
8 [("AA", 3), ("BA", 5)] => BAAAAAAA
10 [("ABCDE", 19), ("ACEBD", 18), ("ABEDC", 17), ("BCEDA", 16), ("EBDAC", 15), ("BACD", 14), ("CADB", 13), ("ABDC", 12), ("CABD", 11), ("EBDC", 10), ("ACE", 9), ("CBA", 8), ("AEC", 7), ("BE", 6), ("AE", 5), ("DC", 4), ("BA", 3), ("A", 2), ("D", 1)]
=> ACEBDACEBD
Este es un código de golf , ¡así que prepara tu respuesta más corta en tu idioma favorito!
fuente
DEF
tupla falta una comaRespuestas:
Python 2.7, 503 bytes
Esto no es particularmente golf, ni es particularmente eficiente; es solo una enumeración relativamente condensada de cadenas factibles forzadas por fuerza bruta. No creo que sea demasiado difícil crear una heurística admisible para usar con A *, lo que probablemente sería un poco más rápido. Sin embargo, no me molesté en hacer eso, porque este método resuelve todos los ejemplos en aproximadamente 47 segundos en mi computadora portátil.
Para probarlo:
Explicación
La
v
función simplemente calcula el valor de una cadena dada buscando todas las ocurrencias de las subcadenas en L. Lam
función enumera todas las cadenas de longitudn
con prefijoe
que se pueden generar a partir de las subcadenas enl
.m
recursivamente se llama a sí mismo; la primera llamada debe pasar''
pore
. Por ejemplo:La
p
función simplemente recorre todas las cadenas posibles (como se enumera porm
) y devuelve la que tiene el valor más alto (según lo determinado porv
).Tenga en cuenta que la
m
función realmente prioriza la enumeración ordenando según los valores de las subcadenas. Esto resulta innecesario para garantizar la optimización, y en realidad dificulta un poco la eficiencia; Podría ahorrar ~ 20 o más bytes eliminándolo.fuente