유리수의 LCM


18

숫자 집합의 최소 공배수 (LCM)는 A정수 작을 b그러한 b/a모든 정수의 정수 a에서 A. 이 정의는 합리적인 수로 확장 될 수 있습니다!

직무

작은 긍정적 찾기 합리적 b 그러한 b/a입니다 정수 모든 유리수 a 의 입력에 있습니다.

규칙

  • 표준 허점은 금지되어 있습니다.
  • 입력에서 분자와 분모를 따로 가져갈 수는 있지만, 두 배나 실수는 취할 수 없습니다.
  • 입력이 완전히 줄어들지 않을 수 있습니다.
  • 의 분모를 가진 정수로 정수 입력을 취할 수 있습니다 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

그래서 그것을 줄이면 작동합니까?
— Leaky Nun

@LeakyNun 네, 그렇습니다.
— JungHwan Min

사람들이 기본이 아닌 답변을 제출하도록 장려하기 위해 질문을 편집하여 기본 답변을 비경쟁으로 만들었습니다 (여전히 허용됨). 이것이 문제인 경우 편집을 롤백합니다.
— JungHwan Min

LCM 내장은 사용되지만 정수만 사용하는 것은 어떻습니까?
— Jonathan Allan

답변:



6

J, 3 바이트, 비경쟁.

*./

합리적인 입력 목록이 주어지면 LCM이 접 힙니다.


4

sed, 374 (373 + 1) 바이트

sed의 -E플래그는 1 바이트로 계산됩니다. 참고 : 아직 골프를 시도하지 않았으며 아마도 한동안은하지 않을 것입니다.
입력은 단항으로 이루어지고 출력은 단항으로 이루어집니다. 공백은 모든 분수를 둘러싸 야합니다. 예 : 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

자바 스크립트 (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

펄 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+
$*

10 진수를 단항으로 변환합니다.

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

단항을 다시 10 진수로 변환합니다.


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

사용 된 알고리즘 (정수에는 지정되었지만 유리수에도 적용됨).

먼저 입력 데이터의 연관 목록을 자체와 연관시켜 요소의 초기 값을 추적하므로 목록의 "car"에 의해 조작 순서가 제공됩니다.

(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

참고 :이 솔루션이 (가) builting의 사용없이 lcm및 gcd정수에 동의.


W00t? REPL에서 시도하십시오 (/ (lcm 1 3 5 7) (gcd 2 4 6 8)).
— Kaz

@Kaz는 문제에서 말했듯이“LCM / GCD 내장에 합리적인 수를 제공하는 제출은 허용되지만 경쟁이되지 않습니다”.
— Renzo

엄격히 말하면 Lisp 용어에서 (lcm 1 3 5 7)정수를 합리적의 하위 유형이므로 실제로 호출 할 때 합리성을 제공하지만 규칙은 합리적 입력을 허용 하는 lcm또는의 사용을 배제해야한다고 생각합니다 gcd.
— Kaz

@Kaz, ops ... 나는 규칙을 잘못 해석했다! 게시물을 삭제해야합니까? (아마도 Common Lisp의 좋은 마케팅이 아닙니다.)
— Renzo

이 사용 내장 된 정수가없는 해결책이 난 그냥 메모에 넣어 것 lcm하고 gcd.
— Kaz

1

Mathematica, 3 바이트, 비경쟁

LCM

Mathematica의 내장 LCM기능 은 유리수 입력을 처리 할 수 ​​있습니다.


3
자신의 질문에 대답하는 것은 좋지만 실제로 이길 가능성이 매우 높은 솔루션으로 대답하는 것이 매우 스포츠 적이라고 생각하지 않습니다. : P
— Beta Decay

@BetaDecay Yep ... 이제 경쟁이 아닙니다.
— JungHwan Min

1

PHP , 194 바이트

<?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> = 7.1 [$n,$d]=$_GET대신 -4 바이트list($n,$d)=$_GET

온라인으로 사용해보십시오!


1

공통 리스프, 87 78 바이트

정수 입력이있는 lcm및 사용 gcd:

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

더 골프 :

(defun l(a)(eval`(/(lcm,@(mapcar'numerator a))(gcd,@(mapcar'denominator a))))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.