LCM ของจำนวนตรรกยะ


18

ตัวคูณร่วมน้อย (LCM) ของชุดของตัวเลขAเป็นที่เล็กที่สุดจำนวนเต็มbเช่นว่าb/aเป็นจำนวนเต็มสำหรับจำนวนเต็มทั้งหมดในa Aคำจำกัดความนี้สามารถขยายไปถึงตัวเลขที่มีเหตุผล!

งาน

ค้นหาที่เล็กที่สุดในเชิงบวกที่มีเหตุผล bดังกล่าวที่b/aเป็นจำนวนเต็มสำหรับทุกrationals aในการป้อนข้อมูล

กฎระเบียบ

  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • คุณอาจนำตัวเศษและตัวส่วนแยกจากกันในอินพุต แต่ไม่สามารถใช้คู่ผสมลอย ฯลฯ
  • อินพุตอาจไม่ลดลงจนสุด
  • คุณอาจจะใช้ปัจจัยการผลิตที่เป็นจำนวนเต็ม rationals 1กับส่วนของ
  • การส่งที่จะป้อนตัวเลขที่มีเหตุผลไปยัง LCM / GCD ในตัวได้รับอนุญาต แต่ไม่สามารถแข่งขันได้

กรณีทดสอบ

In:  3
Out: 3

In:  1/17
Out: 1/17

In:  1/2, 3/4
Out: 3/2

In:  1/3, 2/8
Out: 1

In:  1/4, 3
Out: 3

In:  2/5, 3
Out: 6

In:  1/2, 3/4, 5/6, 7/8
Out: 105/2

นี่คือดังนั้นการส่งโดยใช้ไบต์น้อยที่สุดชนะ!


4
หมายเหตุ: การคำนวณLCM[numerators]/GCD[denominators]อาจไม่ทำงานเมื่ออินพุตมีจำนวนตรรกยะที่ไม่ลดลง 1/3, 2/8เช่น
JungHwan Min

ถ้าฉันลดมันมันจะใช้ได้ไหม
Leun Nun

@LeakyNun ใช่มันจะ
JungHwan Min

เพื่อกระตุ้นให้ผู้คนส่งคำตอบที่ไม่ได้สร้างขึ้นฉันได้แก้ไขคำถามทำให้บิวด์อินมีคำตอบที่ไม่แข่งขัน (ยังอนุญาต) หากนี่เป็นปัญหาฉันจะย้อนกลับการแก้ไขของฉัน
JungHwan Min

สิ่งที่เกี่ยวกับ LCM ในตัวถูกใช้งาน แต่มีเฉพาะจำนวนเต็ม - แข่งขันกันหรือไม่
Jonathan Allan

คำตอบ:


5

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

g/:@$€Z©Ḣæl/;®Ḣg/$¤

ลองออนไลน์!


1
tfw Jelly ดูดด้วยเศษส่วน
Erik the Outgolfer

2
g/:@$€->:g/$€
Jonathan Allan

2
ประหยัดอีกสองไบต์ด้วย::g/$€ZµḢæl/,Ḣg/$
Jonathan Allan

@JonathanAllan นั่นเป็นชิ้นส่วนที่ดีของรหัส ...
เอริก Outgolfer

6

J, 3 ไบต์, ไม่ใช่การแข่งขัน

*./

รับรายการอินพุตที่มีเหตุผลซึ่งจะพับ LCM ผ่านมัน


4

sed, 374 (373 + 1) ไบต์

-Eธงของ sed นับเป็นหนึ่งไบต์ หมายเหตุ: ฉันยังไม่ได้ลองเล่นกอล์ฟและอาจจะไม่ได้ค่อนข้างนาน
อินพุตถูกใช้เป็น unary และเอาต์พุตจะเป็น unary ช่องว่างจะต้องล้อมรอบทุกส่วน ตัวอย่าง: echo " 1/111 111/11111 111111/111 ".

