LCM liczb wymiernych

18

Najmniejszą wspólną wielokrotnością (LCM) zbioru liczb Ajest najmniejsza liczba całkowita btaka, która b/ajest liczbą całkowitą dla wszystkich liczb całkowitych aw A. Definicję tę można rozszerzyć na liczby wymierne!

Zadanie

Znajdź najmniejsze pozytywne wymierne, b takie b/ajak liczba całkowita dla wszystkich wymiernych a danych wejściowych.

Zasady

  • Standardowe luki są zabronione.
  • Możesz wprowadzić liczniki i mianowniki osobno na wejściu, ale nie możesz brać liczb podwójnych, liczb zmiennoprzecinkowych itp.
  • Dane wejściowe mogą nie zostać w pełni zmniejszone.
  • Możesz przyjmować liczby całkowite jako racjonalne o mianowniku 1.
  • Zgłoszenia, które podawałyby racjonalne liczby do wbudowanego LCM / GCD są dozwolone, ale nie konkurują.

Przypadki testowe

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

To jest , więc wygrane są przy użyciu najmniejszej ilości bajtów!

JungHwan Min
źródło
4
Uwaga: obliczenia LCM[numerators]/GCD[denominators]mogą nie działać, jeśli dane wejściowe zawierają nieskróconą liczbę wymierną. np 1/3, 2/8.
JungHwan Min
Więc jeśli go zmniejszę, zadziała?
Leaky Nun
@LeakyNun Tak, zrobi to.
JungHwan Min
Aby zachęcić ludzi do przesyłania niewbudowanych odpowiedzi, zredagowałem pytanie, dzięki czemu wbudowane odpowiedzi nie są konkurencyjne (nadal dozwolone). Jeśli jest to problem, wycofam swoją edycję.
JungHwan Min
Co z użyciem wbudowanego LCM, ale tylko z liczbami całkowitymi - konkurującymi czy nie?
Jonathan Allan

Odpowiedzi:

5

Galaretka , 19 bajtów

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

Wypróbuj online!

Leaky Nun
źródło
1
tfw Jelly ssie frakcje
Erik the Outgolfer
2
g/:@$€->:g/$€
Jonathan Allan
2
Zaoszczędź kolejne dwa bajty za pomocą::g/$€ZµḢæl/,Ḣg/$
Jonathan Allan
@JonathanAllan To niezły kawałek kodu ...
Erik the Outgolfer
6

J, 3 bajty, niekonkurujące.

*./

Biorąc pod uwagę listę racjonalnych danych wejściowych, składa się ona przez LCM.

zgrep
źródło
4

sed, 374 (373 + 1) bajtów

-EFlaga sed liczy się jako jeden bajt. Uwaga: jeszcze nie próbowałem grać w golfa i zapewne nie zrobię tego przez dłuższy czas.
Dane wejściowe przyjmowane są w jednostkowej, a dane wyjściowe w jednostkowej. Przestrzenie muszą otaczać każdą frakcję. Przykład: 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 *,/,

Wypróbuj online!

zgrep
źródło
4

Python 2 , 65 bajtów (niekonkurencyjny)

lambda x:reduce(lambda x,y:x*y/gcd(x,y),x)
from fractions import*

Wypróbuj online!

ovs
źródło
3

JavaScript (ES6), 85 bajtów

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

Nie szukaj wbudowanych! Bez wątpienia ktoś pokona to, stosując podejście rekurencyjne lub coś takiego.

Neil
źródło
3

Pari / GP , 3 bajty, niekonkurujące

lcm

Wypróbuj online!

alephalpha
źródło
@JungHwanMin Czy to znaczy, że wbudowany GCD jest dozwolony?
alephalpha
Słuszna uwaga. Tak, o ile dane wejściowe są tylko liczbami całkowitymi.
JungHwan Min
2

Perl 6 ,  46  42 bajtów

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

Sprawdź to

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

Sprawdź to

Dane wejściowe to lista liczb wymiernych .

Rozszerzony:

{ # 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
}
Brad Gilbert b2gills
źródło
2

Siatkówka , 117 bajtów

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

