El sistema de numeración factorial , también llamado factoradic, es un sistema mixto de números radix. Los factoriales determinan el valor posicional de un número.
En este sistema, el dígito más a la derecha puede ser 0 o 1, el segundo dígito a la derecha puede ser 0, 1 o 2, y así sucesivamente. Esto significa que un n
número factoradic de un dígito puede tener un valor máximo de (n + 1)!
.
Por ejemplo, para convertir el número factoradic 24201
a decimal, haría esto:
2 * 5! = 240
4 * 4! = 96
2 * 3! = 12
0 * 2! = 0
1 * 1! = 1
240 + 96 + 12 + 0 + 1 = 349
Por lo tanto, el número factoradic 24201
es 349
base 10
.
Para convertir un número decimal (con 349
un ejemplo) en un número factoradic, debe hacer esto:
Tome el factorial más grande menor que el número. En este caso es 120
, o 5!
.
349 / 5! = 2 r 109
109 / 4! = 4 r 13
13 / 3! = 2 r 1
1 / 2! = 0 r 1
1 / 1! = 1 r 0
Por lo tanto, 349
base 10
es el número factoradic 24201
.
Su desafío es crear el programa o la función más corta que convierta un número de entrada a la otra base.
La entrada será una representación de cadena de un entero no negativo. Un número factoradic estará precedido por un !
(por ejemplo !24201
), mientras que un número decimal no estará precedido por nada. Puede suponer que la entrada máxima será 10! - 1
- 3628799
en decimal y 987654321
en factoradic. Esto significa que las letras no aparecerán en una entrada / salida factoradic.
El programa no necesita anteponer !
a una salida factoradic, y puede generar una cadena o un entero. La entrada puede estar en cualquier formato razonable.
Casos de prueba:
Input: 1234
Output: 141120
Input: 746
Output: 101010
Input: !54321
Output: 719
Input: !30311
Output: 381
fuente
⍴⍵∩'!'
con'!'∊⍵
guardar un carácter.~'!'
con∩⎕D
para guardar un personaje.Python 2.7 (
163157152)Versión más legible:
Descompostura:
fuente
'!'==i[0]
con'!'in i
, y puede utilizara=x=1
. Además, no necesita corchetes alrededor de la declaración ejecutiva.(len(i)-1)
con~-len(i)
.(a,b)['!'in i]
y logré eliminar 6 caracteres. Sin embargo, no es tan fácil de leer ... enlace de pastebinGolfScript (
48 4443 caracteres)Este es un programa autónomo. La conversión factoriadic => decimal es bastante lenta, porque realiza una búsqueda utilizando la conversión decimal => factoriadic en lugar de una conversión de base directa.
El formato de entrada permite un cambio de modo muy corto:
.~
copia la cadena de entrada y la evalúa, por lo que si la entrada es solo un número, terminamos, por ejemplo,"1234" 1234
en la pila, y si comienza con!
(no lógico, con cualquier no vacío cadena siendo veraz) terminamos con, por ejemplo,0 30311
en la pila. Entonces el valor en la parte inferior de la pila es verdadero para decimal => factoriadic y falso para factoriadic => decimal.fuente
PHP <7.1
178 171 170 168 164 155 147 144 138 126123 bytesEjecutar como tubería con
-r
o probarlo en línea .subnecesita : la base factorial se reutiliza (aumenta / disminuye en los bucles)decimal 0 devuelve una cadena vacía en lugar de(las otras dos respuestas PHP también lo hacen).0
.Si eso es inaceptable, agregue +5 para el caso adicional.sin golf:
ideas de golf abandonadas:
$b<=$x
->$b<$x
(-1)rompería factoriales decimales puros (es decir, aquellos que resultan en un número factorial con solo un dígito distinto de cero) La solución de JMPC sufre de eso; HamZa´s no.
floor($x/$b)
->(int)($x/$b)
podría ser un poco más rápido, pero la conversión de tipos precede a la división, así que necesito los paréntesis y no obtengo un byte.
$x/$b|0
Hace el trucoEl bucle de hecho-> dec es similar al factorial-find en dec-> fact. El mismo incremento, el cuerpo no importa, pero desafortunadamente, la condición predeterminada y la condición de publicación son diferentes. Dang podría haber jugado golf -21 allí.YAY encontré una solución. Tomó bastante golf, pero cortó otro -4 (no: -9) y cerró todos los errores / lagunas.
¿Algún potencial más ... o he terminado de jugar al golf?
fuente
+$r
en lugar de$r|0
guardar un byte. Lo mismo paraif($x|0)
JavaScript (ES 6)
139137122113111Probé un enfoque diferente usando un poco de magia de matriz; pero terminé en
174172 bytes con eso:Así que tomé mi código PHP y lo traduje. Podría eliminar todos los
$
sy algunos;
, pero la necesidad de inicializar vars consumió parte de ese beneficio. Sin embargo, manejado para jugar al golf ambas respuestas se redujeron un poco más.golf
sin golf
Banco de pruebas
fuente
.split('')
=>.split``
f=
. Además, pueder+=(x/(b/=j--)|0)
serr+=x/(b/=j--)|0
?Perl 6 ,
666560 bytes-1 byte gracias a Jo King
Pruébalo en línea!
fuente
GolfScript, 69 caracteres
Toma información de STDIN como de costumbre e imprime el resultado. Prueba en línea .
fuente
Haskell, 221 caracteres
Code Golf
Uso
Código sin golf
fuente
Mathematica
213 177175Se incluye un número factorial
f[]
, ya sea entrada o salida.Uso
Conversión de factorial a número decimal .
QuotientRemainder[n,j!]
Actúa recursivamente sobre los dígitos del número factorial de izquierda a derecha, disminuyendoj
en cada paso.QuotientRemainder[349, 5!]
, por ejemplo, retornos,{2, 109}
etc.Conversión de decimal a número factorial . Moviéndose de derecha a izquierda, la función pura
# (p++)! &
, multiplica cada dígito#
, por el factorial apropiado.fuente
Python, 128 caracteres
Esto tarda aproximadamente media hora en ejecutarse, pero es pequeño:
Construye una lista de todos los números factoradic <= 9 dígitos en orden numérico, luego realiza una búsqueda o índice para convertir.
Si quieres prueba, basta con sustituir
10**9
con10**6
y restringirse a los números variadic de 6 dígitos.Técnicamente podría guardar un personaje usando en
range(10**9)
lugar dexrange(10**9)
. No intentes esto en casa.fuente
d+2
yfor
PHP
231214204Respuesta más reciente
Vieja respuesta
Ejemplo
Salida
fuente
foreach(range())
se puede reemplazar con unfor
bucle simple (-9). Sin embargo, me gusta la idea.24
debería volver1000
pero vuelve400
. arreglo:g(++$p)<$x
->g(++$p)<=$x
(+1)for
construcción:,
debería ser;
3) Tengo otros 7 cambios ahorrando 20 bytes en ese código. ¿Los quiero?if
condición, luego usar my sexy type emitió a int (-6) ¡Esto no afectará el resultado decimal 0! e) lafor
construcción restante se puede reescribir con un muy buenwhile(++$t<$c=strlen($x))
: incremento antes del cuerpo -> $ t no necesita inicialización (-6)JALEA, 5 bytes
Explicación
* Jelly es más joven que la edad de la pregunta, por lo tanto, mi respuesta no es competitiva.
fuente
V
yṾ
.)Jalea , 15 bytes
Pruébalo en línea!
Cómo funciona
Por que
*)
funciona¬
es un elemento lógico NO. Cuando se le da un solo entero, se convierte en un solo cero, que es falso. Sin embargo, cuando se le asigna una cadena, cada elemento (carácter) se convierte en cero, y el resultado completo es una matriz de ceros, lo cual es cierto.Cero como entero es un caso especial. Pasa por la ruta "factorial -> entero", pero aún da cero, que es correcto.
Sin base factorial incorporada, 25 bytes
Pruébalo en línea!
Cómo funciona
fuente
K, 102
Definitivamente podría mejorarse.
fuente
D (159 caracteres)
Sin golf y con punto de entrada al programa
Todos los argumentos de la línea de comando se imprimen como
<original> -> <converted>
. Solo se implementa en decimal a factoradicx
. Al revés solo llamax
con todos los números decimales (0 .. *) hasta que el resultado sea igual a la entrada. Esto toma ~ 3 segundos para la entrada más grande (! 987654321).Versión en línea ejecutable: http://dpaste.dzfl.pl/46e425f9
fuente
string n
achar[]n
para guardar un byte (sé que llego tarde aquí).if(n[0]<48){while(r.text.x<n[1..$].to!int)r++;}
puede llegarif(n[0]<48)while(r.text.x<n[1..$].to!int)r++;
a ser para guardar dos bytes.VBA 225
¡Gracias a Titus por la ayuda! Todavía estoy buscando jugar al golf un poco más.
fuente
b
un valor numérico en lugar de comparar el primer carácter?If Not IsNumeric(b) Then
pero eso requiere más caracteres. Ahora, no entré y reexaminé todo el código; Puede haber una manera ligeramente mejor de hacer esto enIsNumeric
general. - Corrección, hay una ligera mejora aquí. ¡Gracias!For d=9To 1Step-1
yFact(d)
->For d=0To 8
yFact(9-d)
y otros dos si lo hacesFor d=2To e
yFact(e-d+1)*Mid(b,d,1)
PHP , 124 bytes
Pruébalo en línea!
Extendido
fuente
Perl 6 , 150 bytes
fuente
APL (NARS), 36 caracteres, 72 bytes
parece que 10⊥ (9..2) ⊤ es mejor que la función recursiva, gracias a Howard por la otra solución APL que muestra que ... (incluso si no entiendo 100%). Entrada para números sin '!' <10 !. Prueba:
fuente