ผลรวมของตัวหารจากตัวประกอบกำลังหลัก


11

งานคือการคำนวณผลรวมของตัวหารของจำนวนที่ได้รับการแยกตัวประกอบเฉพาะ

อินพุต

สองอาร์เรย์ (หรือบางอย่างที่เทียบเท่า) ของความยาวnหนึ่งอันประกอบด้วยตัวประกอบหลักและตัวอื่นที่มีเลขชี้กำลังที่เกี่ยวข้อง

เอาท์พุต

ผลรวมของตัวหารทั้งหมด (รวมถึงตัวเลขเอง)

ตัวอย่าง

จำนวน 240 มี 2, 3 และ 5 เป็นปัจจัยสำคัญโดยมี 4, 1 และ 1 เป็นเลขชี้กำลัง ผลลัพธ์ที่คาดหวังจะเป็น 744

Input: [2,3,5] [4,1,1]
Output: 744

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

รหัสที่สั้นที่สุดเป็นไบต์ชนะ!

หากความซับซ้อนของเวลาแก้ไขปัญหาของคุณคือ O (ผลรวมของเลขชี้กำลัง) แทน O (ผลคูณของเลขชี้กำลัง) คะแนนของคุณอาจถูกคูณด้วย 0.8


มีคำถามที่คล้ายกันโพสต์ที่นี่ แต่มันไม่ใช่เรื่องท้าทาย ฉันคิดว่าปัญหาน่าสนใจพอที่จะตีกอล์ฟได้

ผู้ชนะจะได้รับการคัดเลือกในสุดสัปดาห์นี้


อาเรย์ตัวประกอบที่สำคัญจะต้องเป็นอันดับแรกเสมอและอาเรย์แบบเลขชี้กำลังเป็นอันดับที่สองหรือเราสามารถสมมติว่า
Sp3000

คุณอาจคิดว่ารูปแบบการป้อนข้อมูลใด ๆ ที่คล้ายกับรูปแบบที่เสนอ
Moartem

ไม่สามารถหาได้ในขณะนี้ แต่ฉันคิดว่านี่หรือสิ่งที่คล้ายกันอยู่บน projecteuler.net
flawr

คำตอบ:


3

Pyth, 13 ไบต์ * 0.8 = 10.4

*Fms^LhdhedCQ

สาธิต.

คำตอบนี้ทำงานค่อนข้างแตกต่างจากที่กล่าวมา เพื่อที่จะคำนวณผลรวมของปัจจัยอำนาจที่สำคัญของตัวเลขแทนที่จะใช้สูตรทางคณิตศาสตร์ปัจจัยจะถูกสร้างและสรุปอย่างชัดเจน

ยกตัวอย่างเช่นใน [นายกตัวแทน] คู่[2, 4]เรา map 2 ^ xกว่า0, 1, 2, 3, 4ให้[1, 2, 4, 8, 16]ซึ่งเป็นที่สรุปแล้วถึงวันที่ 31

ผลลัพธ์จะถูกคูณเข้าด้วยกันและพิมพ์

O(sum of exponents)ถ้ายกกำลังจะดำเนินการอย่างถูกต้องหรือถ้ามีผลกลางแคชนี้จะเป็น


เป็นอิสระจากการนำไปใช้ฉันไม่คิดว่าเป็นไปได้ที่จะคำนวณพลังงานnแรกของเวลาใน O (n) เว้นแต่คุณจะถือว่าการคูณเป็น O (1)
Dennis

@Dennis ดีเงื่อนไขการสั่งซื้อที่สูงขึ้นครองดังนั้นมันอาจจะมี rutime ของการคูณคำสั่งที่สูงที่สุดซึ่งO(n)ถ้าเราสามารถถือว่าฐานเป็นค่าคงที่
isaacg

9

CJam, 15 ไบต์ * 0.8 = 12

q~.{_@)#(\(/}:*

ลองมันออนไลน์ ลำดับการป้อนข้อมูลคือรายการสัญลักษณ์แรกแล้วรายการเฉพาะ(-3 ไบต์ขอบคุณที่ @Dennis)

สำหรับแต่ละคู่ที่(p, e)หาเลขชี้กำลังสำคัญ

(p^(e+1) - 1)/(p - 1)

จากนั้นค้นหาผลิตภัณฑ์ทั้งหมดเหล่านี้ เช่นสำหรับ 240 สิ่งนี้จะเป็น

(1 + 2 + 4 + 8 + 16)(1 + 3)(1 + 5) = 31 * 4 * 6 = 744

O(sum of exponents)ขึ้นอยู่กับวิธีการยกกำลังจะดำเนินการนี้จะดีกว่า


6

APL, 18 13 ไบต์ * 0.8 = 10.4

×/(1-⊣×*)÷1-⊣

