Produk Pembagi

21

Tantangan

Diberi bilangan bulat positif, kembalikan produk pembagi nya, termasuk dirinya sendiri.

Ini adalah urutan A007955 di OEIS .

Uji Kasus

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

Mencetak gol

Ini , jadi jawaban tersingkat di setiap bahasa menang!

musicman523
sumber
2
Catatan menarik (meskipun mungkin tidak berguna untuk tantangan ini): produk semua pembagi n selalu n ^ ((jumlah pembagi n) / 2).
Wojowu

Jawaban:

13

05AB1E , 2 byte

ÑP

Cobalah online!

Penjelasan

Ñ    # divisors
 P   # product
Emigna
sumber
Dengan pandangan pertama saya akan mengatakan solusi ini berada di bawah P, tetapi ada sesuatu yang menahan saya ..
Uriel
7

Japt , 3 byte

â ×

Cobalah online!

Penjelasan

â ×  // implicit integer input

â    // get integer divisors
  ×  // get product of array
Justin Mariner
sumber
Sialan, bagaimana kamu ninja aku ?! : p Akan menghapus milik saya ketika saya sampai di komputer (kapan pun itu mungkin).
Shaggy
@ Shaggy Saya terkejut, karena saya baru tahu tentang keduanya âdan ×ketika menulis jawaban ini
Justin Mariner
Saya diperlambat oleh min. batas karakter!
Shaggy
5

Python 3 , 42 41 byte

Disimpan 1 byte berkat Leaky Nun!

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

Cobalah online!

musicman523
sumber
1
(1,k)[i%k<1]setara dengank**(i%k<1)
Leaky Nun
Wow itu luar biasa, terima kasih!
musicman523
4

Haskell , 35 34 byte

-1 Berkat ovs

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

Cobalah online!

bartavelle
sumber
3

Alice , 12 byte

/o
\i@/Bdt&*

Cobalah online!

Penjelasan

Ini hanya kerangka kerja biasa untuk I / O desimal:

/o
\i@/...

Maka programnya adalah:

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
sumber
3

Neim , 2 byte

𝐅𝐩

Cobalah online!

Okx
sumber
3
Saya menggulir jawaban: kode monospace biasa, kode monospace biasa, plain ... bold, kode serif? :-P
ETHproduksi
@ ETHproduk Hehe.
Okx
4
@ ETHproductions Saya sebenarnya mengkodekan jawaban ini di iOS yang berarti saya tidak bisa melihat karakternya.
Okx
Itu ... sangat mengesankan.
ETHproduksi
2
@MamaFunRoll Sekarang itu adalah nama yang belum pernah saya dengar dalam waktu yang sangat lama ... ;-)
ETHproductions
3

R , 28 byte

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

Cobalah online!

Scarabee
sumber
2

x86-64 Kode Mesin, 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

Kode di atas mendefinisikan fungsi yang mengambil parameter tunggal (nilai input, bilangan bulat positif) di EDI(mengikuti konvensi pemanggilan Sistem V AMD64 yang digunakan pada Gnu / Unix), dan mengembalikan hasil tunggal (produk pembagi) di EAX.

Secara internal, ini menghitung produk pembagi menggunakan algoritma iteratif (sangat tidak efisien), mirip dengan pengiriman C pizzapants184 . Pada dasarnya, ia menggunakan penghitung untuk mengulang semua nilai antara 1 dan nilai input, memeriksa untuk melihat apakah nilai penghitung saat ini adalah pembagi input. Jika demikian, itu akan berlipat ganda menjadi total produk yang berjalan.

Mnemonik bahasa assembly yang tidak disatukan:

; 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

Fakta bahwa IDIVinstruksi menggunakan operan kode keras untuk dividen kram gaya saya sedikit, tapi saya pikir ini cukup baik untuk bahasa yang tidak memiliki built-in tetapi aritmatika dasar dan cabang kondisional!

Cody Grey
sumber
2

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

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

Program lengkap: meminta input dari pengguna; mengembalikan output dalam Ans, variabel khusus yang (pada dasarnya) menyimpan nilai dari nilai terbaru yang dihitung.

