Su función toma un número natural y devuelve el número natural más pequeño que tiene exactamente esa cantidad de divisores, incluido él mismo.
Ejemplos:
f(1) = 1 [1]
f(2) = 2 [1, 2]
f(3) = 4 [1, 2, 4]
f(4) = 6 [1, 2, 3, 6]
f(5) = 16 [1, 2, 4, 8, 16]
f(6) = 12 [1, 2, 3, 4, 6, 12]
...
La función no tiene que devolver la lista de divisores, solo están aquí para los ejemplos.
Respuestas:
APL,
252423 caracteresDefine una función
f
que luego puede usarse para calcular los números:La solución utiliza el hecho de que LCM (n, x) == n iff x divide n . Por lo tanto, el bloque
{+/⍵=⍵∧⍳⍵}
simplemente calcula el número de divisores. Esta función se aplica a todos los números del 1 al 2 ^ d¨⍳2*⍵
. Luego se busca en la lista resultante d sí mismo (⍳⍵
), que es la función deseada f (d) .fuente
{⍵⍳⍨(+/⊢=⊢∧⍳)¨⍳2*⍵}
f
.GolfScript,
2928 caracteresEditar: se puede guardar un único carácter si restringimos la búsqueda a <2 ^ n, gracias a Peter Taylor por esta idea.
Versión previa:
Un intento en GolfScript, ejecutar en línea .
Ejemplos:
El código contiene esencialmente tres bloques que se explican en detalle en las siguientes líneas.
fuente
1
.Python: 64
Al revisar la solución de Bakuriu e incorporar la sugerencia de grc, así como el truco de la solución R de plannapus, obtenemos:
fuente
Python: 66
Lo anterior elevará un
RuntimeError: maximum recursion depth exceeded
con pequeñas entradas en CPython, e incluso establecer el límite en un gran número probablemente dará algunos problemas. En las implementaciones de Python que optimizan la recursividad de la cola, debería funcionar bien.Una versión más detallada, que no debería tener tales limitaciones, es la siguiente solución de 79 bytes:
fuente
if else
conand or
y==1
con<1
:f=lambda n,k=1:n==sum(k%i<1for i in range(1,k+1))and k or f(n,k+1)
sum(k%-~i<1for i in range(k))
f=lambda n,k=1:n==sum(k%-~i<1for i in range(k))or-~f(n,k+1)
ahorra 7 bytes.Mathematica
3836Uso:
Resultado:
Editar
Alguna explicación:
Como
form[i]
estoy usando la función1 &
, eso siempre regresa1
, calculando tan efectivamente la suma de los divisores de una manera concisa.fuente
DivisorSum
retorna (la suma de los divisores) pero no veo cómo eso es instrumental para responder la pregunta planteada. ¿Podría explicar cómo funciona? Por cierto, creo que debería incluir datos de tiempo para n = 200; la función es notablemente rápida, dados todos los números que tuvo que verificar.J, 33 caracteres
Bastante rápido, pasa por todos los números más pequeños y calcula el número de divisores en función de la factorización.
fuente
Haskell 54
Solución rápida y sucia (tan legible y no complicada):
fuente
K, 42
Solución recursiva ineficiente que explota la pila con bastante facilidad.
.
fuente
APL 33
Ejemplo:
fuente
APL (25)
fuente
R - 47 caracteres
!n%%1:n
da un vector de booleanos: VERDADERO cuando un entero de 1 a n es un divisor de n y FALSO si no.sum(!n%%1:n)
coacciona booleanos a 0 si es FALSO y 1 si es VERDADERO y los suma, de modo queN-sum(...)
es 0 cuando el número de divisores es N. 0 se interpreta entonces como FALSO porwhile
cual se detiene.Uso:
fuente
Javascript 70
Realmente solo hay 46 personajes significativos:
Probablemente debería aprender un idioma con una sintaxis más corta :)
fuente
N=>eval("for(j=i=m=1;m-N||j-i;j>i?i+=m=j=1:m+=!(i%++j));i")
Haskell: 49 caracteres
Podría verse como una mejora de la solución anterior de Haskell, pero fue concebida por derecho propio (advertencia: es muy lenta):
Es una función bastante interesante, por ejemplo, tenga en cuenta que f (p) = 2 ^ (p-1), donde p es un número primo.
fuente
n
en números primos (con repetición), ordenar descendentes, disminuir cada uno, comprimir con una secuencia infinita de números primos y luego doblar el producto dep^(factor-1)
C:
6664 caracteresUna solución casi corta:
Y mi solución anterior que no se repite:
Deben existir soluciones mucho más cortas.
fuente
Haskell (120C), un método muy eficiente
Código de prueba:
Este método es muy rápido. La idea es primero encontrar los factores primos de
k=p1*p2*...*pm
, donde p1 <= p2 <= ... <= pm. Entonces la respuesta esn = 2^(pm-1) * 3^(p(m-1)-1) * 5^(p(m-2)-1) ...
.Por ejemplo, factorizando k = 18, obtenemos 18 = 2 * 3 * 3. Los primeros 3 primos son 2, 3, 5. Entonces la respuesta n = 2 ^ (3-1) * 3 ^ (3-1) * 5 ^ (2-1) = 4 * 9 * 5 = 180
Puedes probarlo en
ghci
:fuente
Brachylog , 2 bytes
Pruébalo en línea!
Toma entradas a través de su variable de salida y salidas a través de su variable de entrada.
Este mismo predicado exacto, tomando la entrada a través de su variable de entrada y emitiendo a través de su variable de salida, resuelve este desafío en su lugar .
fuente
C, 69 caracteres
No es el más corto, pero la primera respuesta C:
f(n,s)
cuenta divisores den
en el rango1..s
. Asíf(n,n)
cuenta los divisores den
.g(d)
bucles (por recursión) hastaf(x,x)==d
, luego devuelve x.fuente
Mathematica
3836Uso
Primera entrada (antes de
code-golf
agregar la etiqueta a la pregunta).Un problema sencillo, dado que
Divisors[n]
devuelve los divisores den
(incluidon
) yLength[Divisors[n]]
devuelve el número de dichos divisores. **Ejemplos
fuente
Length@Divisors@n
esDivisorSigma[0,n]
.DivisorSigma
.Gelatina , 6 bytes (no competitiva)
Pruébalo en línea! o verificar todos los casos de prueba .
Cómo funciona
fuente
2*
? ¿Es que cada número después de eso tiene más divisores que n?2**(n-1)
pertenece a ese rango, el más pequeño también.C ++, 87 caracteres
fuente
Python2, 95 caracteres, no recursivo
Un poco más detallado que las otras soluciones de Python, pero no es recursivo, por lo que no alcanza el límite de recurrencia de cpython:
fuente
Perl 6 , 39 caracteres
Ejemplo de uso:
fuente