Introducción
Observemos la siguiente secuencia (enteros no negativos):
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ...
Por ejemplo, tomemos los primeros tres números. Estos son 0, 1, 2
. Los números utilizados en esta secuencia se pueden ordenar de seis maneras diferentes:
012 120
021 201
102 210
Entonces, digamos que F (3) = 6 . Otro ejemplo es F (12) . Este contiene los números:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
O la versión concatenada:
01234567891011
Para encontrar la cantidad de formas de reorganizar esto, primero tenemos que mirar la longitud de esta cadena. La longitud de esta cadena es 14
. ¡Entonces calculamos 14! . Sin embargo, por ejemplo, los que pueden intercambiar lugares sin interrumpir la cadena final. ¡Hay 2 ceros, entonces hay 2! maneras de exhalar los ceros sin interrumpir el orden. También hay 4 unos, ¡así que hay 4! maneras de cambiar las Dividimos el total por estos dos números:
Esto tiene 14! / (4! × 2!) = 1816214400 formas de organizar la cadena 01234567891011
. Entonces podemos concluir que F (12) = 1816214400 .
La tarea
Dado N , salida F (N) . Para los que no necesitan la presentación. Para calcular F (N), primero concatenamos los primeros N enteros no negativos (por ejemplo, para N = 12, la cadena concatenada sería 01234567891011
) y calculamos el número de formas de organizar esta cadena.
Casos de prueba
Input: Output:
0 1
1 1
2 2
3 6
4 24
5 120
6 720
7 5040
8 40320
9 362880
10 3628800
11 119750400
12 1816214400
13 43589145600
14 1111523212800
15 30169915776000
Nota
Calcular la respuesta debe calcularse dentro de un límite de tiempo de 10 segundos , no se permite la fuerza bruta .
Este es el código de golf , por lo que gana el envío con la menor cantidad de bytes.
10
correcta? Parece que debería ser menos de 10 !, ya que ahí es donde comienzan los dígitos repetidos.10
dígitos son0, 1, 2, 3, 4, 5, 6, 7, 8, 9
. Diez dígitos diferentes, por lo que el resultado es 10 !.0
caso estaba descartando mi cuenta (estúpidas cadenas vacías).F(N)
no esO(N!)
y quelog F(N)
esO(log N!)
, pero esos son sólo corazonadas ...Respuestas:
Jalea,
1715 bytesPruébalo en línea! o verificar todos los casos de prueba a la vez .
Cómo funciona
fuente
ES6,
1188178 bytesAlguien tiene que decirme que hay una forma más corta de concatenar los números hasta
n
.Ahorré 37 bytes geniales tomando la idea de @ edc65 y ejecutándola con esteroides. (Guarde un byte adicional usando '|' en lugar de
&&
pero eso limita el resultado a 31 bits).Editar: Guardado 3 bytes más nuevamente gracias a @ edc65.
fuente
reduce
:n=>[...[...Array(n).keys()].join``].reduce((r,c,i)=>r*++i/(o[c]=-~o[c]),1,o=[])
n=>[...[...Array(n).keys()].join``].map(c=>r/=(o[c]=-~o[c])/i++,o=[],i=r=1)&&r
r/=(...)/i++
es más preciso quer*=i++/(...)
? ¡Ese es el golf más ridículo que he visto!APL (Dyalog Extended) , 13 bytes
Pruébalo en línea!
Un programa completo Usos
⎕IO←0
.Cómo funciona
El cálculo multinomial proviene del siguiente hecho:
fuente
MATL , 21 bytes
Pruébalo en línea!
Explicación
fuente
Python 2,
14213710197 bytes(Gracias @adnan por la sugerencia sobre
input
)(Aplica el cálculo incremental de la versión C )
Versión original usando factorial
Realmente, el único juego de golf en lo anterior es llamar
math.factorial
F
y omitir algunos espacios, por lo que probablemente haya una solución de Python más corta.Si se necesita
v
una explicación, mantiene un recuento de la frecuencia de cada dígito; el recuento se actualiza para cada dígito en cada número en el rango indicado.En la versión original, calculamos el número de permutaciones utilizando la fórmula estándar (Σf i )! / Π (f i !). Para la versión actual, este cálculo se realiza de forma incremental distribuyendo las multiplicaciones y las divisiones a medida que vemos los dígitos. Puede que no sea obvio que la división de enteros siempre será exacta, pero es fácil de probar en base a la observación de que cada división por
k
debe seguirk
multiplicados de enteros consecutivos, por lo que una de esas multiplicaciones debe ser divisible pork
. (Eso es una intuición, no una prueba).La versión original es más rápida para argumentos grandes porque solo divide 10 bignum. Aunque dividir un bignum por un entero pequeño es más rápido que dividir un bignum por un bignum, cuando tienes miles de divisiones de bignum, se vuelve un poco lento.
fuente
Python 2, 197 Bytes (editar: guardado 4 bytes, ¡gracias Thomas Kwa!)
Sin golf:
fuente
range(0,10)
puede serrange(10)
.CJam,
2119 bytesPruébalo aquí.
Explicación
fuente
JavaScript (ES6), 100
Prueba
fuente
k[c]=~-k[c]
sinónimo de--k[c]
?Pyth, 18 bytes
Pruébelo en línea: demostración
fuente
Haskell, 92 bytes
Ejemplo de uso:
h 12
->1816214400
.Cómo funciona
fuente
C,
236174138121 bytesMucho crédito a rici, por la reducción masiva de bytes.
Sin golf
Probarlo aquí .
fuente
#define L long long L d;i,j,k,m,n,s=1,b[10]={1};L f(n){return n?n*f(n-1):1;}main(d){for(scanf("%d",&n);i<n;)for(j=i++;j;j/=10)++b[j%10],++s;for(;m<10;)d*=f(b[m++]);printf("%Ld",f(s)/d);}
for(;m<10;)s+=b[m],d*=f(b[m++])
pero creo que son un par de bytes más.C / bc,
233121112 bytes (suponiendo 3 pena de byte para|bc
)Inspirado por Cole Cameron, eliminó la manipulación de personajes extravagantes y solo hizo aritmética en el valor del argumento.
Se cambió a scanf por usar el vector arg.
Necesita
bc
hacer el cálculo de precisión arbitrario.Sin golf y sin advertencia:
Ilustrado (en el que confío muestra el algoritmo):
Y, con la tubería a través de bc (y agregando el cálculo de F (1000):
Esto calculó F (5000), un número de 18,592 dígitos, en menos de 10 segundos.
fuente
Perl 6, 117 bytes
y en un fasion más legible
fuente
Perl 5, 108 bytes
Muchas gracias a dev-null por guardarme 17 bytes, y a japhy por la idea factorial.
fuente
05AB1E ,
131211 bytesPruébalo en línea!
fuente
Python 2 , 123 bytes
Pruébalo en línea!
range
de la entrada en una sola cadenafuente
PowerShell, 125 bytes
Toma información
$args[0]
, resta1
, construye un rango de enteros a partir de0..
ese número,-join
s que se unen en una cadena y lo guarda como$b
. Tomamos el.Length
de esa cadena, construimos otro rango a partir de1..
esa longitud,-join
esos enteros junto con*
, luego lo canalizamos aInvoke-Expression
(similar aeval
). En otras palabras, hemos construido el factorial de la longitud de la secuencia numérica en función de la entrada. Ese es nuestro numerador.Dividimos eso
/
por ...Nuestro denominador, que se construye tomando un rango
0..9
y enviándolo a través de un ciclo for|%{...}
. En cada iteración, establecemos una variable auxiliar$c
igual al número de veces que$_
aparece el dígito actual$b
gracias a la llamada .NET[regex]::matches
junto con el.count
atributo. Luego construimos un nuevo rango desde1..
ese valor, siempre que no sea cero. Sí, en muchos casos, esto dará como resultado un rango1..1
, que se evalúa como justo1
. Tomamos todos esos y-join
ellos juntos*
, y luego lo canalizamos aInvoke-Expression
otra vez. En otras palabras, hemos construido el producto de los factoriales del número de ocurrencias de cada dígito.nótese bien
Maneja la entrada hasta
90
sin problemas y en significativamente menos de un segundo.... más allá de eso resulta
Infinity
como salida, ya que la longitud de la cadena permutable resulta en170!
que cabe en eldouble
tipo de datos (7.25741561530799E+306
), pero171!
no lo hace. PowerShell tiene una peculiaridad ... ... que automáticamente-elencos de[int]
que[double]
en el caso de desbordamiento (siempre que no convierta explícitamente la variable para empezar). No, no sé por qué no se utiliza[long]
para valores enteros.Si hiciéramos algo de conversión y manipulación explícitas (p. Ej., Usando
[uint64]
, para enteros de 64 bits sin signo), podríamos hacerlo más alto, pero se hincharía significativamente el código ya que necesitaríamos un rango de hasta 170 de longitud con condicionales y luego refundir cada multiplicación a partir de ahí en adelante. Como el desafío no especifica un rango superior, supongo que esto es adecuado.fuente
Perl6
Más bien no golfista en este momento, necesito dormir ahora.
fuente
Groovy, 156 bytes
Mi humilde primera solución de Code Golf. Puedes probarlo aquí.
Y aquí hay una versión más legible:
Muy sencillo, pero hubo un par de puntos destacados para mí:
Realizar una inyección / reducción de una matriz de
chars
aMap<Character, Integer>
. Esto todavía era un poco complicado por la falta de un valor predeterminado para los valores del mapa. Esta duda es posible, pero si el mapa predetermina todos los valores a 0, podría evitar el ternario que es necesario para evitar un NPE.El operador Groovy spread (p
}*.value
. Ej. ) Siempre es divertido de usarSin embargo, una característica molesta era la necesidad de declarar la función factorial con el tipo de retorno
BigInteger
. Tenía la impresión de que Groovy incluía todos los números enBigInteger
oBigDecimal
, pero este podría no ser el caso cuando se trata de tipos de retorno. Tendré que experimentar más. Sin este tipo de retorno declarado explícitamente, obtenemos valores factoriales incorrectos muy rápidamente.fuente
J, 33 bytes
Convierte el rango en una cadena de dígitos, cuenta cada dígito y aplica el coeficiente multinomial para calcular el resultado.
Uso
fuente
R, 118 bytes
Aproximadamente 8 meses tarde a la fiesta, pero pensé en intentarlo porque parecía un desafío interesante.
Pruébalo en R-Fiddle
Explicado
0 ... n-1
y lo contrae en una cadena:paste(1:n-1,collapse="")
x
):x=as.numeric(el(strsplit(...,"")))
factorial(sum(1|x))
que es#digits!
Para calcular el denominador usamos
table
para construir una tabla de contingencia que enumere las frecuencias. En el caso de F (12) la tabla generada es:Lo que significa que podemos tomar el uso
factorial()
(que por cierto está vectorizado) en el recuento y simplemente tomar el producto:prod(factorial(table(x)))
Nota: los pasos 4 y 5 solo se llevan a cabo si de lo
n>0
contrario regresan1
.fuente
Mathematica, 65 bytes
Probablemente podría jugar más golf.
fuente
Ruby , 64 bytes
Pruébalo en línea!
fuente
Stax , 12 bytes
¡Ejecútelo y depúrelo en staxlang.xyz!
Desempaquetado (14 bytes) y explicación:
fuente
Jalea , 11 bytes
Golfed Dennis '15 bytes Jelly respuesta ...
Un enlace monádico que acepta un número entero no negativo que produce un número entero positivo.
Pruébalo en línea! O vea el conjunto de pruebas .
¿Cómo?
fuente
Python 2 , 190 bytes
Pruébalo en línea!
fuente
Python 2 , 134 bytes
Pruébalo en línea!
Un enfoque alternativo ...
fuente