ทำซ้ำการทำงาน GCD นี้


19

ปัญหา A3 จากการแข่งขัน Putnam 2008กล่าวว่า:

เริ่มต้นด้วยลำดับที่แน่นอนของจำนวนเต็มบวก หากเป็นไปได้ให้เลือกสองดัชนีซึ่งไม่ได้แบ่งและแทนที่และa_kด้วย\ gcd (a_j, a_k)และ\ text {lcm} (a_j, a_k)ตามลำดับ พิสูจน์ว่าหากกระบวนการนี้ซ้ำแล้วซ้ำอีกจะต้องหยุดในที่สุดและลำดับสุดท้ายไม่ได้ขึ้นอยู่กับตัวเลือกที่ทำa1,a2,,anj<kajakajakgcd(aj,ak)lcm(aj,ak)

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

นี่คือ : ทางออกที่สั้นที่สุดในทุกภาษาการเขียนโปรแกรมชนะ

กรณีทดสอบ

[1, 2, 4, 8, 16, 32] => [1, 2, 4, 8, 16, 32]
[120, 24, 6, 2, 1, 1] => [1, 1, 2, 6, 24, 120]
[97, 41, 48, 12, 98, 68] => [1, 1, 2, 4, 12, 159016368]
[225, 36, 30, 1125, 36, 18, 180] => [3, 9, 18, 90, 180, 900, 4500]
[17, 17, 17, 17] => [17, 17, 17, 17]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] => [1, 1, 1, 1, 1, 2, 2, 6, 60, 2520]

9
ช่างเป็นปัญหาที่เรียบร้อย! เขียนแต่ละจำนวนเต็มเป็นและโปรดทราบว่ากระบวนการเพียงแค่เรียงลำดับรายการ in ขนาน :)ai2αi3βi5γiα,β,γ,...
ลินน์

คำตอบ:


12

เยลลี่ขนาด 9 ไบต์

ÆEz0Ṣ€ZÆẸ

ลองออนไลน์!

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

ÆEz0Ṣ€ZÆẸ  Main link. Argument: A (array)

ÆE         For each n in A, compute the exponents of n's prime factorization.
           E.g., 2000000 = 2⁷3⁰5⁶ gets mapped to [7, 0, 6].
  z0       Zip 0; append 0's to shorter exponent arrays to pad them to the same
           length, then read the resulting matrix by columns.
    Ṣ€     Sort the resulting arrays (exponents that correspond to the same prime).
      Z    Zip; read the resulting matrix by columns, re-grouping the exponents by
           the integers they represent.
       ÆẸ  Unexponents; map the exponent arrays back to integers.


5

J , 17 ไบต์

/:~"1&.|:&.(_&q:)

ลองออนไลน์!

อาจเป็นคำตอบ J แรกใน PPCG ที่จะใช้&.สองครั้ง หลังจากนี้และที่ฉันเริ่มที่จะรู้สึกเหมือนแปลกแฮ็กเกอร์เจ

โดยทั่วไปการแปลจากเดนนิสคำตอบของวุ้น

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

/:~"1&.|:&.(_&q:)  Single monadic verb.
           (_&q:)  Convert each number to prime exponents
                   (automatically zero-filled to the right)
       |:&.        Transpose
/:~"1&.            Sort each row in increasing order
       |:&.        Transpose again (inverse of transpose == transpose)
           (_&q:)  Apply inverse of prime exponents; convert back to integers

ก่อนหน้านี้อยู่ที่นี่
FrownyFrog

5

ภาษา Wolfram (Mathematica)ขนาด 44 ไบต์

Table[GCD@@LCM@@@#~Subsets~{i},{i,Tr[1^#]}]&

kk

bk=gcd({lcm(ai1,,aik)|1i1<<ikn})

ลองออนไลน์!


ดีมาก! คุณกำลังสองสองแนวทางที่แปลกผมไม่ได้เห็นมา :)
Misha Lavrov

5

Python 3 , 103 ไบต์

import math
def f(a,i=0,j=-1):d=math.gcd(a[i],a[j]);a[j]*=a[i]//d;a[i]=d;a[i:j]and f(a,i,j-1)==f(a,i+1)

ลองออนไลน์!

คำอธิบาย

ปัญหานี้คือการจัดเรียงแบบขนานบนปัจจัยสำคัญและ (gcd (a, b), lcm (a, b)) นั้นคล้ายคลึงกับ (min (a, b), max (a, b)) งั้นมาพูดกันในเรื่องของการเรียงลำดับ

เราจะพิสูจน์โดยอุปนัยว่าหลังจาก f (i, j), [i] จะกลายเป็นค่าที่เล็กที่สุดใน (ค่าเก่าของ) L, โดยที่ L คือช่วงระหว่าง [i] และ [j] รวมถึงปลายทั้งสอง . และถ้า j = -1, f (i, j) จะเรียงลำดับช่วง L

ในกรณีที่ L ประกอบด้วยองค์ประกอบหนึ่งอย่างเล็กน้อย สำหรับการอ้างสิทธิ์ครั้งแรกโปรดสังเกตว่า L ที่เล็กที่สุดไม่สามารถอยู่ใน [j] หลังจากการแลกเปลี่ยนดังนั้น f (i, j-1) จะใส่ไว้ใน [i] และ f (i + 1, - 1) จะไม่ส่งผลกระทบต่อมัน

