Produkt dzielników

21

Wyzwanie

Biorąc pod uwagę dodatnią liczbę całkowitą, zwróć iloczyn dzielników, w tym siebie.

Jest to sekwencja A007955 w OEIS .

Przypadki testowe

1: 1
2: 2
3: 3
48
5: 5
6: 36
7: 7
8: 64
9:27
10: 100
12: 1728
14: 196
24: 331776
25: 125
28: 21952
30: 810000

Punktacja

To jest , więc wygrywa najkrótsza odpowiedź w każdym języku!

musicman523
źródło
2
Interesująca uwaga (choć prawdopodobnie nie tak przydatna do tego wyzwania): iloczyn wszystkich dzielników n wynosi zawsze n ^ ((liczba dzielników n) / 2).
Wojowu

Odpowiedzi:

13

05AB1E , 2 bajty

ÑP

Wypróbuj online!

Wyjaśnienie

Ñ    # divisors
 P   # product
Emigna
źródło
Na pierwszy rzut oka powiedziałbym, że to rozwiązanie należy do kategorii P, ale coś mnie powstrzymuje ...
Uriel
7

Japt , 3 bajty

â ×

Wypróbuj online!

Wyjaśnienie

â ×  // implicit integer input

â    // get integer divisors
  ×  // get product of array
Justin Mariner
źródło
Cholera, jak ty mnie ninja ?! : p Usunie moje, gdy dojdę do komputera (ilekroć może to być).
Kudłaty
@Shaggy Jestem zaskoczony, ponieważ właśnie dowiedziałem się o obu tych kwestiach âi ×pisząc tę ​​odpowiedź
Justin Mariner
Spowolniło mnie min. limit znaków!
Kudłaty
5

Python 3 , 42 41 bajtów

Oszczędność 1 bajtu dzięki Leaky Nun!

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

Wypróbuj online!

musicman523
źródło
1
(1,k)[i%k<1]jest równoważnek**(i%k<1)
Leaky Nun
Wow, to niesamowite, dziękuję!
musicman523
4

Haskell , 35 34 bajtów

-1 dzięki ovs

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

Wypróbuj online!

bartavelle
źródło
3

Alice , 12 bajtów

/o
\i@/Bdt&*

Wypróbuj online!

Wyjaśnienie

To tylko zwykłe ramy dla dziesiętnych operacji we / wy:

/o
\i@/...

Następnie program to:

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
źródło
3

Neim , 2 bajty

𝐅𝐩

Wypróbuj online!

Okx
źródło
3
Ja przewijam odpowiedzi: zwykły kod o stałej szerokości, zwykły kod o stałej szerokości, zwykły ... pogrubiony, szeryfowy kod? :-P
ETHprodukcje
@ETHproductions Hehe.
Okx,
4
@ETHproductions Właściwie zakodowałem tę odpowiedź na iOS, co oznacza, że ​​właściwie nie widzę znaków.
Okx,
To ... całkiem imponujące.
ETHprodukcje
2
@MamaFunRoll Teraz to imię, którego nie słyszałem od bardzo dawna ... ;-)
ETHproductions
3

R , 28 bajtów

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

Wypróbuj online!

Skarabeusz
źródło
2

Kod maszynowy x86-64, 26 bajtów

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

Powyższy kod definiuje funkcję, która przyjmuje pojedynczy parametr (wartość wejściowa, dodatnia liczba całkowita) w EDI(zgodnie z konwencją wywoływania AMD V System64 używaną w Gnu / Unix) i zwraca pojedynczy wynik (iloczyn dzielników) EAX.

Wewnętrznie oblicza iloczyn dzielników za pomocą (wyjątkowo nieefektywnego) algorytmu iteracyjnego, podobnego do złożenia C przez pizzapants184 . Zasadniczo używa licznika do przechodzenia przez wszystkie wartości między 1 a wartością wejściową, sprawdzając, czy bieżąca wartość licznika jest dzielnikiem wejścia. Jeśli tak, mnoży to przez działający produkt ogółem.

Mnemoniki języka asemblera:

; 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

Fakt, że IDIVinstrukcja używa zakodowanych operandów do dywidendy, trochę obciąża mój styl, ale myślę, że jest to całkiem dobre dla języka, który nie ma wbudowanych, ale podstawowe gałęzie arytmetyczne i warunkowe!

Cody Gray
źródło
2

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

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

Pełny program: monituje użytkownika o wprowadzenie danych; zwraca dane wyjściowe Ans, specjalną zmienną, która (w zasadzie) przechowuje wartość ostatniej obliczonej wartości.

