Se le da una cadena, que contendrá caracteres az ordinarios. (Puede suponer que este será siempre el caso en cualquier prueba, y asumir que todas las letras también estarán en minúsculas). Debe determinar cuántas combinaciones únicas se pueden hacer de los caracteres individuales en la cadena e imprimir ese número.
Sin embargo, las letras duplicadas pueden ignorarse al contar las combinaciones posibles. En otras palabras, si la cadena dada es "hola", simplemente cambiar las posiciones de los dos l
s no cuenta como una frase única y, por lo tanto, no puede contarse hacia el total.
¡El conteo de bytes más cortos gana, esperando ver algunas soluciones creativas en idiomas que no sean de golf!
Ejemplos:
hello -> 60
aaaaa -> 1
abcde -> 120
Respuestas:
Python 2 ,
5048 bytesPruébalo en línea!
No hay complementos aburridos! Para mi sorpresa, esto es incluso más corto que el enfoque de fuerza bruta, calculando todas las permutaciones con
itertools
y tomando la longitud.Esta función usa la fórmula
y lo calcula sobre la marcha. El factorial en el numerador se calcula multiplicando por
len(s)
en cada llamada a la función. El denominador es un poco más sutil; en cada llamada, dividimos por el número de ocurrencias de ese elemento en lo que queda de la cadena, asegurando que para cada carácterc
, todos los números entre 1 y la cantidad de ocurrencias dec
(inclusive) se dividirán por exactamente una vez. Como nos dividimos solo al final, tenemos la garantía de no tener ningún problema con la división de piso predeterminada de Python 2.fuente
05AB1E , 3 bytes
Pruébalo en línea!
Explicación
fuente
CJam , 4 bytes
Pruébalo en línea!
Explicación
Lea la línea como una cadena (
l
), permutaciones únicas como una matriz de cadenas (e!
), longitud (,
), visualización implícita.fuente
R ,
6965 bytesPruébalo en línea!
4 bytes guardados gracias a Zahiro Mor en ambas respuestas.
Calcula el coeficiente multinomial directamente.
R ,
7268 bytesPruébalo en línea!
Utiliza la función de distribución multinomial proporcionada por
dmultinom
para extraer el coeficiente multinomial.Tenga en cuenta que lo habitual (golfista)
x<-table(strsplit(s,""))
no funciona dentro de ladmultinom
llamada por un motivo desconocido.fuente
function(s,
!=factorial)(!nchar(s))/prod(!table(strsplit(s,"")))
trabajará. el () es redundante - la tabla sabe buscar los elementos ...JavaScript (Node.js) , 49 bytes
t=t*
se usa en lugar det*=
evitar el error de redondeo (|t
redondea el número hacia abajo) comot=t*
garantía de que todos los resultados intermedios (a nivel del operador) son números enteros.Pruébalo en línea!
fuente
t=t*
si desea evitarlo.)aaadegfbbbccc
debe exactamente al error de redondeo de punto flotanteAPL (Dyalog Unicode) , 14 bytes
Pruébalo en línea!
Devuelve el resultado como un singleton.
fuente
⍴
->≢
para que regrese escalares simples,÷⍨/g⌸,g←!⊢∘≢
por -2Japt ,
53 bytes-2 bytes gracias a @Shaggy
Pruébalo en línea!
fuente
â
.J ,
15, 14 bytesPruébalo en línea!
-1 byte gracias a FrownyFrog
fuente
~.
puede ser=
Jalea , 4 bytes
Pruébalo en línea!
Simplemente hace lo que se le pidió: encontrar permutaciones de entrada, uniquificar e imprimir la longitud.
fuente
C # (compilador interactivo de Visual C #) , 59 bytes
Puerto de la respuesta Python 2 de @ArBo .
Pruébalo en línea.
fuente
Brachylog , 3 bytes
Pruébalo en línea!
pᵘl
hace casi exactamente lo mismo.fuente
Python 2 , 57 bytes
Pruébalo en línea!
Autodocumentado: devuelve la longitud del conjunto de permutaciones únicas de la cadena de entrada.
Python 3 , 55 bytes
El crédito va a ArBo en este caso:
Pruébalo en línea!
fuente
APL (Dyalog Unicode) , 24 bytes
Pruébalo en línea!
Dfn simple, toma una cadena como argumento.
Cómo:
fuente
Ruby , 41 bytes
Pruébalo en línea!
fuente
to_a
f=
parte. (En TIOPerl 5 , 43 bytes
Utiliza el método en la respuesta Python de @ ArBo.
Pruébalo en línea!
fuente
Perl 6 ,
3330 caracteres (3431 bytes)Whatever
Bloque bastante sencillo .comb
divide la cadena en letras,permutations
obtiene todas las combinaciones posibles. Debido a la forma en que la coerciónSet
debe serjoin
editada primero (se»
aplicajoin
a cada elemento de la lista)Pruébalo en línea!
(se utilizó la respuesta anterior
.unique
peroSet
s garantiza la unicidad y numera la misma, por lo que ahorra 3).fuente
K (oK) , 12 bytes
Solución:
Pruébalo en línea!
Explicación:
Utiliza el oK incorporado
prm
:... que, debido a que
x^/:x
básicamente genera las permutaciones de"helo"
no"hello"
, por lo tanto, necesitamos generar las permutaciones de0 1 2 3 4
, usarlas para indexar"hello"
y luego tomar la cuenta de lo único.fuente
!-n
. a finales de k5 y k6 se convirtióprm
. k7 (shakti)prm
también lo ha hecho .Java 8,
103102bytesPuerto de la respuesta Python 2 de @ArBo .
-1 byte gracias a @ OlivierGrégoire haciéndolo iterativo en lugar de recursivo.
Pruébalo en línea.
En realidad, generar todas las permutaciones únicas en un conjunto y obtener su tamaño sería de 221 bytes :
Pruébalo en línea.
fuente
s->{int r=1,i=s.length();for(;i>0;)r=r*i/~-s.substring(--i).split(s.charAt(i)+"",-1).length;return r;}
.s->{long r=1,i=s.length();for(;i>0;)r=r*i/(s.chars().skip(--i).filter(c -> c==s.charAt(i)).count()+1);return r;}
pero sin éxito hasta ahora ...MATL , 9 bytes
Pruébalo en línea!
Explicación:
fuente
j
convierte eni
, que puede dejarse implícito. Además,&nx
guarda un byte sobreZy1)
tio.run/##y00syfn/P9IholQtr@L/f/WM1JycfHUAOctava / MATLAB, 35 bytes
Función anónima que toma un vector de caracteres y produce un número.
En MATLAB esto se puede acortar a
size(unique(perms(s),'ro'),1)
(33 bytes).Pruébalo en línea!
Explicación
fuente
unique
ya había devuelto filas únicas? ¿O es solo paratable
s?unique
se linealizarían primero. Para las mesas creo que tienes razón; Yo no lo sabia!unique
en MATLAB se toman filas paratables
; Runique
toma filas únicas de matrices o marcos de datos. Demasiados idiomas de matriz con los mismos comandos que hacen cosas ligeramente diferentes ...Retina 0.8.2 , 73 bytes
Pruébalo en línea! Utiliza la fórmula de @ ArBo, pero evalúa de derecha a izquierda, ya que esto se puede hacer en aritmética de enteros mientras se minimiza el tamaño de los valores unarios involucrados. Explicación:
Para cada carácter, cuente cuántos duplicados restantes hay y cuántos caracteres más hay, agregue uno a cada uno para tener en cuenta el carácter actual y separe los valores para que sepamos cuáles se deben dividir y cuáles se deben multiplicar. .
Prefije un 1 para producir una expresión completa.
Multiplica repetidamente el último y el tercer último número mientras divide por el segundo último número. Esto reemplaza los últimos tres números.
Convierte a decimal.
fuente
K, 27 bytes
K, 16 bytes: no es una respuesta real
Tome 999999 permutaciones aleatorias de la cadena de entrada, tome el conjunto único de ellas y cuente la longitud. La mayoría de las veces dará la respuesta correcta, para cadenas cortas.
Mejorado gracias a @Sriotchilism O'Zaic, @Selcuk
fuente
999999
lugar de100000
?Wolfram Language (Mathematica) , 32 bytes
Pruébalo en línea!
Explicación: La composición derecha con
/*
aplica estos tres operadores uno tras otro al argumento de la función, de izquierda a derecha:Characters
convierte la cadena de entrada en una lista de caracteres.Permutations
hace una lista de todas las permutaciones únicas de esta lista de caracteres.Length
devuelve la longitud de esta lista de permutaciones únicas.Este método es muy derrochador para cadenas largas: las permutaciones únicas se enumeran y cuentan, en lugar de usar a
Multinomial
para calcular su número sin enumerar.fuente
F # (Mono) , 105 bytes
Pruébalo en línea!
fuente
Pyth ,
54 bytesPruébalo en línea!
Esto supone que la entrada es un literal de cadena de Python. Si la entrada debe ser texto sin formato, esta versión de 5 bytes funcionará:
De cualquier manera, solo calcula todas las permutaciones de la entrada como una lista, la deduplica y obtiene el número de elementos en ella, e imprime ese número implícitamente.
-1 byte gracias a @ hakr14
fuente
{
deduplica una lista para un byte menor que.{
.J ,
1413 bytesPruébalo en línea!
1 byte gracias a millas
fuente
#(%*/)&:!#/.~
debería guardar otro bytePHP , 77 bytes
Pruébalo en línea!
Esto es básicamente solo un puerto PHP de la respuesta ganadora de Python de @ ArBo que es ridículamente más inteligente que la respuesta recursiva que tenía originalmente. ¡Bravo!
fuente
Ohm v2 , 4 bytes
Pruébalo en línea!
Explicación
fuente
Stax , 3 bytes
Ejecutar y depurarlo
fuente