Prodotto di divisori


21

Sfida

Dato un numero intero positivo, restituisce il prodotto dei suoi divisori, incluso se stesso.

Questa è la sequenza A007955 nell'OEIS .

Casi 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

punteggio

Questo è , quindi vince la risposta più breve in ogni lingua!


2
Nota interessante (anche se probabilmente non utile per questa sfida): il prodotto di tutti i divisori di n è sempre n ^ ((numero di divisori di n) / 2).
Wojowu,

Risposte:



7

Japt , 3 byte

â ×

Provalo online!

Spiegazione

â ×  // implicit integer input

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

Dannazione, come mi hai fatto ninja ?! : p Eliminerà il mio quando arrivo a un computer (ogni volta che potrebbe essere).
Shaggy,

@Shaggy Sono sorpreso, dato che ho appena scoperto entrambi âe ×quando ho scritto questa risposta
Justin Mariner,

Sono stato rallentato dal minuto. limite di caratteri!
Shaggy,






3

Alice , 12 byte

/o
\i@/Bdt&*

Provalo online!

Spiegazione

Questo è solo il framework normale per l'I / O decimale:

/o
\i@/...

Quindi il programma è:

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 byte

𝐅𝐩

Provalo online!


3
Scorrendo le risposte: semplice codice monospazio, semplice codice monospazio, semplice ... grassetto, codice serif? :-P
ETHproductions

@ETHproductions Hehe.
Okx,

4
@ETHproductions In realtà ho codificato questa risposta su iOS, il che significa che in realtà non riesco a vedere i personaggi.
Okx,

È ... piuttosto impressionante.
ETHproductions

2
@MamaFunRoll Ora questo è un nome che non sento da molto, molto tempo ... ;-)
ETHproductions


2

x86-64 Codice macchina, 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

Il codice precedente definisce una funzione che accetta un singolo parametro (il valore di input, un numero intero positivo) in EDI(seguendo la convenzione di chiamata AMD64 di System V utilizzata su Gnu / Unix) e restituisce un singolo risultato (il prodotto dei divisori) in EAX.

Internamente, calcola il prodotto dei divisori usando un algoritmo iterativo (estremamente inefficiente), simile alla presentazione in C di pizzapants184 . Fondamentalmente, utilizza un contatore per scorrere tutti i valori compresi tra 1 e il valore di input, verificando se il valore del contatore corrente è un divisore dell'input. In tal caso, lo moltiplica nel prodotto totale corrente.

Linguaggi mnemonici non assemblati:

; 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

Il fatto che l' IDIVistruzione utilizzi operandi hardcoded per i dividendi restringe un po 'il mio stile, ma penso che questo sia abbastanza buono per un linguaggio che non ha built-in ma rami aritmetici e condizionali di base!


2

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

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

Programma completo: richiede all'utente l'immissione; restituisce l'output in Ans, una variabile speciale che (sostanzialmente) memorizza il valore dell'ultimo valore calcolato.

Spiegazione:

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
In realtà non hai incluso il bytecount.
Erik the Outgolfer,

@EriktheOutgolfer Whoops! Fisso.
pizzapants184

2

C (gcc), 52 48 byte

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

-4 byte grazie a Cody Grey

Una funzione che accetta un numero intero e restituisce il prodotto dei suoi divisori.

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

È possibile salvare 4 byte (1) contando all'indietro, (2) rimuovendo le parentesi attorno p*=all'espressione e (3) inserendo un'istruzione nel corpo del forciclo per eliminare una virgola. Mi piace anche usare var globali, piuttosto che aggiungere parametri extra. Questo evita comportamenti indefiniti, senza costare alcun byte. Versione finale:p,a;f(x){for(p=1,a=x;a;--a)p*=x%a?1:a;return p;}
Cody Grey

È possibile sostituire return p;con p=p;e salvare cinque byte.
Jonathan Frech,

Per salvare un altro byte, è possibile sostituirlo p,a;f(x)con f(x,p,a).
Jonathan Frech,

Se usi variabili locali anziché globali, puoi persino sbarazzarti dell'intero return p;e salvare non cinque, ma nove byte. ( TIO )
Jonathan Frech,

2

JavaScript (ES7), 32 byte

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

Ho salvato un paio di byte prendendo in prestito il consiglio di Leaky sulla soluzione Python del musicista .


Provalo

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 byte

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

1
Perché non solo compatibile con ES6 (n%i?1:i)? (Questo non risparmierebbe alcun byte.)
Arnauld

@Arnauld: perché la metà 6 è chiaramente troppo presto la mattina per il golf del telefono! : DI aveva il ternario invertito quando ho notato la punta di Leaky!
Shaggy,

2

TI-Basic, 24 14 13 byte

Salvato 1 byte grazie a lirtosiast

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

1
Ti serve il int(?
lirtosiast,

1

QBIC , 22 byte

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

Spiegazione

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

per coloro che non possono visualizzare le risposte eliminate (la risposta di DavidC), questo è il codice in Mathematica con l'aiuto di @MartinEnder

1##&@@Divisors@#&

1

Shakespeare Programming Language , 353 byte

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

Versione non golfata:

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]

Sto usando questo compilatore SPL per eseguire il programma.

Corri con:

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

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

Sia xun numero. Entrambi ye zsaranno divisori di xif y * z = x. Pertanto, y = x / z. Diciamo che un certo numero dha 6 divisiors, a causa di questa osservazione i divisori saranno a, b, c, d / a, d / b, d / b. Se moltiplichiamo tutti questi numeri (il punto del puzzle), otteniamo d * d * d = d ^ 3. In generale, poiché econ un certo numero di fdivisori, il prodotto di tali divisori sarà e ^ (f / 2), che è ciò che fa la lambda.

Provalo online!


1

MY , 4 byte

Esadecimale:

1A 3A 54 27

Spiegazione:

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







0

Fortran 95, 88 byte

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

Provalo 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

Assioma, 23 byte

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

Questa è una traduzione in Axiom della soluzione di alephalpha

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.