ผลิตภัณฑ์ของตัวหาร


21

ท้าทาย

รับจำนวนเต็มบวกคืนผลคูณของตัวหารรวมถึงตัวมันเอง

นี่คือA007955 ลำดับใน OEIS

กรณีทดสอบ

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

เกณฑ์การให้คะแนน

นี่คือดังนั้นคำตอบที่สั้นที่สุดในแต่ละภาษาจะชนะ!


2
หมายเหตุที่น่าสนใจ (แม้ว่าอาจไม่เป็นประโยชน์สำหรับความท้าทายนี้): ผลิตภัณฑ์ของตัวหารทั้งหมดของ n คือ n ^ เสมอ (จำนวนตัวหารของ n) / 2)
Wojowu

คำตอบ:



7

Japt , 3 ไบต์

â ×

ลองออนไลน์!

คำอธิบาย

â ×  // implicit integer input

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

เจ้าเป็นนินจาของฉันได้อย่างไร! : p จะลบของฉันเมื่อฉันไปยังคอมพิวเตอร์ (เมื่อใดก็ตามที่อาจเป็น)
Shaggy

@Shaggy ฉันประหลาดใจเพราะผมเพิ่งค้นพบเกี่ยวกับทั้งสองâและ×เมื่อเขียนคำตอบนี้
จัสตินนาวิน

ฉันช้าลงนาที จำกัด อักขระ!
Shaggy






3

อลิซ 12 ไบต์

/o
\i@/Bdt&*

ลองออนไลน์!

คำอธิบาย

นี่เป็นเพียงกรอบงานปกติสำหรับ I / O ทศนิยม:

/o
\i@/...

จากนั้นโปรแกรมคือ:

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 ไบต์

𝐅𝐩

ลองออนไลน์!


3
ฉันเลื่อนดูคำตอบ: รหัส monospaced ธรรมดา, รหัส monospaced ธรรมดา, ธรรมดา ... ตัวหนา, รหัส serif? :-P
ETHproductions

@ETHproductions เหอ
Okx

4
@ETHproductions ฉันเขียนโค้ดคำตอบนี้บน iOS ซึ่งหมายความว่าฉันไม่สามารถเห็นตัวละครได้
Okx

นั่นเป็น ... ค่อนข้างน่าประทับใจ
ETHproductions

2
@MamaFunRoll ตอนนี้เป็นชื่อที่ฉันไม่เคยได้ยินมานานแล้ว ... ;-)
ETHproductions


2

x86-64 รหัสเครื่อง 26 ไบต์

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

รหัสข้างต้นกำหนดฟังก์ชั่นที่ใช้พารามิเตอร์เดียว (มูลค่าที่ใส่เป็นจำนวนเต็มบวก) ในEDI(ต่อไปนี้เรียกประชุมระบบวี AMD64ใช้ใน GNU / Unix) และผลตอบแทนที่ได้ผลเพียงครั้งเดียว (ผลิตภัณฑ์ของตัวหาร) EAXที่ใน

ภายในก็คำนวณผลิตภัณฑ์ของตัวหารโดยใช้ (ไม่มีประสิทธิภาพมาก) ขั้นตอนวิธีการทำซ้ำคล้ายกับการส่ง C pizzapants184 ของ โดยทั่วไปจะใช้เคาน์เตอร์ห่วงผ่านทั้งหมดของค่าระหว่าง 1 และความคุ้มค่าการป้อนข้อมูลการตรวจสอบเพื่อดูว่าค่าตัวนับปัจจุบันเป็นตัวหารของท่าน ถ้าเป็นเช่นนั้นมันจะคูณมันลงในผลิตภัณฑ์ทั้งหมดที่กำลังทำงานอยู่

คำย่อภาษาแอสเซมบลี Ungolfed:

; 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

ความจริงที่ว่าIDIVคำสั่งใช้ตัวถูกดำเนินการแบบ hard-coded สำหรับการจ่ายเงินปันผลเป็นตะคริวสไตล์ของฉันเล็กน้อย แต่ฉันคิดว่านี่เป็นสิ่งที่ดีสำหรับภาษาที่ไม่มี built-in แต่มีพื้นฐานทางคณิตศาสตร์และกิ่งก้านสาขาที่มีเงื่อนไข!


2

