Introdução
Um fechamento palíndrico de uma sequência de entrada é o palíndromo mais curto que pode ser construído a partir da sequência de entrada em que o palíndromo final começa com a sequência de entrada.
Para esse desafio, consideraremos um fechamento palindrômico bidirecional, de modo que
- O fechamento palíndrico esquerdo de uma sequência de entrada é o palíndromo mais curto possível que começa com a sequência de entrada.
- O fechamento palíndrico direito de uma sequência de entrada é o palíndromo mais curto possível que termina com a sequência de entrada.
- O fechamento palindrômico bidirecional de uma sequência de entrada é o mais curto entre o fechamento palindrômico esquerdo ou direito da sequência de entrada.
Tarefa
Sua tarefa é simples. Dada uma sequência (consistindo apenas em ASCII imprimível, novas linhas e espaços em branco), produza o fechamento palindrômico bidirecional dessa sequência. Em caso de empate, o fechamento palindrômico esquerdo ou direito é uma saída válida.
Você pode escrever um programa ou função, recebendo entrada via STDIN (ou alternativa mais próxima), argumento de linha de comando ou argumento de função e imprimindo o resultado em STDOUT (ou alternativa mais próxima) ou retornando-o como uma sequência.
Você pode assumir que a entrada nunca será uma sequência vazia.
Poucos exemplos:
<Input> -> <Output>
"abcdef" -> "abcdefedcba" (or "fedcbabcdef")
"abcba" -> "abcba"
"abcb" -> "abcba"
"cbca" -> "acbca"
O crédito da ideia inicial vai para o VisualMelon, idéia final com a ajuda de Martin e Zgarb
Os termos fechamento palindrômico, fechamento palindrômico esquerdo e fechamento palindrômico direito foram usados pela primeira vez e definidos por este artigo .
fonte
Respostas:
Pyth,
2219Tente online .
Explicação
O fechamento palindrômico bidirecional é da forma
AX
ouXA
, ondeX
é a cadeia de entrada eA
é uma substring deX
. Na verdade, eu tenho que ser uma substring contígua deX
, um prefixo para uma forma, um sufixo para a outra forma. Mas eu não me importo com essas falhas. Uma substring (contígua ou não) é tudo que eu preciso no Pyth.Editar
A versão antiga ordenou as strings após a filtragem por comprimento
.olN...
. Acabei de perceber, quey
retorna as substrings ordenadas por comprimento. Portanto, esses palíndromos já estão classificados.fonte
Grampo , 40
Exemplo
Explicação
fonte
CJam, 30 bytes
Estava realmente esperando ver uma resposta CJam agora. Então, aqui vai: P
Eu realmente odeio isso
{,}$
bloco, mas recebo uma lista desordenada de possíveis palíndromos devido ao algoritmo de geração que estou usando.Explicação do código
Experimente online aqui
fonte
{,}$
bloco lá também! Brincadeirinha, não tenho idéia do que qualquer coisa no CJam faz.Python 2,
11511310910596 bytesEspero que possa jogar golfe ainda mais. Bits possivelmente dignos de nota:
fonte
a
.Mathematica, 96 bytes
Deve haver uma maneira mais elegante do que isso ...
Isso define uma função sem nome que pega uma string e retorna o resultado.
A ideia básica é
Characters
.Use a correspondência de padrões para encontrar o palíndromo direito de cada um deles:
Observe que isso realmente não retorna uma lista simples. Por exemplo, para
{a,b,c}
você obterClassifique os dois resultados por comprimento.
""<>#&@@
.fonte
abacaba
quando a entrada éabac
. A resposta correta écabac
. Eu acho que você deve achatá-los antes de classificar por comprimento.Brachylog (2), 6 bytes, desafio de pós-datas no idioma
Experimente online!
Como de costume no Brachylog, essa é uma função, não um programa completo.
Explicação
Tanto quanto eu sei (não é o meu idioma, mas parece improvável),
a
não foi adicionado ao Brachylog para esse desafio, mas é realmente útil aqui. Usamos o método "reverse, e afirmamos que não mudou" para afirmar que o valor que encontramos é um palíndromo.Quanto ao motivo pelo qual isso produz o palíndromo mais curto , a ordem de avaliação de Prolog (e, portanto, de Brachylog) é fortemente influenciada pela primeira coisa que avalia. Nesse caso, é um comando "reverso" e (como a maioria das operações da lista) define uma ordem de avaliação que visa minimizar o tamanho da lista resultante. Como é o mesmo que o tamanho da saída, o programa acaba minimizando exatamente a coisa certa por acaso, o que significa que eu não precisava adicionar nenhuma dica explícita.
fonte
a
- O Adfix não foi adicionado para este desafio. Eu não tinha símbolo disponível com bons mnemônicos para prefixo e sufixo; portanto, mesclei ambos no adfix, que pode levar subscritos para selecionar prefixos ou sufixos somente se necessário.Ruby, 76 + 2 = 78
Com sinalizadores de linha de comando
-pl
(l
pode não ser necessário, dependendo de como você está fazendo a entrada), executeDada uma string 'abaa', gera as strings 'cbca 0 acbc' e 'acbc 0 cbca', em que 0 é o caractere não imprimível com código ascii 0. Em seguida, ele exclui uma cópia do enquadramento de sequência repetido mais longo 0 que encontra em cada um, 'a' no primeiro e 'cbc' no segundo, para obter os dois fechamentos. Em seguida, gera o resultado mais curto.
A única coisa realmente estranha sobre o código golfado é que ele encurta as strings no lugar enquanto as classifica, o que podemos evitar porque
min_by
executa o bloco apenas uma vez por elemento sendo comparado (tanto porque é uma transformação schwartziana quanto porque há apenas duas elementos para comparar).fonte
Python 3, 107 bytes
Testar:
fonte
Haskell, 107 bytes
Teste:
fonte
J,
6662 bytesBem direto. Os dois truques que eu uso:
O fechamento palindrômico direito é o fechamento palindrômico esquerdo da corda invertida.
Localizando o comprimento da sequência com comprimento mínimo e palindromidade com a expressão min (is_palindrome / length).
Experimente online aqui.
fonte