Sua entrada será uma sequência composta por pequenas letras em inglês.
Sua tarefa é determinar o número de permutações distintas da sequência original que são um palíndromo.
A sequência de entrada tem até 100 letras. No caso de uma sequência mais longa, o resultado pode ser muito grande, portanto a saída deve ser o número de permutações módulo 666013.
Por exemplo,
cababaa -> 3
As permutações possíveis são:
aabcbaa
abacaba
baacaab
Isso é código-golfe , então a resposta mais curta vence!
code-golf
string
combinatorics
permutations
palindrome
Andrei Mihailescu
fonte
fonte
abcdabcddddd -> 120
(sem contagem de caracteres ímpares) ,abcdabcdddddd -> 120
(uma contagem de caracteres ímpares) ,abcdabcddddddeee -> 0
(duas contagens de caracteres ímpares) ,aabbccddeeffgghhiijj -> 298735
(afetada pelo módulo) .Respostas:
Braquilog (2), 15 bytes
Experimente online!
Explicação
fonte
05AB1E ,
171613 bytes-1 byte de Jonathon Allan
-3 bytes de Emigna e Adnan
Explicação:
Experimente online!
fonte
E›j
,, representa os dígitos[14, 116, 45]
que são convertidos da base214
e se tornam14*214^2 + 116*214 + 45 = 666013
. Não tenho muita certeza de onde está a referência para os dígitos, mas eles parecem estar alinhados (ish?) Com seu pedido na página de informações . @Adnan pode nos esclarecer.œÙvyÂQ}O•E›j•%
œÙvyÂQO•E›j•%
.Perl 6 ,
1041088884 bytesExperimente online!
Como funciona
Não consigo gerar facilmente todas as permutações e filtrá-las, mesmo que sejam permitidos tempos de execução astronômicos, porque a
permutations
rotina interna do Perl 6 se recusa a permutar listas de mais de 20 elementos e a descrição da tarefa exige entradas de até 100 personagens.Então, em vez disso, uso uma fórmula direta com base nas frequências das letras da entrada:
Uma função auxiliar que reduz pela metade um número e o arredonda para o número inteiro mais próximo e leva o fatorial disso.
Registre as frequências das letras na sequência de entrada e faça do tópico para o restante do código. Por exemplo, para entrada,
abcdabcdddddd
essa seria a lista(2, 2, 2, 7)
.Se houver mais de uma frequência de letra ímpar, multiplique o resultado por zero, pois nesse caso não são possíveis palíndromos.
Calcule o número de permutações possíveis dos caracteres que estarão em "um lado" de cada palíndromo (o que corresponde a um multiset com as multiplicidades obtidas pela metade e somando as frequências das letras de entrada) . A fórmula usada é deste PDF :
(n 1 + ... + n k )! / (n 1 ! ⋅ ... kn k 1)
Por exemplo, para frequências de letras de entrada
(2,2,2,7)
, as letras de um lado do palíndromo formam um multiset com multiplicidades(1,1,1,3)
, e o número de permutações é assim(1+1+1+3)! / (1!⋅1!⋅1!⋅3!) = 120
.Tome o resultado módulo 666013.
fonte
Python3,
8180 bytesEste é o mais curto que eu pude apresentar. Não tenho certeza se as permutações podem ser geradas com mais facilidade ...
Explicação
Notas
a==a[::-1]
retorna um valor booleano, mas asum(...)
função o envolve implicitamente em um número inteiro (0 ou 1) e soma em conformidade.permutations(...)
. Caso contrário, o conjunto ({...}
) conteria apenas um elemento, o próprio objeto.{...}
) para manter apenas permutações distintas dentro.No Floroid, isso é (quase)
z(T(a==aDKaIW(cb(L)))%666013)
, mas imprime o resultado e recebe entrada pela linha de comando.Agradecemos a Jonathan Allan por salvar um byte! -> Mudou o
import
estiloExperimente online!
fonte
Gelatina , 13 bytes
Experimente online!
Quão?
Um forçador bruto.
Eu acredito que isso vai fazê-lo de forma mais eficiente, mas é 30 bytes (edit: esse pdf parece confirmar isso, cortesia de resposta das LME ):
fonte
%
mod é mod.Œ!QŒḂ€S%“µɲ€’
,. Parece bytewise idêntico para mim.Mathematica, 46 bytes
Leva uma lista de caracteres como entrada.
Terrivelmente ineficiente, porque na verdade gera todas as permutações da entrada e depois conta as palindrômicas.
fonte
0
, se a seqüência de caracteres tem várias letras que ocorrem com multiplicidade ímpar (como"abcdabcddddddeee"
).Mathematica, 68 bytes
Função pura pegando uma lista de caracteres como entrada e retornando um número inteiro. Não é tão curto quanto a resposta Mathematica de Martin Ender , mas é uma abordagem atraente, que parece ser a mesma abordagem da resposta Perl 6 do smls .
Primeiro,
t=Last/@Tally@#/2
calcula as contagens de todos os caracteres distintos na entrada, divididos por2
; entãoi=Floor
arredonda para baixo todas as frações que ocorremt
. Observe que as permutações palindrômicas da entrada existem exatamente quando existe no máximo um número ímpar entre as contagens originais, ou seja, quando há no máximo uma fraçãot
. Podemos testar isso somando todos os elementos det-i
(usingTr
): se a resposta for menor que1
, existem permutações palindrômicas, caso contrário não.Se houver,
i
representa a contagem de caracteres distintos na metade esquerda das permutações, que podem ser organizadas arbitrariamente. O número de maneiras de fazer isso é exatamente oMultinomial
coeficiente (um quociente de certos fatoriais) que o Mathematica incorporou.fonte
k, 23 bytes
Se estiver usando oK , ou
cmb
não existir, use emprm
vez decmb
.fonte
Pitão - 15 bytes
Experimente online aqui .
fonte
C ++ 14, 161 bytes
Como lambda sem nome, assumindo que a entrada é semelhante
std::string
e retornando via parâmetro de referência.Ungolfed e uso:
fonte
Ruby,
67575259 caracteresfonte
->s{ }
, não é?(s.size)
argumento não é redundante?.to_a
mesmo.undefined method
uniq 'para # <Enumerator`), mas funciona corretamente no ruby 2.4, obrigado :) #mod 666013
?Japonês ,
2018 bytesEconomizou 2 bytes graças ao ETHproductions.
Experimente online!
fonte
f_¥Zw}
, como_
é a abreviação deZ{Z
á fêS â l %666013
economizaria um byte.MATL, 13 bytes
Experimente no MATL Online
Explicação
fonte
CJam , 19 bytes
Experimente online!
Explicação:
fonte
Ohm, 17 bytes
Explicação:
fonte
PHP, 182 bytes
Versão Online
Demolir
fonte