สิ่งนี้จะสร้างฟังก์ชั่นฝึกหัดแบบไดอะดิคซึ่งจะนำปัจจัยต่าง ๆ ทางด้านซ้ายและเลขชี้กำลังทางด้านขวา

×/             ⍝ Vector product of
  (1-⊣×*)      ⍝ each factor^(exponent+1)-1
         ÷1-⊣  ⍝ divided by factor-1

ลองมันออนไลน์ โปรดทราบว่านี่เป็นวิธีเดียวกับ awesomely ฉลาด SP3000 ของคำตอบ CJam

บันทึก 5 ไบต์ขอบคุณเดนนิส!


2

TI-BASIC, 17 ไบต์ * 0.8 = 13.6

ใช้วิธีของ Sp3000 ด้วย แต่ฉันก็พบว่ามันอิสระ ใช้เวลาหนึ่งรายการจากอินพุตและอีกหนึ่งรายการจากหน้าจอหลัก

Input E
prod(AnsAns^∟E-1)/prod(Ans-1

การใช้ prod (เล็กกว่าสองเท่าเพราะช่วยให้เราใช้วงเล็บเปิดได้ฟรีโปรดทราบว่าคำตอบนี้ไม่สนับสนุนอาร์เรย์ว่างเปล่าเนื่องจากไม่มีอาร์เรย์ว่างใน TI-BASIC


2

Haskell, 38 * 0.8 = 30.4

product$zipWith(\p e->(p*p^e-1)/(p-1))

การใช้งาน:

product$zipWith(\p e->(p*p^e-1)/(p-1)) [2,3,5] [4,1,1]
744.0

ฟังก์ชั่นที่ไม่ระบุชื่อจะนำ(p,e)ไปใช้กับผลรวมของตัวหารp^eผ่านทางผลรวมซีรีย์ทางเรขาคณิต การรวมรายการทั้งสองเข้าด้วยกันขณะที่การเข้าร่วมและนำผลิตภัณฑ์มาให้ผลลัพธ์

ฉันไม่สามารถหาอะไรที่สั้นไปกว่าการแสดงออกทางคณิตศาสตร์

(p*p^e-1)/(p-1)
sum$map(p^)[0..e]

(\p e->_)อาจจะมีวิธีที่จะกำจัดได้

นิยามฟังก์ชั่น Infix ให้ความยาวเท่ากัน (38):

p%e=(p*p^e-1)/(p-1)
product$zipWith(%)

2

C ++, 111 80 77 ไบต์ * 0.8 = 61.6

int g(int*p,int*e,int n){return n?g(p+1,e+1,n-1)*(pow(*p,*e-1)-1)/(*p-1):1;}

การคำนวณนี้ (p ^ (e + 1) -1) / (p-1) และคูณปัจจัยทั้งหมดซ้ำ ๆ พบว่าตัวเองออกมาเมื่อปีที่แล้ว

ขอบคุณที่ช่วยลืมเรื่องการใช้บูลีนสไตล์ c ++ โดยสิ้นเชิง


1
n==0ทำให้ง่ายขึ้น!n- หรือคุณสามารถย้อนกลับผลลัพธ์และใช้เพียงn
Toby Speight

2

Matlab, 53

function t=f(x,y)
s=1:prod(x.^y);t=s*~mod(s(end),s)';

ตัวอย่าง:

>> f([2 3 5], [4 1 1])
ans =
   744

ดูเหมือนว่าคุณอาจเพิ่มโบนัส 0.8
Moartem

@ Moartem ขอบคุณ! แต่ฉันไม่แน่ใจเกี่ยวกับเรื่องนั้น ผมคำนวณจำนวนsและทดสอบตัวหารเป็นไปได้ทั้งหมดจากการ1 sดังนั้น (อย่างน้อย) O (s) ซึ่งน่าจะอยู่ระหว่าง O (ผลรวมของ exponents) และ O (ผลคูณของ exponents)
Luis Mendo

ใช่ถูกต้องมันใหญ่กว่า O (ผลคูณของเลขชี้กำลัง)
Moartem

1

Python 2,156

from itertools import*
from operator import*
i=input()
print sum(reduce(mul,[a**b for a,b in zip(i[0],p)])for p in product(*map(range,[x+1 for x in i[1]])))

อินพุต

[[2,3,5],[4,1,1]]

เอาท์พุต

744

คำอธิบาย

โปรแกรมนี้ได้รับรายชื่อ 2 รายการ: ปัจจัยและเลขยกกำลัง

i=input() # Receive list of 2 lists: i[0] for factors i[1] for exponents

จากนั้นสร้างรายการของชุดค่าผสมที่เป็นไปได้ทั้งหมดของรายการเลขชี้กำลัง

[x+1 for x in i[1]] # [4,1,1]->[5,2,2] (to include last element)
map(range,[x+1 for x in i[1]]) # [[0, 1, 2, 3, 4], [0, 1], [0, 1]]
product(*map(range,[x+1 for x in i[1]])) # [(0, 0, 0), (0, 0, 1), ..., (4, 1, 1)]

และ zip ด้วยปัจจัย:

zip(i[0],p) for p in product(*map(range,[x+1 for x in i[1]])) # [[(2, 0), (3, 0), (5, 0)], ..., [(2, 4), (3, 1), (5, 1)]]

คำนวณปัจจัยต่อกำลังของเลขชี้กำลัง:

 [a**b for a,b in zip(i[0],p)]for p in product(*map(range,[x+1 for x in i[1]])) # [[1, 1, 1], ..., [16, 3, 5]]

และทวีคูณแต่ละรายการ (นี่ให้ตัวหารทั้งหมด):

reduce(mul,[a**b for a,b in zip(i[0],p)])for p in product(*map(range,[x+1 for x in i[1]])) # [1, 5, 3, 15, ..., 240]

สุดท้ายรวมรายการทั้งหมดและพิมพ์:

print sum(reduce(mul,[a**b for a,b in zip(i[0],p)])for p in product(*map(range,[x+1 for x in i[1]]))) # 744

คุณช่วยอธิบายสั้น ๆ ว่าโค้ดของคุณทำอะไรได้บ้าง (เพราะฉันไม่คุ้นเคยกับไพ ธ อน) ดังนั้นฉันจึงสามารถตัดสินความซับซ้อนของโค้ดของคุณได้?
Moartem

นั่นเป็นวิธีที่ฉลาด แต่ความซับซ้อนเป็นผลผลิตของเลขชี้กำลัง
Moartem

@ Moartem ใช่ฉันไม่ได้ใช้เวลามากในการลดความซับซ้อน
TheCrypt

1

Python 3, 134 120 117

อินพุต: สองอาร์เรย์คั่นด้วยเครื่องหมายจุลภาคคั่นด้วยเครื่องหมายจุลภาค

ตัวอย่าง:

(2,3,7,11),(4,2,3,2)
21439600
from functools import*
a=eval(input())
print(reduce(int.__mul__,(sum(x**j for j in range(y+1))for x,y in zip(*a)),1))

ด้วย NumPy สามารถลดลงถึง 100 ไบต์:

import numpy
a=eval(input())
print(numpy.product([sum(x**j for j in range(y+1))for x,y in zip(*a)]))

1
สำหรับตัวอย่างแรกคุณรู้แทนที่จะนำเข้าoperatorเพื่อใช้mulเพียงครั้งเดียวคุณสามารถfloat.__mul__บันทึกจำนวนไบต์ได้
Kade

1

เยลลี่ไม่ใช่การแข่งขัน

คำตอบนี้ไม่ใช่การแข่งขันเนื่องจากความท้าทายมาก่อนการสร้างเยลลี่

5 ไบต์ (ไม่มีโบนัส)

*PÆDS

ลองออนไลน์!

มันทำงานอย่างไร

*PÆDS    Main link. Left input: p (prime factors). Right input: e (exponents).

*        Elevate the prime factors to the corresponding exponents.
 P       Take the product of all powers.
  ÆD     Find all divisors of the product.
    S    Compute the sum of the divisors.

7 ไบต์ (5.6 ไบต์หลังโบนัส)

*‘}’:’{P

มันทำงานอย่างไร

×*’:’{P  Main link. Left input: p (prime factors). Right input: e (exponents).

 *       Elevate the prime factors to the corresponding exponents.
         This yields p ** e.
×        Multiply the prime factors with the corresponding powers.
         This yields p ** (e + 1).
  ’      Decrement the resulting products.
         This yields p ** (e + 1) - 1.
    ’{   Decrement the prime factors.
         This yields p - 1.
   :     Divide the left result by the right one.
         This yields (p ** (e + 1) - 1) / (p - 1).
      P  Take the product of all quotients.

ลองออนไลน์!


1

APL, 12 ไบต์ * 0.8 = 9.6

×/1++/¨⎕*⍳¨⎕

สิ่งนี้อ่านสองรายการจากแป้นพิมพ์เลขชี้กำลังก่อนคือ:

      ×/1++/¨⎕*⍳¨⎕
⎕:
      4 1 1
⎕:
      2 3 5
744

คำอธิบาย:

  • : อ่านรายการจากแป้นพิมพ์ (เลขยกกำลัง)
  • ⍳¨[1..n]เพราะตัวเลขในแต่ละรายการสร้างรายการ
  • ⎕*: อ่านรายการอื่นจากแป้นพิมพ์ (จำนวนเฉพาะ) และเพิ่มนายกแต่ละรายการให้กับแต่ละเลขชี้กำลังในรายการที่เกี่ยวข้อง
  • +/¨: ผลรวมแต่ละรายการ
  • 1+: เพิ่มหนึ่งรายการในแต่ละผลลัพธ์เพื่อชดเชยการขาดหายไปx^0ในแต่ละรายการ
  • ×/: ใช้ผลิตภัณฑ์ของผลลัพธ์

1

แร็กเก็ต (Scheme), 65 * 0.8 = 52 ไบต์

เลขคณิตเช่นเดียวกับคนอื่น ๆ

(λ(x y)(foldl(λ(m n o)(*(/(-(expt m(+ n 1))1)(- m 1))o))1 x y))

คำอธิบาย:

(λ (x y)    ;defines anonymous function with two inputs
    (foldl    ;recursively applies the following function to all elements of the lists given to an argument given (foldl function argument lists lists lists...)
        (λ (m n o) (* (/ (- (expt m (+ n 1)) 1) (- m 1)) o))    ;an anonymous function representing the same arithmetic used in the CJam answer, then multiplying it with our incrementor
        1 x y))    ;the incrementor argument is 1, and the input lists are the ones provided into the original function

0

Python 2, 80 ไบต์ * 0.8 = 64

สิ่งนี้จะถือว่าอินพุตเข้ามาทีละตัว ทำตามสูตรเดียวกับที่ระบุไว้ในคำตอบ CJam ของ Sp3000

print(reduce(float.__mul__,[~-(x**-~y)/~-x for x,y in zip(input(),input())],1)) 

หากไม่ได้รับอนุญาตฉันจะใช้นี่เป็นวิธีแก้ปัญหาซึ่งได้คะแนน 84 ไบต์ * 0.8 = 67.2 [2,3,5],[4,1,1]การป้อนข้อมูลควรจะคั่นด้วยเครื่องหมายจุลภาคคือ

k=input()
print(reduce(float.__mul__,[~-(x**-~y)/~-x for x,y in zip(k[0],k[1])],1))

Psst เฮ้! นี่เป็นทางออกที่เป็นไปได้ใน Symbolic สิ่งที่ฉันกำลังทำงาน:Ƥ(П([~-(x**-~y)/~-xϝx,yϊʐ(Ί,Ί)],1))


0

Mathematica ขนาด 40 ไบต์

Total[Outer@@{*}~Join~(#^0~Range~#2),3]&

โดยไม่ต้องใช้ inbuilts ใด ๆ ที่จัดการกับตัวหารเพื่อแยกความแตกต่างจากโซลูชัน mathematica อื่น ๆ ในเธรด

อินพุตคือ (ใช้ตัวอย่าง) [{2, 3, 5}, {4, 1, 1}]


0

Perl 5, 96 ไบต์

เห็นได้ชัดว่านี่ไม่ใช่การชนะ แต่ฉันตัดสินใจที่จะเขียนมันเพื่อความสนุกสนาน

มันเป็นรูทีนย่อย:

{($b,$e)=@_;$s=1;map$s*=$b->[$_]**$e->[$_],0..@$b-1;$_=1x$s;for$j(1..$s){$i+=$j*/^(.{$j})*$/}$i}

เห็นมันในการกระทำดังนี้:

perl -e'print sub{...}->([2,3,5],[4,1,1])'

มันทำงานอย่างไร:

  • ($b,$e)=@_อ่าน arrayrefs อินพุต$b(ฐาน) และ$e(เลขชี้กำลัง)
  • $s=1 เริ่มต้นผลิตภัณฑ์
  • map$s*=$b->[$_]**$e->[$_],0..@$b-1คูณ$sด้วยอำนาจเลขชี้กำลังต่อเนื่อง ตอนนี้$sเป็นจำนวนประกอบ
  • $_=1x$sชุด$_เท่ากับสตริงของคน$sยาว $iเริ่มต้นได้ที่ 0
  • for$j(1..$s){$i+=$j*/^(.{$j})*$/}พยายามให้ทุก ๆ หมายเลข$jระหว่าง 1 $sถึงจะแยกตัว$_เป็น$jตัวอักษรซ้ำหลาย ๆ ครั้ง ถ้ามันสามารถแล้ว$jแบ่ง$sและ/^(.{$j})*$/1 (มิฉะนั้นมันเป็น 0), และมีการเติมโดย$i $jดังนั้นเราจึงเพิ่มจำนวนพาร์ทิชันในพาร์ทิชันที่มีขนาดเท่ากันของ$i $_ในฐานะที่เป็นชี้โอมาร์อี Pol ออก , $iเป็นจำนวนที่เราแสวงหากำลัง
  • $i$iที่ให้ผลตอบแทนที่สิ้นสุด

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