สำหรับการอ้างสิทธิ์ครั้งที่สองโปรดทราบว่า [i] เป็นค่าที่เล็กที่สุดและ f (i + 1, -1) จะเรียงลำดับค่าที่เหลืออยู่ดังนั้น L จะเรียงลำดับหลังจาก f (i, j)


3

เรติน่า 65 ไบต์

\d+
*
+`\b((_+)(\2)+)\b(.*)\b(?!\1+\b)(\2+)\b
$2$4$5$#3*$5
_+
$.&

ลองออนไลน์! ลิงค์นั้นรวมถึงกรณีทดสอบที่เร็วกว่า คำอธิบาย:

\d+
*

แปลงเป็นเอก

+`\b((_+)(\2)+)\b(.*)\b(?!\1+\b)(\2+)\b

จับคู่ซ้ำ: ตัวเลขใด ๆ ที่มีปัจจัยจากนั้นเป็นตัวเลขในภายหลังที่ไม่สามารถหารด้วยตัวเลขแรก แต่หารด้วยปัจจัย

$2$4$5$#3*$5

$1เป็นหมายเลขแรก $2เป็นปัจจัย เพราะ regex เป็นโลภนี่เป็นปัจจัยที่ใหญ่ที่สุดนั่นคือ gcd $4เป็นส่วนหนึ่งของการจับคู่ระหว่างหมายเลขดั้งเดิม $5เป็นตัวเลขที่สอง $#3(ในทศนิยมมากกว่าเอก) เป็นหนึ่งในน้อยกว่า$1หารด้วยเพราะมันไม่ได้รวมเดิม$2 $2ซึ่งหมายความว่าในการคำนวณ LCM ที่เราจำเป็นต้องคูณ$5โดยหนึ่งมากกว่า$#3ที่เขียนมากที่สุด succintly เป็นผลรวมของ$5สินค้าของและ$#3$5

_+
$.&

แปลงเป็นทศนิยม



@Dennis มีเพียงสามคำตอบในเรตินา ฉันคุ้นเคยกับการทำ I / O เป็นทศนิยม
Neil

3

05AB1E , 10 ไบต์

เครดิตสำหรับวิธีการไปalephalpha

εIæN>ù€.¿¿

ลองออนไลน์!

εIæN>ù€.¿¿     Full program. Takes a list from STDIN, outputs another one to STDOUT.
ε              Execute for each element of the input, with N as the index variable.
 Iæ            Powerset of the input.
   N>ù         Only keep the elements of length N+1.
      €.¿      LCM each.
         ¿     Take the GCD of LCMs.


2

JavaScript (SpiderMonkey) , 69 ไบต์

a=>a.map((q,i)=>a.map(l=(p,j)=>a[j]=j>i&&(t=p%q)?p/t*l(q,j,q=t):p)|q)

ลองออนไลน์!

  • ฟังก์ชั่นlกำหนดlcm(p,q)ให้a[j]และกำหนดgcd(p, q)ให้qถ้าj > iไม่เช่นนั้นทุกอย่างจะไม่เปลี่ยนแปลง
    • lcm(p,q) = if p%q=0 then p else p*lcm(q,p%q)/(p%q)

คำตอบเก่า:

JavaScript (SpiderMonkey) 73 ไบต์

a=>a.map((u,i)=>a.map((v,j)=>i<j?a[j]*=u/(g=p=>p%u?g(u,u=p%u):u)(v):0)|u)

ลองออนไลน์!

  • ฟังก์ชั่นgการคำนวณและกำหนดค่าตอบแทนให้กับgcd(u, v)u

2

05AB1E , 15 14 13 ไบต์

Ó¾ζ€{øεgÅpymP

Port of @ Dennis ♦ 'Jelly ตอบแต่น่าเสียดายที่ 05AB1E ไม่มี Unexponents-builtin ดังนั้นมันใช้เวลามากกว่าครึ่งหนึ่งของโปรแกรม .. :(
-1 -1 ไบต์ขอบคุณ@ Mr.Xcoder .
-1 byte ขอบคุณ@Enigma .

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

Ó          # Prime exponents of the (implicit) input-list
 ¾ζ        # Zip, swapping rows and columns, with integer 0 as filler
   €{      # Sort each inner list
     ø     # Zip, swapping rows and columns again
ε          # Map each inner list:
 gÅp       #  Get the first `l` primes, where `l` is the size of the inner list
    ym     #  Take the power of the prime-list and inner list
      P    #  And then take the product of that result
           # (And output implicitly)

1
โอ้ฉันไม่เห็นคำตอบของคุณก่อนโพสต์ของฉันเองฮ่า ๆ 14 ไบต์โดยใช้¾และลบ+1 (ฉันเคยลองแบบนี้มาก่อนเพราะฉันพยายามที่จะตอบคำถามของ Dennis ด้วย lol)
Mr. Xcoder

1
การใช้εgÅpymPจะช่วยประหยัดไบต์อื่นมากกว่าหนึ่งนาย Xcoder metioned
Emigna

@ Mr.Xcoder โอ้ไม่ได้รู้ว่ามีความแตกต่างระหว่างฟิลเลอร์ที่มีและ0 ¾ต้องจำไว้! อันที่จริงฉันจะเพิ่มไปยังเคล็ดลับ 05AB1E ขนาดเล็กของฉันในตอนนี้ :)
Kevin Cruijssen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.