Sua tarefa é determinar o quanto de um palíndromo perfeito é uma string. Seu palíndromo típico (por exemplo, 12321) é um palíndromo perfeito; sua perfeição é 1.
Para determinar a perfeição de uma sequência, você vê quantas seções você pode dividir em onde cada seção é um palíndromo. Se houver ambiguidades, como com aaaa
, como você pode dividi-lo em [aa, aa]
ou [aaaa]
ou [a, aaa]
ou [aaa, a]
, o menor conjunto substituirá, dando aaaa
uma pontuação de 1, que é o tamanho do menor.
Portanto, você deve escrever um programa ou função que receba uma entrada não vazia e produza quão perfeita ela é (qual é o comprimento do menor conjunto que você pode dividir em que cada elemento do conjunto é um palíndromo).
Exemplos:
1111 -> 1 [1111]
abcb -> 2 [a, bcb]
abcbd -> 3 [a, bcb, d]
abcde -> 5 [a, b, c, d, e]
66a -> 2 [66, a]
abcba-> 1 [abcba]
x -> 1 [x]
ababacab -> 2 [aba, bacab]
bacababa -> 2 [bacab, aba]
26600 -> 3 [2, 66, 00] [my user id] [who has a more perfect user id?]
ababacabBACABABA -> 4 [aba, bacab, BACAB, ABA]
Observe que, nos exemplos, qualquer coisa entre colchetes não deve fazer parte da saída.
ababacab
e seu inverso,bacababa
parecem ser bons casos de teste.ababacabBACABABA
também é um bom caso de teste (algumas respostas falham).Respostas:
Braquilog , 7 bytes
Experimente online!
Explicação
fonte
Geléia ,
131211 bytesExperimente online!
Especificações
"ababacab"
(como argumento)2
fonte
"\"
, porque isso é sintaxe inválida.ababacab
e seu inversobacababa
.Pitão, 9 bytes
Suíte de teste
Isso forma todas as partições da entrada, do menor para o maior. Em seguida, filtra essas partições na invariância, filtrando os elementos na invariância, na reversão. Finalmente, pegamos o primeiro elemento da lista filtrada de partições e retornamos seu comprimento.
Para explicar esse passo complicado, vamos começar com invariância sob inversão:
_I
. Isso verifica se sua entrada é um palíndromo, porque verifica se a reversão altera o valor.Em seguida, filtrando para palindromicity:
_I#
. Isso manterá apenas os elementos palíndromos da lista.Em seguida, vamos verificar para invariância sob filtragem para palindromicity:
_I#I
. Isso é verdade se e somente se todos os elementos da lista são palíndromos.Finalmente, filtrar listas onde todos os elementos da lista são palíndromos:
_I#I#
.fonte
Haskell , 83 bytes
Experimente online!
Isso usa a ótima dica do Zgarb para gerar partições de string .
fonte
Clojure, 111 bytes
Divide-se em todas as posições possíveis e, quando a primeira parte é um palíndromo, prossegue para encontrar uma partição para o restante da sequência.
Experimente online .
Ungolfed, usa a macro thread-last
->>
.Uma versão obscura, por favor, não escreva código como este: D
fonte
f
tem que chamar-se dentro do para:(f b)
. Em uma posição de chamada de cauda, você pode usarrecur
.defn
porfn
e apenas ter uma função.(fn f[s]( ... ))
? Oh verdade. Você salva 2 caracteres com isso.JavaScript (ES6),
143126124 bytesEconomizou 2 bytes graças a Neil
Inspirado pelo método NikoNyrh .
Formatado e comentado
Casos de teste
Mostrar snippet de código
Abordagem inicial,
173168 bytesUma função recursiva bastante longa que calcula todas as partições possíveis da string de entrada.
Formatado e comentado
Casos de teste
Mostrar snippet de código
fonte
,p=0
,s[p++]?
e,F(s,i,p)
.Gelatina , 10 bytes
Experimente online!
Quão?
Usa o fato de que
[0]<[0,0]<[0,0,0],...,<[0,...,0,1]<...
- assim, se classificarmos as partições por uma chave "não é palindrômica para cada parte", a primeira entrada será toda palindrômica e de comprimento mínimo.
Nota: qualquer string não vazia de comprimento n sempre resultará em uma chave com n zeros, pois todas as strings de comprimento 1 são palíndricas.
fonte
Haskell , 69 bytes
Define uma função
f
. Experimente online!Explicação
A função auxiliar de infix
x ! y
calcula uma lista de números inteiros, que são os comprimentos de algumas divisões dereverse x ++ y
em palíndromos ondereverse x
é deixada intacta. É garantido que contenha o comprimento da divisão mínima sey
não estiver vazio. Como funciona é isso.y
não estiver vazio, um caractere é disparado e pressionadox
. Sex
se tornar um palíndromo, chamamos a função principalf
no finaly
e adicionamos 1 para dar contax
. Além disso, apelamos!
ao novox
ey
a não perder nenhuma divisão potencial.y
estiver vazio, retornamos[0]
(uma divisão do comprimento 0) sex
também estiver vazia e[]
(sem divisão) caso contrário.A função principal
f
apenas chama"" ! x
e aceita o mínimo dos resultados.fonte
JavaScript (Firefox 30-57), 97 bytes
Porta ES6:
Parece uma solução tão simples que fico pensando que esqueci alguma coisa, mas ela passa pelo menos em todos os casos de teste.
fonte
Haskell,
139116109 bytesAinda verde no golfe Haskell, mas aqui está a minha melhor tentativa que posso apresentar rapidamente.
(and.map r)
para remover sub-listas que não contêm um palíndromo, em que o comprimento do ponto é aplicado à lista e, em seguida, o resultado é classificados para que possamos agarrar a cabeça, que é a resposta.Eu estava pensando que uma resposta melhor poderia alavancar a natureza não determinística das Listas em Haskell através do uso de Aplicantes. Pode ser possível reduzir muitos bytes da função h usando aplicativos, mesmo que tenhamos que importar Control.Applicative. Comentários para melhorias são bem-vindos.
UPDATE1
Economias enormes com base no lembrete de Laikoni sobre a função mínima. A remoção da classificação realmente me permitiu descartar a importação Data.List porque o mínimo está definido no Prelude!
UPDATE2
Graças à sugestão de nimi sobre o uso de compreensão de lista como um substituto útil para filter.map. Isso me salvou alguns bytes. Também peguei emprestado o puro truque de partição String da resposta Laikonis e salvei alguns bytes também.
fonte
h []=[[]]
eh (x:y)=map ([x]:)
contém espaço em branco desnecessário.head.sort
éminimum
.filter
emap
:g x=head$sort[length y|y<-h x,and$r<$>y]
.PHP, 319 bytes
Versão Online
Expandido
Versão mais longa sem E_NOTICE e Saída da matriz resultante
fonte
ababacabBACABABA