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!


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:



7

Japonês , 3 bytes

â ×

Experimente online!

Explicação

â ×  // implicit integer input

â    // get integer divisors
  ×  // get product of array

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






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.

3

Neim , 2 bytes

𝐅𝐩

Experimente online!


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


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!


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

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;
}

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

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

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



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@#&

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

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!


1

MEU , 4 bytes

Hex:

1A 3A 54 27

Explicação:

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







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

0

Axioma, 23 bytes

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

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.