Desafio:
Eu tenho milhares de músicas na minha coleção de músicas e, felizmente, meu player favorito tem uma função de pesquisa. Eu também tenho uma ótima memória - lembro o título de todas as músicas da minha coleção. No entanto, sou muito preguiçoso e não gosto de digitar - cada pressionamento de tecla extra é uma tarefa árdua!
- Qual é a string mais curta que devo procurar para isolar uma música? Ajude-me a memorizar uma lista de teclas que posso usar para minimizar a digitação ao pesquisar!
Isso é código-golfe , então o código mais curto vence.
Regras:
Dada uma lista de entrada de títulos de músicas, gere uma lista de chaves de pesquisa sujeitas às seguintes restrições:
- Cada título da música deve ter uma tecla de pesquisa.
- O número total de caracteres na lista de saída deve ser o menor possível.
- Meu music player favorito é foobar2000 :
- A função de pesquisa não diferencia maiúsculas de minúsculas. (
apple
é o mesmo queaPpLE
). - Cada chave de pesquisa deve consistir em uma ou mais "palavras", em qualquer ordem, separadas por espaços:
- Cada palavra deve ser uma substring do título da música correspondente.
- Se a mesma substring for especificada várias vezes, deverá ocorrer várias vezes no título da música correspondente.
- Se uma subcadeia em si contiver um espaço, ela deverá estar entre aspas.
- A função de pesquisa não diferencia maiúsculas de minúsculas. (
Dicas:
- Geralmente, para alguns títulos de músicas, há várias chaves de pesquisa que cumprem a regra 2. Nesse caso, qualquer tecla serve, mas você obtém pontos brownie por listar todas elas.
- Você pode supor que a lista de entrada terá apenas caracteres ASCII, mas os pontos brownie serão concedidos pela compatibilidade UTF-8.
- A Regra 3 foi difícil de seguir? Veja como funciona:
Exemplo:
Se minha coleção de músicas consistisse em apenas dois álbuns, Off the Wall and Thriler , de Michael Jackson :
Você pode usar as listas acima para testar seu programa. Aqui está a versão bruta da 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"]
?Respostas:
Python 2, 556 bytes
Experimente online.
-10 bytes, graças a @Riker, @ovs
Levei duas noites para fazer tudo funcionar.
Produz o nome da música, o conjunto de chaves de pesquisa e o comprimento das chaves de pesquisa combinadas (incluindo espaços e aspas)
Alguma explicação:
Função
len()
usada com muita frequência aqui, portanto, essa renomeação salva bytesAvalia todas as possíveis substrings do comprimento da string n.
eval(...)
comandozip(s,s[1:],s[2:],...,s[n:])
create Cria substrings de comprimento
n
de todos os índices,s
se possível. Então, paras='budd'
en='2'
produzirá bu, ud, ddFiltre para verificar se as teclas fornecidas (K) são para um nome de música exclusivo.
O re.sub é necessário para várias chaves idênticas, como ['nn', 'nn'] nos exemplos.
A função interna
def R(r,t)
é recursiva para criar todas as combinações possíveis de substring, que podem descrever o nome da música.Cada combinação é comparada com a menor atualmente (se houver) ao menor número de combinações criadas - se for maior, não será aceita como todos os seus derivados.
A função usa 2 variáveis para rastrear o estado:
n
para o comprimento da combinação de teclas mais curta atual ey
para a própria combinaçãoIsso calcula o comprimento da combinação de teclas.
' '.join
adicione espaços entre as chaves e2*sum(...)
calcule o número de cotações necessárias para chaves com espaços.Usa a primeira função lambda para obter todas as combinações de teclas possíveis (de todos os comprimentos possíveis) para a sequência atual.
Dois para ciclos para examinar todas as chaves geradas e passá-las individualmente para a próxima etapa recursiva. Lugar Key (
j
) é necessária para corretamente corda fatia no final do mesmo:r[j+T(u[i][j]):]
.O Slice fornece string, iniciada onde termina a chave atual, para que não haja sobreposições.
Se o lugar for desconhecido, chaves iguais estragariam tudo.
Muito mais do que apenas
y
, mas as teclas com espaços devem estar entre aspasfonte
0,
em um dos seus intervalos: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