Su entrada será una cadena que consiste en pequeñas letras en inglés.
Su tarea es determinar el número de permutaciones distintas de la cadena original que son un palíndromo.
La cadena de entrada tiene hasta 100 letras. En el caso de una cadena más larga, el resultado podría ser muy grande, por lo que la salida debería ser el número de permutaciones del módulo 666013.
Por ejemplo,
cababaa -> 3
Las posibles permutaciones son:
aabcbaa
abacaba
baacaab
Este es el código de golf , por lo que gana la respuesta más corta.
code-golf
string
combinatorics
permutations
palindrome
Andrei Mihailescu
fuente
fuente
abcdabcddddd -> 120
(sin recuento de caracteres impares) ,abcdabcdddddd -> 120
(un recuento de caracteres impares) ,abcdabcddddddeee -> 0
(dos recuentos de caracteres impares) ,aabbccddeeffgghhiijj -> 298735
(afectados por el módulo) .Respuestas:
Brachylog (2), 15 bytes
Pruébalo en línea!
Explicación
fuente
05AB1E ,
171613 bytes-1 byte de Jonathon Allan
-3 bytes de Emigna y Adnan
Explicación:
Pruébalo en línea!
fuente
E›j
representa los dígitos[14, 116, 45]
que se convierten desde la base214
y se convierte en14*214^2 + 116*214 + 45 = 666013
. No estoy muy seguro de dónde está la referencia para los dígitos, pero parecen estar en línea (¿ish?) Con su orden en la página de información . @Adnan puede iluminarnos.œÙvyÂQ}O•E›j•%
œÙvyÂQO•E›j•%
.Perl 6 ,
1041088884 bytesPruébalo en línea!
Cómo funciona
No puedo generar fácilmente todas las permutaciones y filtrarlas, incluso si se permiten tiempos de ejecución astronómicos, porque el Perl 6 está incorporado
permutations
rutina niega a permutar listas de más de 20 elementos y la descripción de la tarea requiere entradas de hasta 100 caracteres.Entonces, en cambio, uso una fórmula directa basada en las frecuencias de letras de la entrada:
Una función auxiliar que reduce a la mitad un número y lo redondea al entero más cercano, y luego toma el factorial de eso.
Calcule las frecuencias de las letras en la cadena de entrada y conviértalas en el tema del resto del código. Por ejemplo, para la entrada
abcdabcdddddd
esta sería la lista(2, 2, 2, 7)
.Si hay más de una frecuencia de letras impares, multiplique el resultado por cero, porque en ese caso no son posibles los palíndromos.
Calcule el número de permutaciones posibles de los caracteres que estarán en "un lado" de cada palíndromo (que corresponde a un conjunto múltiple con las multiplicidades obtenidas al dividir a la mitad y poner en el suelo las frecuencias de las letras de entrada) . La fórmula utilizada es de este PDF :
(n 1 + ... + n k )! / (n 1 ! ⋅ ... ⋅n k 1)
Por ejemplo, para las frecuencias de
(2,2,2,7)
las letras de entrada , las letras en un lado del palíndromo forman un conjunto múltiple con multiplicidades(1,1,1,3)
, y el número de permutaciones es así(1+1+1+3)! / (1!⋅1!⋅1!⋅3!) = 120
.Tome el resultado módulo 666013.
fuente
Python3,
8180 bytesEsto es lo más corto que se me ocurrió. No estoy seguro si las permutaciones se pueden generar más fácilmente ...
Explicación
Notas
a==a[::-1]
devuelve un valor booleano, pero lasum(...)
función lo convierte implícitamente en un entero (0 o 1) y suma en consecuencia.permutations(...)
. De lo contrario, el conjunto ({...}
) contendría solo un elemento, el objeto mismo.{...}
) para mantener solo permutaciones distintas dentro.En Floroid, esto es (casi)
z(T(a==aDKaIW(cb(L)))%666013)
, pero imprime el resultado en su lugar y toma la entrada a través de la línea de comando.¡Gracias a @Jonathan Allan por guardar un byte! -> Cambió el
import
estiloPruébalo en línea!
fuente
Jalea , 13 bytes
Pruébalo en línea!
¿Cómo?
Un forzador bruto.
Yo creo que esto hará que sea más eficiente, pero es 30 bytes (edit: este pdf parece confirmar que, por cortesía de respuesta de los LMS ):
fuente
%
mod es.Œ!QŒḂ€S%“µɲ€’
. Eso se ve idéntico a mí.Mathematica, 46 bytes
Toma una lista de caracteres como entrada.
Terriblemente ineficiente, porque en realidad genera todas las permutaciones de la entrada y luego cuenta las palindrómicas.
fuente
0
, si la cadena tiene varias letras que ocurren con una multiplicidad impar (como"abcdabcddddddeee"
).Mathematica, 68 bytes
Función pura que toma una lista de caracteres como entrada y devuelve un entero. No es tan corto como la respuesta de Mathematica de Martin Ender , pero es un enfoque lindo, que parece ser el mismo enfoque que en la respuesta Perl 6 de smls .
Primero,
t=Last/@Tally@#/2
calcula los recuentos de todos los caracteres distintos en la entrada, divididos por2
; luegoi=Floor
redondea las fracciones que ocurran ent
. Tenga en cuenta que las permutaciones palindrómicas de la entrada existen exactamente cuando hay como máximo un número impar entre los recuentos originales, es decir, cuando hay como máximo una fracciónt
. Podemos probar eso simplemente sumando todos los elementos det-i
(usarTr
): si la respuesta es menor que1
, hay permutaciones palindrómicas, de lo contrario no.Si los hay,
i
representa los recuentos de caracteres distintos en la mitad izquierda de las permutaciones, que se pueden organizar de forma arbitraria. La cantidad de formas de hacerlo es exactamente elMultinomial
coeficiente (un cociente de ciertos factoriales), que Mathematica ha incorporado.fuente
k, 23 bytes
Si usa oK , o
cmb
no existe, use enprm
lugar decmb
.fuente
Pyth - 15 bytes
Pruébelo en línea aquí .
fuente
C ++ 14, 161 bytes
Como lambda sin nombre, suponiendo que la entrada es similar
std::string
y regresa a través del parámetro de referencia.Sin golf y uso:
fuente
Ruby,
67575259 caracteresfuente
->s{ }
, ¿no?(s.size)
redundante el argumento?.to_a
también.undefined method
uniq 'para # <Enumerator`), pero sí funciona en ruby 2.4, gracias :)mod 666013
?Japt ,
2018 bytesAhorró 2 bytes gracias a ETHproductions.
Pruébalo en línea!
fuente
f_¥Zw}
, como_
es la abreviatura deZ{Z
á fêS â l %666013
te ahorraría un byte.MATL, 13 bytes
Pruébalo en MATL Online
Explicación
fuente
CJam , 19 bytes
Pruébalo en línea!
Explicación:
fuente
Ohm, 17 bytes
Explicación:
fuente
PHP, 182 bytes
Versión en línea
Descompostura
fuente