Este é um espelho: |
. Acabei de descobrir que você pode colar um espelho no meio de uma string se a string puder ser espelhada em si mesma! Por exemplo, a sequência abccba
. Se você cortá-lo ao meio, as duas metades são imagens espelhadas uma da outra:
abc <--> cba
Então, podemos colocar um espelho no meio da string, e nossa nova string é abc|cba
. Às vezes, apenas parte da cadeia pode ser espelhada em si mesma. Por exemplo, a cadeia "espelho". Os dois r's são espelhados, mas o resto da string não é. Tudo bem, apenas removeremos as partes da sequência que não se espelham e obteremos a seguinte sequência:
r|r
Algumas seqüências de caracteres podem ser espelhadas em vários lugares. Por exemplo, "Olá, mundo, xyzzyx". Eu gosto de ter muito texto refletido no meu espelho, então você precisa encontrar o melhor lugar para colocar o meu espelho. Nesse caso, você deve gerar a string espelhada mais longa e, como no nosso último exemplo, remover todo o resto. Essa sequência se torna:
xyz|zyx
Algumas seqüências parecem poder ser espelhadas, mas na verdade não podem. Se uma sequência não puder ser espelhada em nenhum lugar, você não deverá produzir nada.
O desafio:
Dada uma string contendo apenas ascii imprimíveis, encontre o melhor lugar para colocar meu espelho. Em outras palavras,
Encontre a maior substring palindrômica de tamanho uniforme e, em seguida, imprima-a com um caractere de pipe '|' no meio disso.
A entrada terá de 1 a 50 caracteres.
Você pode assumir que a entrada não conterá espelhos |
ou novas linhas. Além disso, todos os personagens imprimíveis-ascii são um jogo justo. Se a subseqüência espelhada mais longa estiver ligada entre duas subseqüências, você poderá escolher qual delas produzirá. Por exemplo, para a cadeia "abba ollo", você deve gerar "ab | ba" ou "ol | lo", mas não importa qual deles você produz. As strings diferenciam maiúsculas de minúsculas, por exemplo, "ABba" não deve gerar "AB | ba", deve gerar a string vazia.
IO de amostra:
"Hello World" --> "l|l"
"Programming Puzzles and Code-Golf" --> Either "m|m" or "z|z"
"abcba" --> ""
"Hulluh" --> "ul|lu"
"abcdefggfedcba" --> "abcdefg|gfedcba"
"abcdefggfabc" --> "fg|gf"
"AbbA" --> "Ab|bA"
"This input is a lot like the last one, but with more characters that don't change the output. AbbA" --> "Ab|bA"
Como de costume, isso é código-golfe, então as brechas padrão se aplicam e a resposta mais curta em bytes vence!
fonte
Respostas:
Pitão -
19171513 bytesObrigado a @FryAmTheEggman por me salvar dois bytes.
ARRGH o caso especial para nenhuma resposta.Resolvido isso!Conjunto de Teste .
fonte
:Q)
= Bignose05AB1E ,
191714 bytesCódigo:
Explicação:
Usa a codificação CP-1252 . Experimente online! .
fonte
Python 2,
10297 bytesBastante lento e ineficiente ... Verifique os casos de teste menores no Ideone .
fonte
JavaScript,
10099 bytesou
fonte
eval
?eval
para evitarreturn
for
não é uma expressão, por isso, normalmente, requerem chaves e umreturn
Lua, 133 bytes
Verifique todos os casos de teste em Ideone.com .
fonte
t==t:reverse()
para salvar um byte :)Retina , 66 bytes
A contagem de bytes assume a codificação ISO 8859-1.
Experimente online! (A primeira linha permite testar vários casos de teste separados por avanço de linha de uma só vez.)
Hmmm, muito mais tempo do que eu gostaria ...
fonte
JavaScript (ES6), 91
Menos golfe
Teste
fonte
Perl 5,
10510098 + 1 =10610199 bytesEu só queria experimentar regexes recursivas. Precisa da
-p
opção. Edit: Salvo (riscado 4) 7 bytes graças a @ msh210. (O byte ausente deve-se a uma economia que foi substituída pela última economia de @ msh210.)fonte
@_=(@_,$1)
pode serpush@_,$1
. (2) Omita as novas linhas e a final;
. (3) Eu suspeito que há uma condição de ordenação mais curto que você pode usar (se nada mais, pelo menos --- --- talvez substituto-
para<=>
)-
e não funcionou (provavelmente precisa de parênteses de precedência, o que prejudica a economia).y...c>>1
ou emy...c/2
vez delength>>1
. (Não testado.)Python 2, 91 bytes
Substitua
\x7f
pelo caractere real DEL, que é ASCII 127 (crédito para Dennis).Isso segue uma estratégia semelhante à resposta de Dennis de usar
max
e ramificar recursivamente para encontrar o intervalo palíndromo mais longo. Mas, em vez disso, encontra a metade esquerda, verificando se a metade direita espelhada correspondente vem logo depois com uma partida feita por ele mesmo .A função adivinha se o primeiro caractere está na metade esquerda espelhada. Caso contrário, ele simplesmente o solta e se repete no restante. Se for, é adicionado à pilha
p
de caracteres invertidos. Se a sequência de caracteres começar com a pilha, a sequência de espelhos será gerada e considerada como um espelho mais longo possível. Para evitar|
como saída, apenas pilhas não vazias são consideradas.fonte
Geléia , 17 bytes
Experimente online!
Feito com a ajuda do Sr. Xcoder e DJMcMayhem no chat
Como funciona
fonte
Haskell,
126111 bytesfonte
TSQL
227223 bytesEu codifiquei o comprimento para no máximo 99 bytes, isso salvou os bytes, mas o tornei mais lento. Ainda tem um desempenho decente.
Golfe:
Ungolfed:
Violino
fonte
Python 2, 149 bytes
Experimente online
Este programa encontra a primeira metade da maior substring palindrômica de comprimento par e imprime essa sequência, seguida de a
|
, seguida pela sequência invertida. Se não houver uma sequência adequada,t
será a sequência vazia e'|'*(L(t)>0)
será avaliada como a sequência vazia.fonte
Java 8,
294283232 bytesExplicação:
Experimente aqui.
fonte