Rasyonel Sayıların LCM'si


18

Sayı kümesinin en küçük ortak katı (LCM) Atamsayı küçüğüdür bböyle b/abütün tamsayılar için bir tam sayıdır aiçinde A. Bu tanım rasyonel sayılara genişletilebilir!

Görev

En küçük pozitif bul rasyonel b şekilde b/abir olan tamsayı herkes için rationals a girişinde.

kurallar

  • Standart boşluklar yasaktır.
  • Girişte pay ve paydaları ayrı olarak alabilir, ancak çiftler, şamandıralar vb.
  • Giriş tam olarak azaltılamaz.
  • Tamsayı girişlerini paydası ile rasyonel olarak alabilirsiniz 1.
  • Rasyonel sayıları bir LCM / GCD yerleşkesine besleyecek gönderimlere izin verilir, ancak rakip değildir.

Test Durumları

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

Bu , bu yüzden en az bayt kullanarak gönderme kazanmak!


4
Not: LCM[numerators]/GCD[denominators]Giriş, azaltılmamış bir rasyonel sayı içerdiğinde bilgisayar çalışmayabilir. örn 1/3, 2/8.
JungHwan Min

Yani eğer azaltırsam, işe yarayacak mı?
Sızan Rahibe

@LeakyNun Evet, olacak.
JungHwan Min

İnsanları yerleşik olmayan yanıtlar göndermeye teşvik etmek için, soruyu düzenledim ve yerleşik yanıtları rakipsiz hale getirdim (yine de izin veriliyor). Bu bir sorunsa düzenlememi geri alacağım.
JungHwan Min

Yerleşik bir LCM yerleşik olmasına rağmen, yalnızca tamsayılarla rekabet ediyor - rekabet ediyor mu değil mi?
Jonathan Allan

Yanıtlar:



6

J, 3 byte, rakip değil.

*./

Rasyonel girdilerin bir listesi verildiğinde, bu LCM'yi katlar.


4

sed, 374 (373 + 1) bayt

sed'in -Ebayrağı bir bayt olarak sayılır. Not: Henüz golf oynamaya çalışmadım ve muhtemelen bir süredir olmayacak.
Giriş tekli alınır ve çıktı tekli olur. Boşluklar her kesiri çevrelemelidir. Örnek: 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 *,/,

Çevrimiçi deneyin!



3

JavaScript (ES6), 85 bayt

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

Bakın yerleşimler yok! Kuşkusuz, birisi bunu tekrarlayan bir yaklaşım veya benzeri bir şey kullanarak yenecektir.



2

Perl 6 ,  46  42 bayt

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

Dene

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

Dene

Girdi Rasyonel sayıların bir listesidir .

Expanded:

{ # 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

Retina , 117 bayt

\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+
$.&

Çevrimiçi deneyin! Girdiyi boşlukla ayrılmış uygunsuz kesirler dizisi olarak alır (tamsayı veya karışık sayı yok). Açıklama:

\d+
$*

Ondalık değeri tekli olarak dönüştürür.

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

Bu, her kesiri en düşük terimlere indirger. Yakalama grubu 1, payın ve paydanın GCD'sini temsil eder, bu nedenle önce ve sonra yakalama sayısını sayarız /. \b(1+)+/(\1)+\bherhangi bir nedenle yakalama sayısını doğru saymıyor gibi görünüyor, bu yüzden ekstra bir yakalama grubu kullanıyorum ve sonuca 1 ekliyorum.

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

Bu birkaç şey yapar. Yakalama grubu 2, ilk iki fraksiyonun paylarının GCD'sini temsil ederken, yakalama grubu 3 paydaların GCD'sini temsil eder. $#4bu nedenle ikinci pay GCD'lerine bölünür. (Yine, ilk payın yakalama sayısını yapamadım, ancak sadece bir payı GCD'lerine bölmem gerekiyor, bu yüzden bana çok pahalıya mal olmaz.)

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

Şimdi ikinci pay GCD'lerine bölündüğüne göre, bu ifadeyi tekli aritmetik öğreticiden kullanarak ikisini birlikte çoğaltarak LCM'ye yol açıyoruz. Daha sonra egzersizi kalan fraksiyonlar için tekrarlıyoruz.

1+
$.&

Tekliyi tekrar ondalığa çevirir.


2

Ortak Lisp, 154 bayt

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

Kullanılan algoritma (tamsayılar için belirtilir, ancak gerekçeler için de çalışır).

Öncelikle, elemanların başlangıç ​​değerlerini takip etmek için giriş verilerinin kendisiyle ilişkilendirilebilir bir liste yapın, böylece çalışma sırası listenin "araba" ları tarafından verilir.

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

Test senaryoları:

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

Not: Çözüm, bina kullanmadan lcmve gcdtamsayıları kabul eder.


W00t? Bunu REPL'inizde deneyin (/ (lcm 1 3 5 7) (gcd 2 4 6 8)).
Kaz

@Kaz, çünkü problemde de belirtildiği gibi, “Bir LCM / GCD yerleşkesine rasyonel sayıları besleyecek gönderimlere izin verilir, ancak rakipsizdir”.
Renzo

Lisp terimleriyle, tam olarak konuşursak, aslında (lcm 1 3 5 7)tamsayı rasyonların bir alt türü olduğu için dediğimizde rasyonelleri besliyoruz , ancak bence kuralın rasyonel girdilere izin veren bir lcmveya gcdbu kullanımı hariç tutması gerekiyor .
Kaz

@Kaz, ops ... Kuralları yanlış yorumladım! Gönderiyi kaldırmalı mıyım? (belki Common Lisp için iyi bir pazarlama değildir :)
Renzo

Bu kullanarak yerleşik tamsayı olmayan bir çözüm olduğunu ben sadece bir not koyardım lcmve gcd.
Kaz

1

Mathematica, 3 bayt, rakip olmayan

LCM

Mathematica'nın yerleşik LCMişlevi rasyonel sayı girişlerini işleyebilir.


3
Kendi sorunuzu cevaplamak iyi olsa da, çok gerçek bir kazanma şansı olan bir çözümle cevap vermenin çok sportif olduğunu düşünmüyorum: P
Beta Çürümesi

@BetaDecay Evet ... Yani şimdi rekabet etmiyor.
JungHwan Min

1

PHP , 194 bayt

<?for(list($n,$d)=$_GET,$p=array_product($d);$x=$n[+$k];)$r[]=$x*$p/$d[+$k++];for($l=1;$l&&++$i;$l=!$l)foreach($r as$v)$l*=$i%$v<1;for($t=1+$i;$p%--$t||$i%$t;);echo$p/$t>1?$i/$t."/".$p/$t:$i/$t;

PHP [$n,$d]=$_GETyerine -4 baytlist($n,$d)=$_GET

Çevrimiçi deneyin!


1

Yaygın Lisp, 87 78 bayt

Kullanma lcmve gcdtam sayı giriş sahip olan:

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

Daha fazla golf:

(defun l(a)(eval`(/(lcm,@(mapcar'numerator a))(gcd,@(mapcar'denominator a))))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.