Votre entrée sera une chaîne composée de petites lettres anglaises.
Votre tâche consiste à déterminer le nombre de permutations distinctes de la chaîne d'origine qui sont un palindrome.
La chaîne d'entrée contient jusqu'à 100 lettres. Dans le cas d'une chaîne plus longue, le résultat peut être très grand, donc la sortie doit être le nombre de permutations modulo 666013.
Par exemple,
cababaa -> 3
Les permutations possibles sont:
aabcbaa
abacaba
baacaab
Il s'agit de code-golf , donc la réponse la plus courte l'emporte!
code-golf
string
combinatorics
permutations
palindrome
Andrei Mihailescu
la source
la source
abcdabcddddd -> 120
(pas de nombre de caractères impairs) ,abcdabcdddddd -> 120
(un nombre de caractères impairs) ,abcdabcddddddeee -> 0
(deux nombres de caractères impairs) ,aabbccddeeffgghhiijj -> 298735
(affectés par le modulo) .Réponses:
Brachylog (2), 15 octets
Essayez-le en ligne!
Explication
la source
05AB1E ,
171613 octets-1 octet de Jonathon Allan
-3 octets depuis Emigna et Adnan
Explication:
Essayez-le en ligne!
la source
E›j
représente les chiffres[14, 116, 45]
qui sont convertis à partir de la base214
, et devient14*214^2 + 116*214 + 45 = 666013
. Je ne sais pas trop où est la référence pour les chiffres, mais ils semblent être en ligne (ish?) Avec leur commande sur la page d'informations . @Adnan peut nous éclairer.œÙvyÂQ}O•E›j•%
œÙvyÂQO•E›j•%
.Perl 6 ,
104108 1088884 octetsEssayez-le en ligne!
Comment ça fonctionne
Je ne peux pas facilement générer toutes les permutations et les filtrer, même si les temps d'exécution astronomiques sont autorisés, car la
permutations
routine intégrée de Perl 6 refuse directement de permuter des listes de plus de 20 éléments et la description de la tâche nécessite des entrées allant jusqu'à 100 personnages.Au lieu de cela, j'utilise une formule directe basée sur les fréquences des lettres de l'entrée:
Une fonction d'assistance qui divise par deux un nombre et l'arrondit à l'entier le plus proche, puis prend la factorielle de cela.
Comptez les fréquences des lettres dans la chaîne d'entrée et faites-en le sujet pour le reste du code. Par exemple, pour la saisie,
abcdabcdddddd
ce serait la liste(2, 2, 2, 7)
.S'il y a plus d'une fréquence de lettres impaires, multipliez le résultat par zéro, car aucun palindrome n'est possible dans ce cas.
Calculez le nombre de permutations possibles des caractères qui seront sur "un côté" de chaque palindrome (ce qui correspond à un multiset avec les multiplicités obtenues en divisant par deux et en parquetant les fréquences des lettres d'entrée) . La formule utilisée est issue de ce PDF :
(n 1 + ... + n k )! / (n 1 ! ⋅ ... ⋅n k 1)
Par exemple pour les fréquences
(2,2,2,7)
des lettres d' entrée , les lettres d' un côté du palindrome forment un multiset avec des multiplicités(1,1,1,3)
, et le nombre de permutations est donc(1+1+1+3)! / (1!⋅1!⋅1!⋅3!) = 120
.Prenez le résultat modulo 666013.
la source
Python3,
8180 octetsC'est le plus court que j'ai pu trouver. Je ne sais pas si les permutations peuvent être générées plus facilement ...
Explication
Remarques
a==a[::-1]
renvoie une valeur booléenne, mais lasum(...)
fonction la convertit implicitement en un entier (0 ou 1) et additionne en conséquence.permutations(...)
. Sinon, set ({...}
) ne contiendrait qu'un seul élément, l'objet lui-même.{...}
) pour ne garder que des permutations distinctes à l'intérieur.Dans Floroid, c'est (presque)
z(T(a==aDKaIW(cb(L)))%666013)
, mais imprime le résultat à la place et prend la saisie via la ligne de commande.Merci à @Jonathan Allan d' avoir enregistré un octet! -> Changement de
import
styleEssayez-le en ligne!
la source
Gelée , 13 octets
Essayez-le en ligne!
Comment?
Un forceur brutal.
Je crois que cela le fera plus efficacement, mais c'est 30 octets (modifier: ce pdf semble le confirmer, gracieuseté de la réponse de smls ):
la source
%
mod.Œ!QŒḂ€S%“µɲ€’
. Cela me semble tout à fait identique.Mathematica, 46 octets
Prend une liste de caractères en entrée.
Terriblement inefficace, car il génère en fait toutes les permutations de l'entrée et compte ensuite les palindromes.
la source
0
, si la chaîne a plusieurs lettres se produisant avec une multiplicité étrange (comme"abcdabcddddddeee"
).Mathematica, 68 octets
Fonction pure prenant une liste de caractères en entrée et retournant un entier. Pas aussi courte que la réponse Mathematica de Martin Ender , mais c'est quand même une approche mignonne, qui semble être la même approche que dans la réponse Perl 6 de smls .
Tout d'abord,
t=Last/@Tally@#/2
calcule le nombre de tous les caractères distincts dans l'entrée, divisé par2
; puisi=Floor
arrondit les fractions se produisant danst
. Notez que les permutations palindromes de l'entrée existent exactement quand il y a au plus un nombre impair parmi les chefs d' accusation d' origine, qui est, quand il y a au plus une fractiont
. Nous pouvons tester cela en additionnant simplement tous les éléments det-i
(en utilisantTr
): si la réponse est inférieure à1
, il y a des permutations palindromiques, sinon non.S'il y en a, alors
i
représente le nombre de caractères distincts dans la moitié gauche des permutations, qui peuvent être arrangées arbitrairement. Le nombre de façons de le faire est exactement leMultinomial
coefficient (un quotient de certaines factorielles), que Mathematica a intégré.la source
k, 23 octets
Si vous utilisez oK , ou
cmb
n'existe pas, utilisez à laprm
place decmb
.la source
Pyth - 15 octets
Essayez-le en ligne ici .
la source
C ++ 14, 161 octets
En tant que lambda sans nom en supposant que l'entrée est similaire
std::string
et en retournant via le paramètre de référenceNon golfé et utilisation:
la source
Ruby,
67575259 caractèresla source
->s{ }
, n'est-ce pas?(s.size)
argument n'est-il pas redondant?.to_a
trop.undefined method
uniq 'pour # <Enumerator`), mais ça marche sur ruby 2.4, merci :)mod 666013
?Japt ,
2018 octetsSauvegardé 2 octets grâce à ETHproductions.
Essayez-le en ligne!
la source
f_¥Zw}
, comme_
c'est court pourZ{Z
á fêS â l %666013
vous ferait économiser un octet.MATL, 13 octets
Essayez-le sur MATL Online
Explication
la source
CJam , 19 octets
Essayez-le en ligne!
Explication:
la source
Ohm, 17 octets
Explication:
la source
PHP, 182 octets
Version en ligne
Panne
la source