:d;s, (1*)/\1(1*), \1/\22,;s,(1*)(1*)/\2 ,2\1/\2 ,;td;s,1*(1/22*),\1,g;s,(22*/1)1*,\1,g;:r;s,((1*)/1*)2,\1\2,;s,2(1*/(1*)),\2\1,;tr;h;s,1*/,,g;:g;s/^(1*) 1(1*) 1(1*)/1\1 \2 \3/;tg;s/  */ /g;s/^/ /;/1 1/bg;x;s,/1*,,g;s/^( 1*)( 1*)/\1\2\2/;:l;s/^(1*) (1*) \2(1*)/\1\2 \2 \3/;tl;/  $/be;/  /{s/^(1*) 1*  1*( 1*)/ \1\2\2/;bl};s/^(1* 1* )(1*) (1*)/\1\2\3 \3/;bl;:e;G;s, *\n *,/,

ลองออนไลน์!



3

JavaScript (ES6), 85 ไบต์

a=>a.reduce(([b,c],[d,e,g=(b,c)=>c?g(c,b%c):b,h=g(b*e,c*d),i=g(b*d,h)])=>[b*d/i,h/i])

ไม่ต้องมองหาตัวอาคาร! ไม่ต้องสงสัยเลยว่าบางคนจะเอาชนะสิ่งนี้ได้โดยใช้วิธีเรียกซ้ำหรืออะไรทำนองนั้น



2

Perl 6 ,  46  42 ไบต์

{[lcm](@_».numerator)/[gcd] @_».denominator}

ทดสอบมัน

{[lcm](($/=@_».nude)[*;0])/[gcd] $/[*;1]}

ทดสอบมัน

อินพุตเป็นรายการของตัวเลขที่มีเหตุผล

ขยาย:

{ # bare block lambda with implicit parameter list 「@_」

  [lcm](            # reduce using &infix:<lcm>
    (
      $/ = @_».nude # store in 「$/」 a list of the NUmerators and DEnominiators
                    # ((1,2), (3,4))

    )[
      *;            # from all of the first level 「*」,
      0             # but only the 0th of the second level (numerators)
    ]
  )
  /
  [gcd] $/[ *; 1 ]  # gcd of the denominators
}

2

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