TI-Basic (TI-84 Plus CE), 24 ไบต์

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

โปรแกรมเต็มรูปแบบ: แจ้งให้ผู้ใช้ป้อนข้อมูล; ส่งคืนเอาต์พุตAnsเป็นตัวแปรพิเศษที่ (โดยทั่วไป) เก็บค่าของค่าล่าสุดที่คำนวณ

คำอธิบาย:

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
คุณไม่ได้รวม bytecount
Erik the Outgolfer

@EriktheOutgolfer อ๊ะ! คงที่
pizzapants184

2

C (gcc), 52 48 ไบต์

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

-4 ไบต์ขอบคุณ Cody Gray

ฟังก์ชั่นที่รับจำนวนเต็มและส่งคืนผลคูณของตัวหาร

ลองออนไลน์!

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

คุณสามารถบันทึก 4 ไบต์โดย (1) นับถอยหลัง (2) ลบวงเล็บรอบp*=นิพจน์และ (3) วางคำสั่งลงในเนื้อความของforลูปเพื่อวางเครื่องหมายจุลภาค ฉันยังต้องการใช้ vars ทั่วโลกแทนที่จะเพิ่มพารามิเตอร์เพิ่มเติม วิธีนี้จะหลีกเลี่ยงพฤติกรรมที่ไม่ได้กำหนดโดยไม่ต้องคิดต้นทุนไบต์ใด ๆ รุ่นสุดท้าย:p,a;f(x){for(p=1,a=x;a;--a)p*=x%a?1:a;return p;}
Cody Gray

คุณสามารถแทนที่return p;ด้วยp=p;และบันทึกห้าไบต์
Jonathan Frech

หากต้องการบันทึกไบต์อื่นคุณสามารถแทนที่ด้วยp,a;f(x) f(x,p,a)
Jonathan Frech

หากคุณใช้โลคัลแทนตัวแปรโกลบอลคุณสามารถกำจัดทั้งหมดreturn p;และบันทึกไม่ใช่ห้า แต่เก้าไบต์ ( TIO )
Jonathan Frech

2

JavaScript (ES7), 32 ไบต์

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

ที่บันทึกไว้คู่ของไบต์โดยการกู้ยืมเงินเคล็ดลับรั่วในวิธีการแก้ปัญหาของงูหลาม musicman


ลองมัน

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>


ทางเลือก (ES6), 32 ไบต์

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

1
ทำไมไม่ได้เป็นเพียง ES6 ที่เข้ากันได้(n%i?1:i)? (สิ่งนี้จะไม่บันทึกไบต์ใด ๆ )
Arnauld

@Annauld: เพราะครึ่ง 6 นั้นชัดเจนเกินไปในตอนเช้าสำหรับกอล์ฟโทรศัพท์! : DI มีไตรภาคที่ตรงกันข้ามเมื่อฉันเห็นปลาย Leaky!
Shaggy


1

QBICขนาด 22 ไบต์

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

คำอธิบาย

[:|           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 ไบต์

สำหรับผู้ที่ไม่สามารถดูคำตอบที่ถูกลบ (คำตอบของ DavidC) นี่คือรหัสใน Mathematica ด้วยความช่วยเหลือของ @MartinEnder

1##&@@Divisors@#&

1

ภาษาการเขียนโปรแกรมของเช็คสเปียร์ , 353 ไบต์

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

เวอร์ชันที่ไม่ถูกปรับแต่ง:

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]

ฉันใช้คอมไพเลอร์ SPL นี้เพื่อเรียกใช้โปรแกรม

ทำงานด้วย:

$ 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 ไบต์

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

อนุญาตxเป็นตัวเลข ทั้งสองyและzจะเป็นตัวหารของถ้าx y * z = xดังนั้นy = x / z. สมมติว่าจำนวนd6 divisiors เนื่องจากข้อสังเกตนี้หารจะa, b, c, d / a, ,d / b d / bถ้าเราคูณตัวเลขทั้งหมดเหล่านี้ (จุดปริศนา) d * d * d = d ^ 3เราได้รับ โดยทั่วไปสำหรับeจำนวนfตัวหารผลคูณของตัวหารดังกล่าวจะเป็นe ^ (f / 2)ซึ่งเป็นสิ่งที่แลมบ์ดาทำ

ลองออนไลน์!










โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.