Produto dos divisores

21

Desafio

Dado um número inteiro positivo, retorne o produto de seus divisores, incluindo ele próprio.

Esta é a sequência A007955 no OEIS .

Casos de teste

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

Pontuação

Isso é , então a resposta mais curta em cada idioma vence!

musicman523
fonte
2
Nota interessante (embora provavelmente não seja tão útil para este desafio): o produto de todos os divisores de n é sempre n ^ ((número de divisores de n) / 2).
Wojowu 09/07

Respostas:

13

05AB1E , 2 bytes

ÑP

Experimente online!

Explicação

Ñ    # divisors
 P   # product
Emigna
fonte
Ao primeiro olhar eu diria que esta solução pertence sob P, mas algo me prende fora ..
Uriel
7

Japonês , 3 bytes

â ×

Experimente online!

Explicação

â ×  // implicit integer input

â    // get integer divisors
  ×  // get product of array
Justin Mariner
fonte
Droga, como você me ninja ?! : p Exclui o meu quando eu chegar ao computador (sempre que possível).
Shaggy
@Shaggy Estou surpreso, já que eu só descobri sobre ambos âe ×ao escrever esta resposta
Justin Mariner
Eu fui desacelerado pelo minuto. limite de caracteres!
Shaggy
5

Python 3 , 42 41 bytes

Guardado 1 byte graças a Leaky Nun!

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

Experimente online!

musicman523
fonte
1
(1,k)[i%k<1]é equivalente ak**(i%k<1)
gotejante Nun
Uau, isso é incrível, obrigado!
musicman523
4

Haskell , 35 34 bytes

-1 graças a ovs

f n=product[x|x<-[2..n],n`mod`x<1]

Experimente online!

bartavelle
fonte
3

Alice , 12 bytes

/o
\i@/Bdt&*

Experimente online!

Explicação

Esta é apenas a estrutura regular para E / S decimal:

/o
\i@/...

Então o programa é:

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
fonte
3

Neim , 2 bytes

𝐅𝐩

Experimente online!

Okx
fonte
3
Eu percorrendo as respostas: código monoespaçado simples, código monoespaçado simples, simples ... negrito, código serif? :-P
ETHproductions
@ETHproductions Hehe.
Okx 08/07/19
4
@ETHproductions Na verdade, eu codifiquei essa resposta no iOS, o que significa que não consigo ver os caracteres.
Okx 08/07/19
Isso é ... impressionante.
ETHproductions
2
@MamaFunRoll Agora que é um nome que eu não tenha ouvido falar em um longo, longo tempo ... ;-)
ETHproductions
3

R , 28 bytes

v=scan():1;prod(v[!v[1]%%v])

Experimente online!

Scarabee
fonte
2

Código da 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

O código acima define uma função que recebe um único parâmetro (o valor de entrada, um número inteiro positivo) em EDI(seguindo a convenção de chamada do System V AMD64 usada no Gnu / Unix) e retorna um único resultado (o produto dos divisores) em EAX.

Internamente, ele calcula o produto de divisores usando um algoritmo iterativo (extremamente ineficiente), semelhante à submissão C de pizzapants184 . Basicamente, ele usa um contador para percorrer todos os valores entre 1 e o valor de entrada, verificando se o valor atual do contador é um divisor da entrada. Nesse caso, ele multiplica isso no produto total em execução.

Mnemônicos de linguagem assembly não destruídos:

; 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

O fato de a IDIVinstrução usar operandos codificados para os dividendos diminui um pouco meu estilo, mas acho que isso é muito bom para uma linguagem que não tem built-ins, mas aritmética básica e ramificações condicionais!

Cody Gray
fonte
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 entrada do usuário; retorna a saída in Ans, uma variável especial que (basicamente) armazena o valor do último valor calculado.

Explicação:

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
fonte
2
Na verdade, você não incluiu o número de bytes.
Erik the Outgolfer
@EriktheOutgolfer Whoops! Fixo.
precisa saber é o seguinte
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 graças a Cody Gray

Uma função que recebe um número inteiro e retorna o produto de seus divisores.

Experimente online!

Ungolfed:

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
fonte
Você pode salvar 4 bytes (1) contando para trás, (2) removendo os parênteses ao redor da p*=expressão e (3) colocando uma instrução no corpo do forloop para soltar uma vírgula. Também gosto de usar vars globais, em vez de adicionar parâmetros extras. Isso evita um comportamento indefinido, sem custar bytes. Versão final:p,a;f(x){for(p=1,a=x;a;--a)p*=x%a?1:a;return p;}
Cody Gray
Você pode substituir return p;com p=p;e salvar cinco bytes.
Jonathan Frech
Para salvar outro byte, você pode substituir p,a;f(x)por f(x,p,a).
Jonathan Frech
Se você usar variáveis ​​locais em vez de variáveis ​​globais, poderá até se livrar da totalidade return p;e salvar não cinco, mas nove bytes. ( TIO )
Jonathan Frech
2

JavaScript (ES7), 32 bytes

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

Economizou alguns bytes emprestando a dica de Leaky na solução Python do musicman .


Tente

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
Shaggy
fonte
1
Por que não apenas o compatível com ES6 (n%i?1:i)? (Isto não iria salvar qualquer byte, no entanto.)
Arnauld
@ Arnauld: porque meia hora é claramente cedo demais para o golfe por telefone! : O DI tinha revertido o ternário quando vi a dica do Leaky!
Shaggy
2

TI-Basic, 24 14 13 bytes

Guardado 1 byte graças a lirtosiast

:√(Ans^sum(not(fPart(Ans/randIntNoRep(1,Ans
Tudo bem eu
fonte
1
Você precisa do int(?
Julio
1

QBIC , 22 bytes

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

Explicação

[:|           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
fonte
1

PHP , 45 bytes

for($p=1;$d++<$argn;)$argn%$d?:$p*=$d;echo$p;

Experimente online!

Jörg Hülsermann
fonte
1

Mathematica, 17 bytes

para quem não consegue ver as respostas excluídas (resposta de DavidC), este é o código no Mathematica com a ajuda de @MartinEnder

1##&@@Divisors@#&
J42161217
fonte
1

Linguagem de programação de 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]

Versão não destruída:

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]

Estou usando este compilador SPL para executar o programa.

Correr com:

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

Python 3, 45 bytes

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

Let xSer um número. Ambos ye zserão divisores de xif y * z = x. Portanto y = x / z,. Digamos que um número dtem 6 divisiors, devido a esta observação os divisores será a, b, c, d / a, d / b, d / b. Se multiplicarmos todos esses números (o ponto do quebra-cabeça), obtemos d * d * d = d ^ 3. Em geral, para eum número de fdivisores, o produto desses divisores seráe ^ (f / 2) , que é o que a lambda faz.

Experimente online!

Mario Ishac
fonte
1

MEU , 4 bytes

Hex:

1A 3A 54 27

Explicação:

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

Java (OpenJDK 8) , 52 51 bytes

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

Experimente online!

Obrigado LeakyNun por economizar 1 byte!

Olivier Grégoire
fonte
1
n->{int r=n,d=0;for(;++d<n;)r*=n%d<1?d:1;return r;}
Freira vazando
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

Experimente online!

Ungolfed:

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
fonte
0

Axioma, 23 bytes

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

Esta é uma tradução em axioma da solução de alefalfa

RosLuP
fonte