Debe escribir un programa o función que proporcione tres enteros positivos n b kcomo salidas de entrada o devuelva los últimos kdígitos antes de los ceros finales en la brepresentación base de n!.
Ejemplo
n=7 b=5 k=4
factorial(n) is 5040
5040 is 130130 in base 5
the last 4 digits of 130130 before the trailing zeros are 3013
the output is 3013
Entrada
- 3 enteros positivos
n b kdonde2 <= b <= 10. - El orden de los enteros de entrada se puede elegir arbitrariamente.
Salida
- Una lista de dígitos devueltos o generados como un entero o una lista de enteros.
- Los ceros iniciales son opcionales.
- Su solución tiene que resolver cualquier caso de prueba de ejemplo en menos de un minuto en mi computadora (solo probaré casos cercanos. Tengo una PC por debajo del promedio).
Ejemplos
Nuevas pruebas agregadas para verificar la exactitud de los envíos. (No forman parte de la regla de tiempo de ejecución de menos de 1 minuto).
Entrada => Salida (con la opción de omitir los ceros iniciales)
3 10 1 => 6
7 5 4 => 3013
3 2 3 => 11
6 2 10 => 101101
9 9 6 => 6127
7 10 4 => 504
758 9 19 => 6645002302217537863
158596 8 20 => 37212476700442254614
359221 2 40 => 1101111111001100010101100000110001110001
New tests:
----------
9 6 3 => 144
10 6 3 => 544
Este es el código de golf, por lo que gana la entrada más corta.
code-golf
number-theory
base-conversion
factorial
randomra
fuente
fuente

7 5 3Saldría "013" o "13"?7 10 4caso de prueba, diría13nok? ¿O podemos limitarlos al rango del tipo entero del idioma?Respuestas:
Dyalog APL , 23 bytes
Este programa funciona siempre que el factorial no exceda el límite de representación interna. En Dyalog APL, el límite puede elevarse
⎕FR←1287.Asume que las variables n, b y k se han establecido (por ejemplo
n b k←7 5 4), pero si prefiere solicitar n , b y k (en ese orden), reemplace los tres caracteres con⎕.fuente
Mathematica,
5748 bytesGuardado 9 bytes gracias a @ 2012rcampion.
fuente
bpara guardar primero 2 bytes?IntegerString[#!#2^-#!~IntegerExponent~#2,##2]&(tanto este como tu original son bastante rápidos)SlotSequencetruco que utilicé en mi comentario solo funciona con el pedido actual, por lo que no podría guardar más.Python,
198192181 caracteresEs lo suficientemente rápido, ~ 23 segundos en el mejor ejemplo. Y sin factorial incorporado (¡te estoy mirando, Mathematica!).
fuente
[2,3,2,5,3,7,2,3,5][b-2]podría serint('232537235'[b-2])guardar 3 bytes.[1,1,2,1,1,1,3,2,1][b-2]similar.111973>>2*(b-2)&3es aún más corta. Sin embargo, es el mismo número de bytes para el primero (90946202>>3*(b-2)&7).Pyth,
2635 bytesEsta es una función de 3 argumentos, número, base, número de dígitos.
Demostración.
El caso de prueba más lento, el último, toma 15 segundos en mi máquina.
fuente
PARI / GP, 43 bytes
La velocidad de intercambio por espacio produce este algoritmo sencillo:
Cada uno de los casos de prueba se ejecuta en menos de un segundo en mi máquina.
fuente
Mathematica - 48 bytes
Sin golf:
Ejemplo:
Para los casos más grandes, el factor limitante no es generar los dígitos:
La coincidencia de patrones parece ser
O(n^2), lo que hace que los dos últimos casos de prueba superen la marca de un minuto.fuente
Bash / coreutils / dc, 60 bytes
Utiliza la
dcsecuencia de comandos de mi respuesta para encontrar el factorial , que sale en base$2,sedpara recortar ceros finales ytailseleccionar los últimos$3dígitos.fuente
revpara reducir el retroceso, pero esdceso lo que se está comiendo la CPU ...Haskell,
111109 bytesUso:
f 158596 8 20->[3,7,2,1,2,4,7,6,7,0,0,4,4,2,2,5,4,6,1,4]Toma alrededor de 8 segundos para
f 359221 2 40mi computadora portátil de 4 años.Cómo funciona: dobla la multiplicación (
*) en la lista[1..n]. Convierta cada resultado intermedio a basebcomo una lista de dígitos (menos significativos primero), elimine los ceros a la izquierda, luego tome los primeroskdígitos y vuelva a convertir a base 10. Finalmente convierta a basebnuevamente, pero con el dígito más significativo primero.fuente
Python 3, 146 bytes
No estoy seguro de que todos los casos de prueba se ejecuten lo suficientemente rápido: los más grandes son muy lentos (ya que está recorriendo el número).
Pruébelo en línea aquí (pero tenga cuidado).
fuente
Java,
303299296 bytesEn mi computadora, esto promedia un poco menos de un tercio de segundo en el caso de
359221 2 40prueba. Toma entrada a través de argumentos de línea de comando.fuente
a. C., 75 bytes
Esto usa algunas extensiones de GNU para reducir el tamaño del código; un equivalente compatible con POSIX pesa 80 bytes:
Para mantener los tiempos de ejecución razonables, recortamos los ceros finales (
while(!x%b)x/=b) y truncamos a loskdígitos finales (x%=b^k) mientras calculamos el factorial (for(x=1;n;)x*=n--).Programa de prueba:
El tiempo de ejecución del conjunto de pruebas completo es de aproximadamente 4¼ segundos en mi estación de trabajo vintage 2006.
fuente
bcprograma (golf o no), por lo que cualquier consejo es especialmente bienvenido ...PHP, 80 bytes
Utilizado como
f(359221,2,40)para el último caso de prueba. Funciona bastante bien para todos los casos de prueba.Intenta aquí !
fuente