Penjelasan:

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
sumber
2
Anda sebenarnya tidak memasukkan bytecount.
Erik the Outgolfer
@EriktheOutgolfer Whoops! Tetap.
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 berkat Cody Grey

Fungsi yang mengambil bilangan bulat dan mengembalikan produk pembagi itu.

Cobalah online!

Tidak Disatukan:

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
sumber
Anda dapat menyimpan 4 byte dengan (1) menghitung mundur, (2) menghapus tanda kurung di sekitar p*=ekspresi, dan (3) meletakkan pernyataan di tubuh forloop untuk menjatuhkan koma. Saya juga suka menggunakan vars global, daripada menambahkan parameter tambahan. Ini menghindari perilaku tidak terdefinisi, tanpa biaya byte. Versi terakhir:p,a;f(x){for(p=1,a=x;a;--a)p*=x%a?1:a;return p;}
Cody Grey
Anda dapat mengganti return p;dengan p=p;dan menyimpan lima byte.
Jonathan Frech
Untuk menyimpan byte lain, Anda bisa menggantinya p,a;f(x)dengan f(x,p,a).
Jonathan Frech
Jika Anda menggunakan variabel lokal alih-alih global, Anda bahkan dapat menghapus keseluruhan return p;dan menyimpan bukan lima, tetapi sembilan byte. ( TIO )
Jonathan Frech
2

JavaScript (ES7), 32 byte

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

Menyimpan beberapa byte dengan meminjam tip Leaky pada solusi Python musicman .


Cobalah

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>


Alternatif (ES6), 32 byte

n=>g=(i=n)=>i?(n%i?1:i)*g(i-1):1
Shaggy
sumber
1
Mengapa tidak hanya kompatibel dengan ES6 (n%i?1:i)? (Tapi ini tidak akan menghemat byte.)
Arnauld
@Arnauld: karena setengah 6 jelas terlalu pagi untuk golf ponsel! : DI telah membalik ternary ketika aku melihat tip Leaky!
Shaggy
2

TI-Basic, 24 14 13 byte

Disimpan 1 byte berkat lirtosiast

:√(Ans^sum(not(fPart(Ans/randIntNoRep(1,Ans
Oki
sumber
1
Apakah Anda memerlukannya int(?
lirtosiast
1

QBIC , 22 byte

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

Penjelasan

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

PHP , 45 byte

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

Cobalah online!

Jörg Hülsermann
sumber
1

Mathematica, 17 byte

bagi mereka yang tidak dapat melihat jawaban yang dihapus (jawaban DavidC), ini adalah kode dalam Mathematica dengan bantuan @MartinEnder

1##&@@Divisors@#&
J42161217
sumber
1

Bahasa Pemrograman Shakespeare , 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]

Versi tidak disatukan:

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]

Saya menggunakan kompiler SPL ini untuk menjalankan program.

Jalankan dengan:

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

Python 3, 45 byte

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

Biarkan xmenjadi nomor. Keduanya ydan zakan menjadi pembagi xjika y * z = x. Oleh karena itu, y = x / z. Katakanlah nomor dmemiliki 6 divisiors, karena pengamatan ini pembagi akan a, b, c, d / a, d / b, d / b. Jika kita mengalikan semua angka ini (titik teka-teki), kita memperolehnya d * d * d = d ^ 3. Secara umum, untuk edengan sejumlah fpembagi, produk pembagi tersebut akan menjadi e ^ (f / 2), yang adalah apa yang dilakukan lambda.

Cobalah online!

Mario Ishac
sumber
1

MY , 4 byte

Hex:

1A 3A 54 27

Penjelasan:

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

Java (OpenJDK 8) , 52 51 byte

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

Cobalah online!

Terima kasih LeakyNun karena telah menghemat 1 byte!

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

Python 2 , 52 50 byte

  • Terima kasih @ovs untuk 2 byte: m*=n%i>0 or i
i=n=input()
m=1
while i:m*=n%i>0 or i;i-=1
print m

Cobalah online!

officialaimm
sumber
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

Cobalah online!

Tidak Disatukan:

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
sumber
0

Aksioma, 23 byte

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

Ini adalah terjemahan dari Aksioma solusi alephalpha

RosLuP
sumber