Inspirada en las raíces digitales, la raíz factoral principal de un número es el número que emerge cuando tomas los factores primos de un número, los sumas y repites el proceso en el número resultante, continuando hasta que terminas con un número primo ( que se tiene a sí mismo como su único factor primo y, por lo tanto, es su propia raíz factoral primaria). La raíz factoral primaria de 4 es 4, ya que 2 * 2 = 2 + 2, y esta es la única raíz factoral prima no prima de un entero mayor que 1 (que es otro caso especial, ya que no tiene factores primos). La secuencia OEIS formada por raíces factoras primarias es A029908 .
Por ejemplo, la raíz factoral principal de 24 es:
24=2*2*2*3
2+2+2+3=9=3*3
3+3=6=2*3
2+3=5, and the only prime factor of 5 is 5. Therefore, the prime factoral root of 24 is 5.
Tu tarea:
Escriba un programa o función que encuentre la raíz factoral principal de un entero de entrada.
Entrada:
Un número entero, ingresado a través de cualquier método razonable, entre 2 y el número entero más grande que admitirá su idioma (inclusive). Específicamente, no está permitido elegir un idioma que tenga un tamaño entero máximo irrazonablemente bajo (y también viola este vacío legal estándar )
Salida:
Un número entero, la raíz factoral principal de la entrada.
Casos de prueba:
4 -> 4
24 -> 5
11 -> 11
250 -> 17
Puntuación:
Este es el código de golf , ¡la puntuación más baja en bytes gana!
4
en los casos de prueba, ya que es una excepción y es fácil olvidarlo mientras prueba una respuesta?Respuestas:
05AB1E , 3 bytes
Pruébalo en línea!
Explicaciones:
fuente
4
.Haskell , 61 bytes
Pruébalo en línea!
Explicación
until=<<((==)=<<)
toma una funciónf
y la aplica a la entradax
hasta que se alcanza un punto fijo, que esf x
igualx
.primeFactors
devuelve la lista de factores primos de un número,sum
produce la suma de una lista de números.Pero espera, ¿por qué
until=<<((==)=<<)
el trabajo y se ve tan raro?Si suponemos
f=sum.primeFactors
, una definición más natural seríauntil(\x->f x==x)f
, porqueuntil
toma un predicado (una función que devuelve un valor booleano), una función que tiene el mismo tipo de entrada y retorno (por ejemploInt -> Int
) y valor de este tipo, y luego aplica la función al valor hasta que se cumpla el predicado.until(\x->f x==x)f
es lo mismo queuntil(\x->(==)(f x)x)f
, y como sostiene queg (h x) x
es lo mismo que(g=<<h)x
, obtenemosuntil(\x->((==)=<<f)x)f
. Después de la conversión Eta , esto se convierteuntil((==)=<<f)f
. Pero si ahora tratamos(==)=<<
como una función que se aplica af
, podemos ver queuntil(((==)=<<)f)f
es de nuevo de la formag (h x) x
, cong=until
,h=((==)=<<)
yx=f
, por lo que se puede reescribir a(until=<<((==)=<<))f
. Usando el$
operador para deshacerse de los paréntesis externos y sustituyéndolosf
consum.primeFactors
la solución de arriba.fuente
=<<((==)=<<)$
Whaaaaaat.Casco , 4 bytes
Pruébalo en línea!
Explicación:
fuente
Pyth , 3 bytes
Pruébalo aquí.
Explicación:
fuente
The trailing GQ is implicit
Python 2 , 84 bytes
Pruébalo en línea!
fuente
f=lambda n,d=2:n>1and(n%d and f(n,d+1)or d+f(n/d))
funciona? Nunca he programado en Python (principalmente Java y C #), así que no estoy seguro de cuál es el resultado de esta función. ¿Esta función modifica la entradan
y la devuelve después, o es similar a un booleano donden>1and(n%d and f(n,d+1)or d+f(n/d))
es 0 o 1, o 0 on
, o algo más? Estoy tratando de visualizar cómo se vería un puerto de esto en Java / C #, pero no puedo porque realmente no entiendo Python lambdas como este en general.n>1 ? (n%d!=0 ? f(n, d+1) : d+f(n/d)) : n>1
. En términos generalesx and y
es equivalente ax ? y : x
.x and y or z
es equivalente ax ? y : z
en la mayoría de los casos.f=(n,d=2)->n>1?n%d>0?f(n,d+1):d+f(n/d):0
.x and y
serx ? y : x
de JavaScript también. ¡Gracias!Java 8,
175144142141 bytes-1 byte gracias a @Nevay .
A diferencia de los bytes individuales en algunos de los lenguajes de golf, Java es bastante detallado para verificaciones primas, factores primos, sumas de dígitos y demás, por lo que supongo que menos de 200 no está nada mal.
Lo más probable es que se pueda jugar golf combinando bucles
y no utilizando un método recursivo separado para la suma de dígitos.Explicación:
Pruébalo aquí.
fuente
i,t=n,x
parece que pertenece a Python, jajaint
(a diferencia de Python). ;)i++<n
lugar de++i<=n
.Jalea , 5 bytes
Explicaciones:
Pruébalo en línea!
fuente
Retina , 30 bytes
Entrada y salida en unario .
Pruébalo en línea! (Realiza conversión decimal / unaria por conveniencia).
Explicación
Le
{
indica a Retina que ejecute todo el programa en un bucle hasta que un paso completo no pueda modificar la cadena, es decir, hasta que se alcance un punto fijo. En consecuencia, el programa mismo calcula un paso para sumar los factores primos del valor actual.Esta etapa misma calcula la factorización prima de la entrada. El
+
es similar a{
pero realiza un bucle solo en esta etapa hasta que deja de cambiar la cadena. La expresión regular intenta hacer coincidir la ejecución final de1
s haciendo coincidir repetidamente la misma subcadena (es decir, el factor). La forma en que se hace esto es un poco complicada debido a la referencia directa\1
. En la primera iteración, el grupo1
aún no ha capturado nada, por lo que\1
falla incondicionalmente. En cambio, tenemos que hacer coincidir\b11+?\B
cuál es la subcadena más pequeña posible que comienza al comienzo de la ejecución, contiene al menos dos1
sy no cubre la ejecución completa. Las iteraciones posteriores no podrán volver a utilizar esta alternativa debido a\b
. Entonces, en todas las iteraciones posteriores, estamos haciendo coincidir\1
, es decir, la misma subcadena una y otra vez. Este proceso tiene que llegar al final de la cadena exactamente ($
) para asegurarse de que hayamos capturado y divisor real. El beneficio de utilizar este enfoque algo complicado es que el grupo1
se habrá utilizado exactamente n / d veces, es decir, lo que queda después de dividir el divisor d .Reemplazamos esta coincidencia con d (
$1
), una separación;
y n / d ($#1$*
, que inserta$#1
copias de1
, donde$#1
es el número de capturas realizadas por grupo1
).Este proceso se detiene una vez que la ejecución final en la cadena es en sí misma un primo, porque la expresión regular ya no coincide.
Todo lo que necesitamos hacer para sumar los números primos es eliminar todos los separadores.
fuente
Ohm v2 , 4 bytes
Pruébalo en línea!
Explicación:
fuente
En realidad , 7 bytes
Pruébalo en línea!
Explicación:
fuente
R + pracma , 53 bytes
Pruébalo en línea! (violín r)
R no tiene una orden interna factores primos, pero numerosos paquetes (
pracma
,numbers
, etc.) hacer, así que cogí un convenientemente corta.fuente
Jalea , 6 bytes
Esta respuesta utiliza una de las muchas incorporaciones de factorización primarias de Jelly, y la rápida
repeat until the results are no longer unique
.Pruébalo en línea!
fuente
1
es el único caso en el que la cantidad de pasos necesarios es igual an
(lo cual está bien;1
solo tenemos que ejecutarlo una vez), y no parece haber ningún caso en el que la cantidad de pasos sea mayor quen
(es decir no parece haber ningún contraejemplo). Ah bueno, me han superado: DMATL , 6 bytes
Utiliza la idea de scottinet de recorrer más veces de lo necesario. Gracias también a Shaggy por señalar un error, ahora corregido.
Pruébalo en línea!
Explicación
fuente
4
.PowerShell , 124 bytes
Pruébalo en línea!
PowerShell no tiene incorporados factores de factorización primos, por lo que utiliza el código de mi respuesta en Prime Factors Buddies (la línea superior) para realizar los cálculos de factorización.
La segunda línea es la carne de este programa. Tomamos el aporte de
$args
en$x
, a continuación,for
bucle hasta que$l
es-n
ote
qual a$x
. (La primera iteración$l
es$null
y$x
es un número entero, por lo que realizaremos un bucle al menos una vez).Dentro del bucle, establecemos nuestro
$l = $x
para determinar si hemos llegado al final del bucle o no. Entonces se obtienen los factores de$x
laf($x)
,-join
los, junto con+
y|iex
ellos (la abreviatura deInvoke-Expression
y similares aeval
). Eso se almacena de nuevo en$x
. Por lo tanto, hemos llegado al "final", donde la factorización prima sumada es volver a sí misma. Luego, simplemente colocamos$x
en la tubería y la salida es implícita.fuente
Mathematica, 35 bytes
Pruébalo en línea!
(Las matemáticas no son compatibles
Tr
. Tengo que implementarlo manualmente)fuente
1##&
es la abreviaturaTimes
yFixedPoint
casi siempre se puede acortar con//.
:#//.x_:>Tr[1##&@@@FactorInteger@x]&
Times
, pero no he sabido sobre elFixedPoint
truco.Tr
a Mathics hace un tiempo .Ruby , 63 bytes
Pruébalo en línea!
Utiliza el
-rprime
indicador de +6 bytes para utilizar Prime # prime_division .prime_division
devuelve pares de[prime, exponent]
(por ejemplo, para 24 tenemos los factores[2, 2, 2, 3]
por lo que da[[2, 3], [3, 1]]
) así que en cada paso simplemente multiplicamos los miembros de esos pares y sumamos los resultados.fuente
Javascript (ES6), 63 bytes
Sin golf:
fuente
Java 8, 101 bytes
La sorprendente respuesta de Python 2 de @ovs .
Explicación:
Pruébalo aquí.
fuente