Wypróbuj online! Pobiera dane wejściowe jako serię niepoprawnych ułamków oddzielonych spacją (bez liczb całkowitych lub liczb mieszanych). Wyjaśnienie:

\d+
$*

Konwertuje liczbę dziesiętną na jedność.

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

To zmniejsza każdą frakcję do najniższych warunków. Grupa przechwytywania 1 reprezentuje GCD licznika i mianownika, dlatego liczymy liczbę przechwyceń przed i po /. \b(1+)+/(\1)+\bz jakiegoś powodu nie wydaje się poprawnie zliczać liczby przechwytywania, więc używam dodatkowej grupy przechwytywania i dodaję 1 do wyniku.

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

Robi to wiele rzeczy. Grupa przechwytywania 2 reprezentuje GCD liczników pierwszych dwóch frakcji, podczas gdy grupa przechwytywania 3 reprezentuje GCD mianowników. $#4jest zatem drugim licznikiem podzielonym przez ich GCD. (Ponownie nie mogłem liczby przechwyceń pierwszego licznika, ale muszę tylko podzielić jeden licznik przez ich GCD, więc nie kosztuje mnie to tak dużo.)

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

Teraz, gdy drugi licznik został podzielony przez ich GCD, po prostu używamy tego wyrażenia z jednorzędnego samouczka arytmetycznego, aby pomnożyć je razem, co daje LCM. Następnie powtarzamy ćwiczenie dla pozostałych ułamków.

1+
$.&

Konwertuje unary z powrotem na dziesiętne.

Neil
źródło
2

Common Lisp, 154 bajty

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

Używany algorytm (określony dla liczb całkowitych, ale działa również dla wymiernych).

Najpierw utwórz ze sobą asocjatywną listę danych wejściowych, aby śledzić początkowe wartości elementów, tak aby kolejność operacji była określona przez „samochód” z listy.

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

Przypadki testowe:

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

Uwaga: Rozwiązanie nie wymaga budowania lcmi gcdakceptuje liczby całkowite.

Renzo
źródło
W00t? Wypróbuj to na swojej REPL (/ (lcm 1 3 5 7) (gcd 2 4 6 8)).
Kaz
@Kaz, ponieważ, jak powiedziano w problemie, „Przesłanie danych racjonalnych do wbudowanego LCM / GCD jest dozwolone, ale nie konkuruje”.
Renzo
W kategoriach Lisp, ściśle mówiąc, w rzeczywistości nazywamy racjonalne, gdy dzwonimy (lcm 1 3 5 7), ponieważ liczby całkowite są podtypem racjonalnych, ale myślę, że reguła powinna wykluczać użycie a lcmlub, gcdktóry pozwala na racjonalne wprowadzanie danych.
Kaz
@Kaz, ops ... Źle zinterpretowałem zasady! Czy powinienem usunąć post? (może to nie jest dobry marketing dla Common Lisp :)
Renzo
Chciałbym tylko zauważyć, że jest to rozwiązanie bez użycia wbudowanej liczby całkowitej lcmi gcd.
Kaz
1

Mathematica, 3 bajty, niekonkurujące

LCM

Wbudowana LCMfunkcja Mathematica jest w stanie obsłużyć dane racjonalne.

JungHwan Min
źródło
3
Chociaż udzielenie odpowiedzi na własne pytanie jest w porządku, nie sądzę, że udzielenie odpowiedzi w rozwiązaniu, które ma realną szansę na wygraną, jest bardzo sportowe: P
Rozpad
@BetaDecay Tak ... Więc teraz nie konkuruje.
JungHwan Min
1

PHP , 194 bajty

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

-4 Bajty z PHP> = 7.1 [$n,$d]=$_GETzamiastlist($n,$d)=$_GET

Wypróbuj online!

Jörg Hülsermann
źródło
1

Common Lisp, 87 78 bajtów

Za pomocą lcmi gcd, które mają liczby całkowite:

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

Więcej golfa:

(defun l(a)(eval`(/(lcm,@(mapcar'numerator a))(gcd,@(mapcar'denominator a))))
Kaz
źródło