Producto de divisores

21

Reto

Dado un número entero positivo, devuelve el producto de sus divisores, incluido él mismo.

Esta es la secuencia A007955 en el OEIS .

Casos de prueba

1: 1
2: 2
3: 3
4: 8
5: 5
6: 36
7: 7
8: 64
9: 27
10: 100
12: 1728
14: 196
24: 331776
25: 125
28: 21952
30: 810000

Tanteo

Este es el , por lo que gana la respuesta más corta en cada idioma.

musicman523
fuente
2
Nota interesante (aunque probablemente no sea tan útil para este desafío): el producto de todos los divisores de n siempre es n ^ ((número de divisores de n) / 2).
Wojowu

Respuestas:

13

05AB1E , 2 bytes

ÑP

Pruébalo en línea!

Explicación

Ñ    # divisors
 P   # product
Emigna
fuente
A primera vista, diría que esta solución pertenece a P, pero algo me detiene ...
Uriel
7

Japt , 3 bytes

â ×

Pruébalo en línea!

Explicación

â ×  // implicit integer input

â    // get integer divisors
  ×  // get product of array
Justin Mariner
fuente
Maldita sea, ¿cómo me ninja? : p Eliminará el mío cuando llegue a una computadora (siempre que sea posible).
Shaggy
@ Shaggy Estoy sorprendido, ya que me acabo de enterar de ambos ây ×cuando escribo esta respuesta
Justin Mariner, el
Me retrasé por el minuto. límite de caracteres!
Shaggy
5

Python 3 , 42 41 bytes

¡Salvado 1 byte gracias a Leaky Nun!

f=lambda i,k=1:k>i or k**(i%k<1)*f(i,k+1)

Pruébalo en línea!

musicman523
fuente
1
(1,k)[i%k<1]es equivalente ak**(i%k<1)
Leaky Nun
Wow eso es genial, gracias!
musicman523
3

Alice , 12 bytes

/o
\i@/Bdt&*

Pruébalo en línea!

Explicación

Este es solo el marco regular para E / S decimal:

/o
\i@/...

Entonces el programa es:

B    Get all divisors of the input.
dt   Get the stack depth minus 1.
&*   Multiply the top two stack elements that many times, folding multiplication
     over the stack.
Martin Ender
fuente
3

Neim , 2 bytes

𝐅𝐩

Pruébalo en línea!

Okx
fuente
3
Yo desplazándome por las respuestas: código monoespaciado simple, código monoespaciado simple, simple ... negrita, ¿código serif? :-P
ETHproductions
@ETHproductions Jeje.
Okx
44
@ETHproductions Realmente codifiqué esta respuesta en iOS, lo que significa que no puedo ver los personajes.
Okx
Eso es ... bastante impresionante.
ETHproductions
2
@MamaFunRoll Ahora ese es un nombre que no he escuchado en mucho, mucho tiempo ... ;-)
ETHproductions
2

Código de máquina x86-64, 26 bytes

31 C9 8D 71 01 89 F8 FF C1 99 F7 F9 85 D2 75 03 0F AF F1 39 F9 7C EE 89 F0 C3

El código anterior define una función que toma un solo parámetro (el valor de entrada, un entero positivo) en EDI(siguiendo la convención de llamada AMD64 del Sistema V utilizado en Gnu / Unix), y devuelve un único resultado (el producto de los divisores) en EAX.

Internamente, calcula el producto de los divisores utilizando un algoritmo iterativo (extremadamente ineficiente), similar al envío C de pizzapants184 . Básicamente, utiliza un contador para recorrer todos los valores entre 1 y el valor de entrada, verificando si el valor del contador actual es un divisor de la entrada. Si es así, multiplica eso en el producto total acumulado.

Mnemónicos de lenguaje ensamblador sin golf:

; Parameter is passed in EDI (a positive integer)
ComputeProductOfDivisors:
   xor   ecx, ecx        ; ECX <= 0  (our counter)
   lea   esi, [rcx + 1]  ; ESI <= 1  (our running total)
.CheckCounter:
   mov   eax, edi        ; put input value (parameter) in EAX
   inc   ecx             ; increment counter
   cdq                   ; sign-extend EAX to EDX:EAX
   idiv  ecx             ; divide EDX:EAX by ECX
   test  edx, edx        ; check the remainder to see if divided evenly
   jnz   .SkipThisOne    ; if remainder!=0, skip the next instruction
   imul  esi, ecx        ; if remainder==0, multiply running total by counter
