Sản phẩm của bộ chia


21

Thử thách

Cho một số nguyên dương, trả về tích của các ước của nó, bao gồm cả chính nó.

Đây là trình tự A007955 trong OEIS .

Các trường hợp thử nghiệm

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

Chấm điểm

Đây là , vì vậy câu trả lời ngắn nhất trong mỗi ngôn ngữ sẽ thắng!


2
Lưu ý thú vị (mặc dù có lẽ không hữu ích cho thử thách này): sản phẩm của tất cả các ước của n luôn là n ^ ((số ước của n) / 2).
Wojowu

Câu trả lời:



7

Japt , 3 byte

â ×

Hãy thử trực tuyến!

Giải trình

â ×  // implicit integer input

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

Chết tiệt, làm thế nào bạn ninja tôi?! : p Sẽ xóa của tôi khi tôi đến máy tính (bất cứ khi nào có thể).
Shaggy

@Shaggy Tôi ngạc nhiên, vì tôi vừa tìm hiểu về cả hai â×khi viết câu trả lời này
Justin Mariner

Tôi đã bị làm chậm bởi min. giới hạn nhân vật!
Shaggy






3

Alice , 12 byte

/o
\i@/Bdt&*

Hãy thử trực tuyến!

Giải trình

Đây chỉ là khung thông thường cho I / O thập phân:

/o
\i@/...

Sau đó, chương trình là:

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

𝐅𝐩

Hãy thử trực tuyến!


3
Tôi cuộn qua các câu trả lời: mã đơn cách đơn giản, mã đơn cách đơn giản, đơn giản ... đậm, mã serif? :-P
Sản phẩm điện tử

@ETHproductions Hehe.
Okx

4
@ETHproductions Tôi thực sự đã mã hóa câu trả lời này trên iOS, điều đó có nghĩa là tôi thực sự không thể nhìn thấy các ký tự.
Okx

Điều đó ... khá ấn tượng.
Sản xuất ETH

2
@MamaFunRoll Bây giờ là một cái tên tôi đã không nghe nói trong một chặng đường dài, thời gian dài ... ;-)
ETHproductions


2

Mã máy x86-64, 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

Đoạn mã trên xác định một hàm lấy một tham số duy nhất (giá trị đầu vào, số nguyên dương) trong EDI(theo quy ước gọi System64 AMD được sử dụng trên Gnu / Unix) và trả về một kết quả duy nhất (sản phẩm của ước số) EAX.

Trong nội bộ, nó tính toán sản phẩm của các ước số bằng thuật toán lặp (cực kỳ kém hiệu quả), tương tự như đệ trình C của pizzapants184 . Về cơ bản, nó sử dụng bộ đếm để lặp qua tất cả các giá trị giữa 1 và giá trị đầu vào, kiểm tra xem giá trị bộ đếm hiện tại có phải là ước của đầu vào không. Nếu vậy, nó nhân số đó vào tổng sản phẩm đang chạy.

Ngôn ngữ lắp ráp lộn xộn:

; 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

Thực tế là IDIVhướng dẫn sử dụng các toán hạng được mã hóa cứng để chia cổ tức theo kiểu của tôi một chút, nhưng tôi nghĩ rằng điều này khá tốt cho một ngôn ngữ không có các nhánh số học và điều kiện cơ bản!


2

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

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

Chương trình đầy đủ: nhắc người dùng nhập liệu; trả về kết quả đầu ra Ans, một biến đặc biệt (về cơ bản) lưu trữ giá trị của giá trị mới nhất được tính toán.

Giải trình:

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
Bạn đã không thực sự bao gồm bytecount.
Erik the Outgolfer

@EriktheOutgolfer Rất tiếc! Đã sửa.
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 nhờ Cody Gray

Hàm lấy số nguyên và trả về tích của ước số.

Hãy thử trực tuyến!

Ung dung:

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

Bạn có thể lưu 4 byte bằng cách (1) đếm ngược, (2) loại bỏ dấu ngoặc quanh p*=biểu thức và (3) đặt một câu lệnh trong phần thân của forvòng lặp để thả dấu phẩy. Tôi cũng thích sử dụng các vars toàn cầu, thay vì thêm các tham số bổ sung. Điều này tránh hành vi không xác định, mà không tốn bất kỳ byte nào. Phiên bản cuối cùng:p,a;f(x){for(p=1,a=x;a;--a)p*=x%a?1:a;return p;}
Cody Grey

Bạn có thể thay thế return p;bằng p=p;và lưu năm byte.
Jonathan Frech

Để lưu một byte khác, bạn có thể thay thế p,a;f(x)bằng f(x,p,a).
Jonathan Frech

Nếu bạn sử dụng các biến cục bộ thay vì các biến toàn cục, bạn thậm chí có thể loại bỏ toàn bộ return p;và lưu không phải năm, mà là chín byte. ( TIO )
Jonathan Frech

2

JavaScript (ES7), 32 byte

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

Đã lưu một vài byte bằng cách mượn mẹo của Leaky về giải pháp Python của nhạc sĩ .


Thử nó

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>


Thay thế (ES6), 32 byte

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

1
Tại sao không chỉ tương thích ES6 (n%i?1:i)? (Tuy nhiên, điều này sẽ không lưu bất kỳ byte nào.)
Arnauld

@Arnauld: bởi vì nửa 6 rõ ràng là quá sớm vào buổi sáng cho golf điện thoại! : DI đã bị ternary đảo ngược khi tôi phát hiện ra mẹo của Leaky!
Shaggy

2

TI-Basic, 24 14 13 byte

Đã lưu 1 byte nhờ lirtosiast

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

1
Bạn có cần int(?
lirtosiast

1

QBIC , 22 byte

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

Giải trình

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

Toán học, 17 byte

đối với những người không thể xem câu trả lời đã bị xóa (câu trả lời của DavidC), đây là mã trong Mathicala với sự trợ giúp của @MartinEnder

1##&@@Divisors@#&

1

Ngôn ngữ lập trình 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]

Phiên bản bị đánh cắp:

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]

Tôi đang sử dụng trình biên dịch SPL này để chạy chương trình.

Chạy với:

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

Hãy xlà một con số. Cả hai yzsẽ là ước của xnếu y * z = x. Do đó , y = x / z. Hãy nói rằng một số dcó 6 divisiors, do quan sát này các ước sẽ a, b, c, d / a, d / b, d / b. Nếu chúng ta nhân tất cả các số này (điểm của câu đố), chúng ta sẽ có được d * d * d = d ^ 3. Nói chung, evới một số fước số, sản phẩm của các ước số sẽ là e ^ (f / 2), đó là những gì lambda làm.

Hãy thử trực tuyến!


1

TÔI , 4 byte

Lục bình:

1A 3A 54 27

Giải trình:

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

Hãy thử trực tuyến!

Ung dung:

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

Tiên đề, 23 byte

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

Đây là một bản dịch trong Axiom của giải pháp alephalpha

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.