유리수의 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의 사용없이 lcmgcd정수에 동의.


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.