Produit des diviseurs

21

Défi

Étant donné un entier positif, renvoyez le produit de ses diviseurs, y compris lui-même.

Il s'agit de la séquence A007955 dans l'OEIS .

Cas de test

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

Notation

C'est le , donc la réponse la plus courte dans chaque langue gagne!

musicman523
la source
2
Note intéressante (mais probablement pas utile pour ce défi): le produit de tous les diviseurs de n est toujours n ^ ((nombre de diviseurs de n) / 2).
Wojowu

Réponses:

13

05AB1E , 2 octets

ÑP

Essayez-le en ligne!

Explication

Ñ    # divisors
 P   # product
Emigna
la source
À première vue, je dirais que cette solution appartient à P, mais quelque chose me retient ..
Uriel
7

Japt , 3 octets

â ×

Essayez-le en ligne!

Explication

â ×  // implicit integer input

â    // get integer divisors
  ×  // get product of array
Justin Mariner
la source
Merde, comment m'as-tu ninja?! : p Supprime le mien quand j'arrive à un ordinateur (quand cela peut être).
Shaggy
@Shaggy Je suis surpris, car je viens de découvrir les deux âet ×en écrivant cette réponse
Justin Mariner
J'ai été ralenti par le min. limite de caractères!
Shaggy
5

Python 3 , 42 41 octets

1 octet enregistré grâce à Leaky Nun!

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

Essayez-le en ligne!

musicman523
la source
1
(1,k)[i%k<1]est équivalent àk**(i%k<1)
Leaky Nun
Wow c'est génial, merci!
musicman523
3

Alice , 12 octets

/o
\i@/Bdt&*

Essayez-le en ligne!

Explication

Ceci est juste le cadre normal des E / S décimales:

/o
\i@/...

Ensuite, le programme est:

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
la source
3

Neim , 2 octets

𝐅𝐩

Essayez-le en ligne!

Okx
la source
3
Je fais défiler les réponses: code simple à espacement fixe, code à espacement simple, simple ... gras, code serif? :-P
ETHproductions
@ETHproductions Hehe.
Okx
4
@ETHproductions J'ai en fait codé cette réponse sur iOS, ce qui signifie que je ne peux pas réellement voir les personnages.
Okx
C'est ... assez impressionnant.
ETHproductions
2
@MamaFunRoll Maintenant, c'est un nom que je n'ai pas entendu depuis très, très longtemps ... ;-)
ETHproductions
2

Code machine x86-64, 26 octets

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

Le code ci-dessus définit une fonction qui prend un seul paramètre (la valeur d'entrée, un entier positif) dans EDI(suivant la convention d'appel System V AMD64 utilisée sur Gnu / Unix), et renvoie un seul résultat (le produit des diviseurs) dans EAX.

En interne, il calcule le produit des diviseurs en utilisant un algorithme itératif (extrêmement inefficace), similaire à la soumission C de pizzapants184 . Fondamentalement, il utilise un compteur pour parcourir toutes les valeurs comprises entre 1 et la valeur d'entrée, vérifiant si la valeur actuelle du compteur est un diviseur de l'entrée. Si c'est le cas, il multiplie cela dans le produit total en cours d'exécution.

Mnémoniques non assemblés du langage d'assemblage:

; 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

Le fait que l' IDIVinstruction utilise des opérandes codés en dur pour le dividende restreint un peu mon style, mais je pense que c'est assez bon pour un langage qui n'a pas de fonction intégrée mais des branches arithmétiques et conditionnelles de base!

Cody Grey
la source
2

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

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

Programme complet: invite l'utilisateur à entrer; renvoie la sortie dans Ans, une variable spéciale qui stocke (fondamentalement) la valeur de la dernière valeur calculée.

Explication:

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
la source
2
Vous n'avez pas réellement inclus le bytecount.
Erik the Outgolfer
@EriktheOutgolfer Whoops! Fixé.
pizzapants184
2

C (gcc), 52 48 octets

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

-4 octets grâce à Cody Gray

Une fonction qui prend un entier et retourne le produit de ses diviseurs.

Essayez-le en ligne!

Non 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
la source
Vous pouvez enregistrer 4 octets en (1) comptant à rebours, (2) supprimant les parenthèses autour de l' p*=expression et (3) mettant une instruction dans le corps de la forboucle pour supprimer une virgule. J'aime aussi utiliser des variables globales, plutôt que d'ajouter des paramètres supplémentaires. Cela évite un comportement indéfini, sans coûter aucun octet. Version finale:p,a;f(x){for(p=1,a=x;a;--a)p*=x%a?1:a;return p;}
Cody Gray
Vous pouvez remplacer return p;avec p=p;et enregistrer cinq octets.
Jonathan Frech
Pour enregistrer un autre octet, vous pouvez le remplacer p,a;f(x)par f(x,p,a).
Jonathan Frech
Si vous utilisez des variables locales au lieu de variables globales, vous pouvez même vous débarrasser de la totalité return p;et enregistrer non pas cinq, mais neuf octets. ( TIO )
Jonathan Frech
2

JavaScript (ES7), 32 octets

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

Sauvegardé quelques octets en empruntant le conseil de Leaky sur la solution Python de musicman .


Essayez-le

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>


Alternative (ES6), 32 octets

n=>g=(i=n)=>i?(n%i?1:i)*g(i-1):1
Hirsute
la source
1
Pourquoi pas seulement le compatible ES6 (n%i?1:i)? (Cela ne sauvera cependant aucun octet.)
Arnauld
@Arnauld: parce que la moitié 6 est clairement trop tôt le matin pour le golf par téléphone! : DI a fait inverser le ternaire quand j'ai repéré la pointe de Leaky!
Shaggy
2

TI-Basic, 24 14 13 octets

1 octet enregistré grâce au lirtosiast

:√(Ans^sum(not(fPart(Ans/randIntNoRep(1,Ans
OK je
la source
1
Avez-vous besoin du int(?
lirtosiast
1

QBIC , 22 octets

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

Explication

[:|           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
la source
1

PHP , 45 octets

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

Essayez-le en ligne!

Jörg Hülsermann
la source
1

Mathematica, 17 octets

pour ceux qui ne peuvent pas voir les réponses supprimées (réponse de DavidC), voici le code de Mathematica avec l'aide de @MartinEnder

1##&@@Divisors@#&
J42161217
la source
1

Langage de programmation Shakespeare , 353 octets

.
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]

Version non golfée:

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]

J'utilise ce compilateur SPL pour exécuter le programme.

Courir avec:

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

Python 3, 45 octets

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

Soit xun nombre. Les deux yet zseront les diviseurs de xif y * z = x. Par conséquent, y = x / z. Disons un certain nombre da 6 divisiors, en raison de cette observation seront les diviseurs a, b, c, d / a, d / b, d / b. Si nous multiplions tous ces nombres (le point du puzzle), nous obtenons d * d * d = d ^ 3. En général, pour eun certain nombre de fdiviseurs, le produit de ces diviseurs sera e ^ (f / 2), ce que fait le lambda.

Essayez-le en ligne!

Mario Ishac
la source
1

MY , 4 octets

Hex:

1A 3A 54 27

Explication:

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

Java (OpenJDK 8) , 52 51 octets

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

Essayez-le en ligne!

Merci LeakyNun pour avoir sauvé 1 octet!

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

Fortran 95, 88 octets

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

Essayez-le en ligne!

Non 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
la source
0

Axiome, 23 octets

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

Ceci est une traduction dans Axiom de la solution alephalpha

RosLuP
la source