Wyjaśnienie:

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
pizzapanty184
źródło
2
Tak naprawdę nie podałeś bajtu.
Erik the Outgolfer
@EriktheOutgolfer Whoops! Naprawiony.
pizzapants184
2

C (gcc), 52 48 bajtów

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

-4 bajty dzięki Cody Grayowi

Funkcja, która przyjmuje liczbę całkowitą i zwraca iloczyn dzielników.

Wypróbuj online!

Nie golfowany:

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;
}
pizzapanty184
źródło
Możesz zapisać 4 bajty poprzez (1) odliczanie do tyłu, (2) usunięcie nawiasów wokół p*=wyrażenia i (3) umieszczenie instrukcji w treści forpętli, aby usunąć przecinek. Lubię też używać globalnych zmiennych, zamiast dodawać dodatkowe parametry. Pozwala to uniknąć nieokreślonego zachowania, nie kosztując żadnych bajtów. Wersja ostateczna:p,a;f(x){for(p=1,a=x;a;--a)p*=x%a?1:a;return p;}
Cody Gray
Można wymienić return p;z p=p;zaoszczędzisz pięciu bajtów.
Jonathan Frech
Aby zapisać kolejny bajt, można zastąpić p,a;f(x)z f(x,p,a).
Jonathan Frech
Jeśli użyjesz zmiennych lokalnych zamiast globalnych, możesz nawet pozbyć się całości return p;i zaoszczędzić nie pięć, ale dziewięć bajtów. ( TIO )
Jonathan Frech,
2

JavaScript (ES7), 32 bajty

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

Zaoszczędzono kilka bajtów, pożyczając wskazówkę Leaky'ego dotyczącą rozwiązania Python dla muzyków .


Spróbuj

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>


Alternatywnie (ES6), 32 bajty

n=>g=(i=n)=>i?(n%i?1:i)*g(i-1):1
Kudłaty
źródło
1
Dlaczego nie tylko kompatybilny z ES6 (n%i?1:i)? (Nie zaoszczędziłoby to jednak żadnego bajtu.)
Arnauld
@Arnauld: ponieważ połowa 6 jest zdecydowanie za wcześnie na golfa przez telefon! : DI miał odwrócony trójskładnik, gdy zauważyłem końcówkę Leaky'ego!
Kudłaty
2

TI-Basic, 24 14 13 bajtów

Zaoszczędzono 1 bajt dzięki lirtosiast

:√(Ans^sum(not(fPart(Ans/randIntNoRep(1,Ans
OK
źródło
1
Potrzebujesz int(?
lirtosiast
1

QBIC , 22 bajty

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

Wyjaśnienie

[:|           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
źródło
1

PHP , 45 bajtów

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

Wypróbuj online!

Jörg Hülsermann
źródło
1

Mathematica, 17 bajtów

dla tych, którzy nie mogą wyświetlić usuniętych odpowiedzi (odpowiedź DavidC), jest to kod w Mathematica z pomocą @MartinEnder

1##&@@Divisors@#&
J42161217
źródło
1

Język programowania Szekspira , 353 bajty

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

Wersja bez golfa:

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]

Używam tego kompilatora SPL do uruchomienia programu.

Biegnij z:

$ python splc.py product-of-divisors.spl > product-of-divisors.c
$ gcc product-of-divisors.c -o pod.exe
$ echo 30 | ./pod
810000
Miedź
źródło
1

Python 3, 45 bajtów

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

Niech xbędzie liczbą. Oba yi zbędą dzielnikami xif y * z = x. Dlatego też y = x / z. Powiedzmy, że liczba dma 6 divisiors, dzięki tej obserwacji dzielników będzie a, b, c, d / a, d / b, d / b. Jeśli pomnożymy wszystkie te liczby (punkt układanki), otrzymamy d * d * d = d ^ 3. Ogólnie rzecz biorąc, ponieważ ew przypadku wielu fdzielników będzie iloczyn wspomnianych dzielnikówe ^ (f / 2) , co robi lambda.

Wypróbuj online!

Mario Ishac
źródło
1

MY , 4 bajty

Klątwa:

1A 3A 54 27

Wyjaśnienie:

1A - Input as an integer
3A - Factors
54 - Product
27 - Output (with newline)
Zacharý
źródło
1

Java (OpenJDK 8) , 52 51 bajtów

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

Wypróbuj online!

Dzięki LeakyNun za uratowanie 1 bajtu!

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

Fortran 95, 88 bajtów

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

Wypróbuj online!

Nie golfowany:

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
źródło
0

Aksjomat, 23 bajty

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

To tłumaczenie na aksjomat roztworu alphalpha

RosLuP
źródło