Debe escribir un programa o función que proporcione tres enteros positivos n b k
como salidas de entrada o devuelva los últimos k
dígitos antes de los ceros finales en la b
representació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 k
donde2 <= 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 3
Saldría "013" o "13"?7 10 4
caso de prueba, diría13
n
ok
? ¿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
b
para guardar primero 2 bytes?IntegerString[#!#2^-#!~IntegerExponent~#2,##2]&
(tanto este como tu original son bastante rápidos)SlotSequence
truco 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)&3
es 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
dc
secuencia de comandos de mi respuesta para encontrar el factorial , que sale en base$2
,sed
para recortar ceros finales ytail
seleccionar los últimos$3
dígitos.fuente
rev
para reducir el retroceso, pero esdc
eso 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 40
mi computadora portátil de 4 años.Cómo funciona: dobla la multiplicación (
*
) en la lista[1..n]
. Convierta cada resultado intermedio a baseb
como una lista de dígitos (menos significativos primero), elimine los ceros a la izquierda, luego tome los primerosk
dígitos y vuelva a convertir a base 10. Finalmente convierta a baseb
nuevamente, 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 40
prueba. 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 losk
dí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
bc
programa (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