Produkt der Teiler


21

Herausforderung

Bei einer positiven Ganzzahl geben Sie das Produkt seiner Teiler einschließlich sich selbst zurück.

Dies ist die Sequenz A007955 im OEIS .

Testfälle

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

Wertung

Das ist , also gewinnt die kürzeste Antwort in jeder Sprache!


2
Interessante Anmerkung (obwohl wahrscheinlich nicht so nützlich für diese Herausforderung): das Produkt aller Teiler von n ist immer n ^ ((Anzahl der Teiler von n) / 2).
Wojowu

Antworten:



7

Japt , 3 Bytes

â ×

Probieren Sie es online!

Erläuterung

â ×  // implicit integer input

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

Verdammt, wie bist du zu mir gekommen ?! : p Löscht meine, wenn ich an einen Computer komme (wann immer das sein mag).
Shaggy

@ Shaggy Ich bin überrascht, da ich gerade beides herausgefunden habe âund ×als ich diese Antwort schrieb
Justin Mariner

Ich wurde durch die min verlangsamt. Zeichenbegrenzung!
Shaggy






3

Alice , 12 Bytes

/o
\i@/Bdt&*

Probieren Sie es online!

Erläuterung

Dies ist nur das reguläre Framework für dezimale E / A:

/o
\i@/...

Dann ist das Programm:

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

𝐅𝐩

Probieren Sie es online!


3
Ich blättere durch die Antworten: einfacher Code ohne Zeilenabstand, einfacher Code ohne Zeilenabstand, einfacher ... Fettdruck, Serifencode? :-P
ETHproductions

@ETHproductions Hehe.
Okx

4
@ETHproductions Ich habe diese Antwort tatsächlich auf iOS codiert, was bedeutet, dass ich die Zeichen nicht wirklich sehen kann.
Okx

Das ist ... ziemlich beeindruckend.
ETHproductions

2
@MamaFunRoll Nun, das ist ein Name, den ich seit langer, langer Zeit nicht mehr gehört habe ... ;-)
ETHproductions


2

x86-64-Maschinencode, 26 Byte

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

Der obige Code definiert eine Funktion, die einen einzelnen Parameter (den Eingabewert, eine positive Ganzzahl) in EDI( gemäß der unter Gnu / Unix verwendeten AMD64-Aufrufkonvention von System V ) und ein einzelnes Ergebnis (das Produkt von Divisoren) in zurückgibt EAX.

Intern berechnet es das Produkt von Divisoren mit einem (äußerst ineffizienten) iterativen Algorithmus, ähnlich wie der C-Submission pizzapants184 . Grundsätzlich verwendet es einen Zähler, um alle Werte zwischen 1 und dem Eingabewert zu durchlaufen und zu prüfen, ob der aktuelle Zählerwert ein Teiler der Eingabe ist. Wenn ja, multipliziert es dies mit dem laufenden Gesamtprodukt.

Ungolfed Assembler-Mnemonik:

; 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

Die Tatsache, dass der IDIVBefehl hartcodierte Operanden für die Dividende verwendet, verkrampft meinen Stil ein wenig, aber ich denke, das ist ziemlich gut für eine Sprache, die keine eingebauten, sondern einfache arithmetische und bedingte Verzweigungen hat!


2

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

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

Vollständiges Programm: Fordert den Benutzer zur Eingabe auf. gibt die Ausgabe in Ansa zurück speziellen Variablen zurück , die (im Grunde) den Wert des zuletzt berechneten Werts speichert.

Erläuterung:

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
Das bytecount haben Sie eigentlich nicht mit einbezogen.
Erik der Outgolfer

@EriktheOutgolfer Hoppla! Fest.
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 dank Cody Gray

Eine Funktion, die eine Ganzzahl aufnimmt und das Produkt ihrer Teiler zurückgibt.

Probieren Sie es 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;
}

Sie können 4 Bytes sparen, indem Sie (1) rückwärts zählen, (2) die Klammern um den p*=Ausdruck entfernen und (3) eine Anweisung in den Text der forSchleife einfügen, um ein Komma zu löschen. Ich verwende auch gerne globale Variablen, anstatt zusätzliche Parameter hinzuzufügen. Dies vermeidet undefiniertes Verhalten, ohne Byte zu kosten. Endgültige Fassung:p,a;f(x){for(p=1,a=x;a;--a)p*=x%a?1:a;return p;}
Cody Grey

Sie können ersetzen return p;mit p=p;und speichern fünf Bytes.
Jonathan Frech

Um ein anderes Byte zu speichern, können Sie ersetzen p,a;f(x)mit f(x,p,a).
Jonathan Frech

Wenn Sie lokale anstelle von globalen Variablen verwenden, können Sie sogar die gesamte Variable entfernen return p;und nicht fünf, sondern neun Bytes einsparen. ( TIO )
Jonathan Frech

2

JavaScript (ES7), 32 Byte

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

Sie haben ein paar Bytes gespart, indem Sie sich Leakys Tipp für die Python-Lösung von musicman geliehen haben .


Versuch es

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 Byte

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

1
Warum nicht nur die ES6-kompatibel (n%i?1:i)? (Dies würde jedoch kein Byte speichern.)
Arnauld

@Arnauld: weil halb 6 eindeutig zu früh morgens für telefon golf ist! : DI hatte den Ternär umgekehrt, als ich Leakys Tipp entdeckte!
Shaggy

2

TI-Basic, 24 14 13 Bytes

1 Byte dank Lirtosiast gespeichert

:√(Ans^sum(not(fPart(Ans/randIntNoRep(1,Ans

1
Benötigen Sie das int(?
Lirtosiast

1

QBIC , 22 Bytes

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

Erläuterung

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

Für diejenigen, die keine gelöschten Antworten anzeigen können (die Antwort von DavidC), ist dies der Code in Mathematica mit Hilfe von @MartinEnder

1##&@@Divisors@#&

1

Shakespeare-Programmiersprache , 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]

Ungolfed-Version:

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]

Ich benutze diesen SPL-Compiler , um das Programm auszuführen.

Laufen mit:

$ 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)

Sei xeine Zahl. Beide yund zwerden Teiler von xif sein y * z = x. Daher y = x / z. Sagen wir mal eine Nummer d6 divisiors hat aufgrund dieser Beobachtung wird die Divisoren a, b, c, d / a, d / b, d / b. Wenn wir alle diese Zahlen (den Punkt des Puzzles) multiplizieren, erhalten wir d * d * d = d ^ 3. Im Allgemeinen ist ebei einer Reihe von fTeilern das Produkt dieser Teiler das e ^ (f / 2), was das Lambda tut.

Probieren Sie es online!


1

MEIN , 4 Bytes

Verhexen:

1A 3A 54 27

Erläuterung:

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

Probieren Sie es 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

Axiom, 23 Bytes

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

Dies ist eine Übersetzung der Alephalpha-Lösung in Axiom

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.