\d+
$*
\b(1+)(\1)*/(\1)+\b
$#2$*11/$#3$*
{`^((1+)\2*)/(1+)+ (\2)+/\3+\b
$1 $#4$*1/$3
}`\G1(?=1* (1+))|\G 1+
$1
1+
$.&

ลองออนไลน์! ใช้อินพุตเป็นชุดของเศษส่วนที่ไม่เหมาะสมซึ่งคั่นด้วยช่องว่าง (ไม่มีจำนวนเต็มหรือตัวเลขผสม) คำอธิบาย:

\d+
$*

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

\b(1+)(\1)*/(\1)+\b
$#2$*11/$#3$*

สิ่งนี้จะลดเศษส่วนแต่ละส่วนให้เป็นเงื่อนไขต่ำสุด กลุ่มการจับภาพที่ 1 แสดงให้เห็นถึง GCD /ของเศษและส่วนดังนั้นเรานับจำนวนของการจับภาพก่อนและหลัง \b(1+)+/(\1)+\bดูเหมือนจะไม่นับจำนวนการจับอย่างถูกต้องด้วยเหตุผลบางอย่างดังนั้นฉันใช้กลุ่มการจับภาพพิเศษและเพิ่ม 1 ลงในผลลัพธ์

{`^((1+)\2*)/(1+)+ (\2)+/\3+\b
$1 $#4$*1/$3

สิ่งนี้ทำหลายสิ่งหลายอย่าง กลุ่มการจับ 2 หมายถึง GCD ของตัวเศษของสองเศษส่วนแรกในขณะที่กลุ่มการจับ 3 หมายถึง GCD ของตัวส่วน $#4ดังนั้นจึงเป็นตัวเศษที่สองหารด้วย GCD (อีกครั้งฉันไม่สามารถจับจำนวนของตัวเศษแรกได้ แต่ฉันต้องหารตัวเศษหนึ่งส่วนด้วย GCD ของพวกมันดังนั้นค่าใช้จ่ายฉันก็ไม่มากนัก)

}`\G1(?=1* (1+))|\G 1+
$1

ตอนนี้ตัวเศษที่สองถูกหารด้วย GCD ของพวกเขาเราแค่ใช้นิพจน์นี้จากการสอนเลขคณิตเลขคณิตเพื่อคูณสองตัวเข้าด้วยกันส่งผลให้ LCM จากนั้นเราจะทำการฝึกซ้ำสำหรับเศษส่วนที่เหลืออยู่

1+
$.&

แปลงค่าย้อนกลับเป็นทศนิยม


2

เสียงกระเพื่อมสามัญ 154 ไบต์

(defun f(l &aux(s(pairlis l l)))(loop(and(eval`(=,@(mapcar'car s)))(return(caar s)))(let((x(assoc(reduce'min s :key'car)s)))(rplaca x(+(car x)(cdr x))))))

อัลกอริธึมที่ใช้ (ระบุสำหรับจำนวนเต็ม แต่ใช้ได้กับ rationals ด้วย)

ก่อนอื่นให้สร้างรายการที่เชื่อมโยงของข้อมูลอินพุตด้วยตัวเองเพื่อติดตามค่าเริ่มต้นขององค์ประกอบดังนั้นลำดับการปฏิบัติการจะได้รับจาก "รถยนต์" ของรายการ

(defun f(l &aux (s (pairlis l l)))        ; make the associative list
  (loop
     (when (eval `(= ,@(mapcar 'car s))) ; when the car are all equal
       (return (caar s)))                 ; exit with the first one
     (let ((x (assoc (reduce 'min s :key 'car) s))) ; find the (first) least element
       (rplaca x (+ (car x) (cdr x))))))  ; replace its car adding the original value (cdr)

กรณีทดสอบ:

CL-USER> (f '(3))
3
CL-USER> (f '(1/17))
1/17
CL-USER> (f '(1/2 3/4))
3/2
CL-USER> (f '(1/3 2/8))
1
CL-USER> (f '(1/4 3))
3
CL-USER> (f '(2/5 3))
6
CL-USER> (f '(1/2 3/4 5/6 7/8))
105/2

หมายเหตุ: การแก้ปัญหาคือโดยไม่ต้องใช้การสร้างlcmและgcdที่รับจำนวนเต็ม


w00t? ลองนี้ที่ (/ (lcm 1 3 5 7) (gcd 2 4 6 8))REPL
Kaz

@Kaz เนื่องจากได้กล่าวถึงปัญหาแล้วว่า“ อนุญาตให้ส่งข้อมูลที่มีเหตุผลไปยัง LCM / GCD builtin ได้ แต่ไม่สามารถแข่งขันได้”
Renzo

ในแง่ของเสียงกระเพื่อมพูดอย่างเคร่งครัดเรากำลังให้อาหาร rationals เมื่อเราเรียก(lcm 1 3 5 7)เนื่องจากจำนวนเต็มเป็นประเภทย่อยของ rationals แต่ฉันคิดว่ากฎนี้ควรแยกการใช้ a lcmหรือgcdอนุญาตอินพุตที่มีเหตุผล
Kaz

@Kaz, ops ... ฉันตีความผิดกฎ! ฉันควรลบโพสต์หรือไม่ (อาจไม่ใช่การตลาดที่ดีสำหรับ Common LISP :)
Renzo

ฉันต้องการเพียงแค่ใส่ในบันทึกว่านี่เป็นวิธีการแก้ปัญหาโดยไม่ต้องใช้ในตัวจำนวนเต็มและlcm gcd
Kaz

1

Mathematica 3 ไบต์ไม่ใช่การแข่งขัน

LCM

LCMฟังก์ชันในตัวของ Mathematica มีความสามารถในการจัดการอินพุตจำนวนตรรกยะ


3
ในขณะที่ตอบคำถามของคุณเองไม่เป็นไรฉันไม่คิดว่าจะตอบคำถามด้วยวิธีแก้ปัญหาที่มีโอกาสในการชนะอย่างแท้จริง: P
Beta Decay

@BetaDecay ใช่แล้ว ... ดังนั้นมันจึงไม่ใช่การแข่งขันในตอนนี้
JungHwan Min


1

เสียงกระเพื่อมสามัญ, 87 78 ไบต์

การใช้lcmและgcdซึ่งมีอินพุตจำนวนเต็ม:

(defun l(a)(/(apply #'lcm(mapcar #'numerator a))(apply #'gcd(mapcar #'denominator a))))

golfed เพิ่มเติม:

(defun l(a)(eval`(/(lcm,@(mapcar'numerator a))(gcd,@(mapcar'denominator a))))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.