.SkipThisOne:
   cmp   ecx, edi        ; are we done yet? compare counter to input value
   jl    .CheckCounter   ; if counter hasn't yet reached input value, keep looping

   mov   eax, esi        ; put our running total in EAX so it gets returned
   ret

El hecho de que la IDIVinstrucción utilice operandos codificados para el dividendo obstaculiza un poco mi estilo, pero creo que esto es bastante bueno para un lenguaje que no tiene incorporados sino aritmética básica y ramas condicionales.

Cody Gray
fuente
2

TI-Basic (TI-84 Plus CE), 24 bytes

Prompt X
1
For(A,1,X
If not(remainder(X,A
AAns
End

Programa completo: solicita información al usuario; devuelve la salida en Ans, una variable especial que (básicamente) almacena el valor del último valor calculado.

Explicación:

Prompt X             # 3 bytes, Prompt user for input, store in X
1                    # 2 bytes, store 1 in Ans for use later
For(A,1,X            # 7 bytes, for each value of A from 1 to X
If not(remainder(X,A # 8 bytes, If X is divisible by A...
AAns                 # 3 bytes, ...store (A * Ans) in Ans
End                  # 1 byte, end For( loop
pizzapants184
fuente
2
En realidad no incluiste el bytecount.
Erik the Outgolfer
@EriktheOutgolfer Whoops! Fijo.
pizzapants184
2

C (gcc), 52 48 bytes

p,a;f(x){for(p=1,a=x;a;a--)p*=x%a?1:a;return p;}

-4 bytes gracias a Cody Gray

Una función que toma un número entero y devuelve el producto de sus divisores.

Pruébalo en línea!

Sin golf:

int proddiv(int input) {
    int total = 1, loopvar;
    for(loopvar = input; loopvar > 0; --loopvar) {
    // for loopvar from input down to 1...
        total *= (input % loopvar) ? 1 : loopvar;
        // ...If the loopvar is a divisor of the input, multiply the total by loopvar;
    }
    return total;
}
pizzapants184
fuente
Puede guardar 4 bytes (1) contando hacia atrás, (2) eliminando los paréntesis alrededor de la p*=expresión y (3) colocando una declaración en el cuerpo del forbucle para colocar una coma. También me gusta usar variables globales, en lugar de agregar parámetros adicionales. Esto evita un comportamiento indefinido, sin costar bytes. Versión final:p,a;f(x){for(p=1,a=x;a;--a)p*=x%a?1:a;return p;}
Cody Gray
Se puede reemplazar return p;con p=p;y guardar cinco bytes.
Jonathan Frech
Para guardar otro byte, puede reemplazar p,a;f(x)con f(x,p,a).
Jonathan Frech
Si usa variables locales en lugar de variables globales, incluso puede deshacerse de todo return p;y guardar no cinco, sino nueve bytes. ( TIO )
Jonathan Frech
2

JavaScript (ES7), 32 bytes

n=>g=(i=n)=>i?i**!(n%i)*g(i-1):1

Ahorró un par de bytes tomando prestada la sugerencia de Leaky sobre la solución Python de musicman .


Intentalo

o.innerText=(f=
n=>g=(i=n)=>i?i**!(n%i)*g(i-1):1
)(i.value=1)();oninput=_=>o.innerText=f(+i.value)()
<input id=i type=number><pre id=o>


Alternativa (ES6), 32 bytes

n=>g=(i=n)=>i?(n%i?1:i)*g(i-1):1
Lanudo
fuente
1
¿Por qué no solo el compatible con ES6 (n%i?1:i)? (Sin embargo, esto no ahorraría ningún byte).
Arnauld
@Arnauld: ¡porque la mitad 6 es claramente demasiado temprano para jugar golf por teléfono! : DI tenía el ternario invertido cuando vi la punta de Leaky!
Shaggy
2

TI-Basic, 24 14 13 bytes

Guardado 1 byte gracias a lirtosiast

:√(Ans^sum(not(fPart(Ans/randIntNoRep(1,Ans
Oki
fuente
1
¿Necesitas el int(?
lirtosiast
1

QBIC , 22 bytes

[:|~b/a=b'\`a|q=q*a}?q

Explicación

[:|           FOR a  = 1; a <= input (b); a++
 b/a=b'\`a    'a' is a proper divisor if integer division == float division
~         |   IF that's true
q=q*a         THEN multiply running total q (starts as 1) by that divsor
}             NEXT
?q            Print q
Steenbergh
fuente
1

Mathematica, 17 bytes

Para aquellos que no pueden ver las respuestas eliminadas (la respuesta de DavidC), este es el código en Mathematica con la ayuda de @MartinEnder

1##&@@Divisors@#&
J42161217
fuente
1

Lenguaje de programación Shakespeare , 353 bytes

.
Ajax,.
Puck,.
Page,.
Act I:.
Scene I:.
[Enter Ajax and Puck]
Ajax:
You cat
Puck:
Listen to thy heart
[Exit Ajax]
[Enter Page]
Scene II:.
Puck:
You sum you cat
Page:
Is Ajax nicer I?If so, is remainder of the quotient Ajax I nicer zero?If not, you product you I.Is Ajax nicer I?If so, let us return to scene II
Scene III:.
Page:
Open thy heart
[Exeunt]

Versión sin golf:

The Tragedy of the Product of a Moor's Factors in Venice.

Othello, a numerical man.
Desdemona, a product of his imagination.
Brabantio, a senator, possibly in charge of one Othello's factories.

Act I: In which tragedy occurs.

Scene I: Wherein Othello and Desdemona have an enlightened discussion.

[Enter Othello and Desdemona]

Othello:
  Thou art an angel!

Desdemona:
  Listen to thy heart.

[Exit Othello]
[Enter Brabantio]

Scene II: Wherein Brabantio expresses his internal monologue to Desdemona.

Desdemona:
  Thou art the sum of thyself and the wind!

Brabantio:
  Is Othello jollier than me?
  If so, is the remainder of the quotient of Othello and I better than nothing?
  If not, thou art the product of thyself and me.
  IS Othello jollier than me?
  If so, let us return to scene II!

Scene III: An Epilogue.

Brabantio:
  Open thy heart!

[Exeunt]

Estoy usando este compilador SPL para ejecutar el programa.

Corre con:

$ python splc.py product-of-divisors.spl > product-of-divisors.c
$ gcc product-of-divisors.c -o pod.exe
$ echo 30 | ./pod
810000
Cobre
fuente
1

Python 3, 45 bytes

lambda _:_**(sum(_%-~i<1for i in range(_))/2)

Deja xser un número. Ambos yy zserán divisores de xif y * z = x. Por lo tanto, y = x / z. Digamos que un número dtiene 6 divisiors, debido a esta observación los divisores serán a, b, c, d / a, d / b, d / b. Si multiplicamos todos estos números (el punto del rompecabezas), obtenemos d * d * d = d ^ 3. En general, para eun número de fdivisores, el producto de dichos divisores será e ^ (f / 2), que es lo que hace la lambda.

Pruébalo en línea!

Mario Ishac
fuente
1

MY , 4 bytes

Maleficio:

1A 3A 54 27

Explicación:

1A - Input as an integer
3A - Factors
54 - Product
27 - Output (with newline)
Zacharý
fuente
1

Java (OpenJDK 8) , 52 51 bytes

n->{int r=n,d=0;for(;++d<n;)r*=n%d<1?d:1;return r;}

Pruébalo en línea!

¡Gracias LeakyNun por guardar 1 byte!

Olivier Grégoire
fuente
1
n->{int r=n,d=0;for(;++d<n;)r*=n%d<1?d:1;return r;}
Leaky Nun
0

Fortran 95, 88 bytes

function l(k)
n=0
l=1
do while(n<k)
n=n+1
if(MODULO(k,n)==0)then
l=l*n
end if
end do
end

Pruébalo en línea!

Sin golf:

integer function l(k)
    implicit none
    integer :: n, k

    n=0
    l=1
    do while (n<k)
        n=n+1
        if (MODULO(k,n) == 0) then
            l=l*n
        end if
    end do

end function l
Steadybox
fuente
0

Axioma, 23 bytes

h(x)==x^(#divisors x/2)

Esta es una traducción en Axioma de la solución alephalpha

RosLuP
fuente