Neste desafio, você recebe duas coisas:
- Um comprimento de corda,
N
- Uma lista de strings,
L
cada uma com um valor de ponto atribuído. Qualquer string que não é passada tem um valor de ponto 0
Você precisa construir uma sequência de comprimento para N
que a soma de todos os pontos de substring seja o maior possível.
Por exemplo:
5 [("ABC", 3), ("DEF", 4), ("CDG", 2)]
deve produzir
ABCDG
Como as duas substrings com pontos ( ABC
e CDG
) têm um total de 5 pontos, e nenhuma outra construção possível pode dar 5 ou mais pontos.
As seqüências de caracteres podem ser usadas várias vezes em uma sequência e podem se sobrepor. Você pode supor que os pontos sempre serão positivos, os comprimentos da substring estarão entre 1 e os N
caracteres, e isso N > 0
. Se várias construções forem máximas, imprima qualquer uma delas.
Seu programa deve ser executado em um período de tempo razoável (não mais que um minuto para cada um dos exemplos):
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 é um código-golfe , então prepare sua resposta mais curta no seu idioma favorito!
fonte
DEF
tupla está faltando uma vírgulaRespostas:
Python 2.7, 503 bytes
Isso não é particularmente jogado, nem é particularmente eficiente; é apenas uma enumeração relativamente condensada de sequências viáveis que são forçadas a bruto. Eu não acho que seria muito difícil criar uma heurística admissível para usar com A *, o que provavelmente seria um pouco mais rápido. Não me incomodei em fazer isso, porque esse método resolve todos os exemplos em cerca de 47 segundos no meu laptop.
Para testá-lo:
Explicação
A
v
função simplesmente calcula o valor de uma determinada sequência procurando todas as ocorrências das subseqüências em L. Am
função enumera todas as seqüências de comprimenton
com prefixoe
que pode ser gerado a partir das subseqüências eml
.m
chama-se recursivamente; a primeira chamada deve passar''
parae
. Por exemplo:A
p
função simplesmente percorre todas as seqüências possíveis (conforme enumeradas porm
) e retorna a que tiver o valor mais alto (conforme determinado porv
).Observe que a
m
função realmente prioriza a enumeração classificando com base nos valores das substrings. Isso acaba sendo desnecessário para garantir a otimização e realmente atrapalha um pouco a eficiência; Eu poderia salvar ~ 20 ou mais bytes removendo-o.fonte