Isso foi inspirado por uma pergunta CS.SE agora removida .
Tarefa
Dadas duas seqüências de entrada não vazias A e B, produza a menor distância de A até um palíndromo que contém B como uma substring. A distância é definida pelo número de substituições de caracteres ( distância de Hamming ).
Restrições
- Entrada sensível: existe um palíndromo. Isso significa | A | ≥ | B |.
- A e B contêm apenas caracteres ASCII inferiores, minúsculas e maiúsculas são distintas (como todos os outros caracteres).
- Se seu idioma não puder lidar com caracteres ASCII, você também poderá usar números inteiros (ou algum outro tipo de dados razoável) e poderá optar por limitar o intervalo a 128 elementos.
- Você pode obter informações de stdin, argumentos de função, argumentos de linha de comando etc.
- Você pode fornecer o resultado em stdout, valor de retorno etc.
- Você não precisa dar um palíndromo em funcionamento, a menor distância a um é suficiente.
Exemplos
A B Output
thilloaoyreot hello 4 (thelloaolleht)
benjonson stack 9 (stackcats)
neversaynever! odd 9 (neveroddoreven)
ppcggcpp gg 0 (ppcggcpp)
stars tat 1 (stats)
Pontuação
Este é o código golf, o código mais curto em bytes vence.
code-golf
string
palindrome
Comunidade
fonte
fonte
Pitão, 45 bytes
Experimente online. Suíte de teste.
Ainda não estou exatamente satisfeito com o resultado. Mas pelo menos é muito difícil de entender sem uma explicação agora. (Sucesso, eu acho?)
Explicação
Q
e B comoz
.m
…_BQ
Calcule o seguinte para A e seu reverso comod
:m
…h-ldlz
Calcule o seguinte para todosk
de 0 alen(A) - len(B)
inclusivo:+Bklz
Pegue o park, k + len(B)
.cd
Dividird
nesses índices.X
…1z
Substitua a segunda parte (do meio) por B.Ks
Concatene as peças e salve emK
. B agora está inserido na posiçãok
A ou em seu reverso.hc2
Divida a sequência resultante em duas e mantenha a primeira peça. Isso fornece metade da string com o possível caractere do meio.hc2PK
Remova o último caractere e faça a mesma divisão, mantendo a primeira peça. Isso fornece metade da string sem o possível caractere do meio.+
…_
Adicione o verso da peça mais curta à peça mais longa. Agora temos um palíndromo.s
Concatene os resultados para A e seu reverso.f}zT
Remova todas as seqüências que não contêm B.m
Calcule o seguinte para todas as cadeias resultantesd
:nVQd
Obtenha a desigualdade aos pares com A. Isso fornece True para pares que precisam ser alterados.s
Soma a lista. Isso dá a distância de Hamming.hS
Tome o resultado mínimo.fonte
JavaScript (Firefox 30+),
152146 bytesAbordagem de força bruta: gere cada possível sobreposição de A e B, transforme cada uma em um palíndromo, calcule as distâncias de Hamming de A e faça a menor das distâncias resultantes.
Provavelmente poderia ser jogado um pouco mais ...
Snippet de teste
Mostrar snippet de código
fonte