최소 공배수를 유지하면서 두 숫자를 공동 프라임으로 만듭니다.


20

이 양 개의 정수 감안 a하고 b, 출력이 양 개의 정수 cd그러한가 :

  • c 나누다 a
  • d 나누다 b
  • c그리고 d공동 프라임
  • 최소 공배수cd의 최소 공배수에 해당 a하고 b.

가능한 답변이 둘 이상인 경우 하나 또는 전부 만 출력 할 수 있습니다.

테스트 사례 :

 a  b  c  d
12 18  4  9
18 12  9  4
 5  7  5  7
 3  6  1  6 or 3 2
 9  9  9  1 or 1 9
 6 15  2 15 or 6 5
 1  1  1  1

이것은 입니다. 바이트 단위의 최단 답변이 이깁니다.


(1, LCM) 반납을 중지하려면 어떻게해야합니까?
Neil

1
@Neil d나누기 위한 요구 사항b
Leaky Nun

4
어쩌면 LCM을 정의하거나 약어를 사용해서는 안됩니다. 나는 무엇을 요구했는지 몰랐다.
밀 마법사

답변:


7

젤리 , 21 13 바이트

ÆEz®0iṂ$¦€ZÆẸ

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

만약 A = 2 · 3 B * 5 C · ...B = 2 α · 3 β · 5 γ · ... , 우리가 계산

  • c = 2 A> α? A : 0 · 3 B> β? B : 0 · 5 C> γ? C : 0 ·…

  • d = 2 A> α? 0 : α · 3 B> β? 0 : β · 5 C> γ? 0 : γ ·…

이제 lcm (c, d) = 2 max (A> α? A : 0, A> α? 0 : α) ·… = 2 max (A, α) · 3 max (B, β) ·… = lcm ( a, b)

GCD (c, d) = 2 분 (A> α A :? 0, A> 0 α : α) · 2 ... = 0 * 3 0 · 5 0 · ... = 1 .

, (c, d) = (a, b)에서 시작하십시오 . 그런 다음 각 소수에 대해 c 또는 d 의 인수 분해에서 해당 소수를 완전히 나눕니다 . (이 구현에서 넥타이의 경우 c 는 지수를 잃습니다.)

따라서 a = 2250 = 2 1 · 3 2 · 5 3 이고 b = 360 = 2 3 · 3 2 · 5 1 이면

다음, C = 2 0 * 3 0 · 5 3 = 125D = 2 3 · 3 2 * 5 0 = 72 .

Jonathan Allan은 무려 8 바이트를 기록했습니다! 감사합니다 ~


이것은 내 원래 알고리즘입니다 ... Perl 알고리즘이 더 좋습니다.
Leaky Nun

아주 좋아요 여기는 12 바이트입니다
Jonathan Allan

여기에 또 다른 12 byter입니다ÆEZ×Ụ’$€$ZÆẸ
마일

이것은 이제를 제공 [1,18]합니다 [15,18]. 초기 버전은 정답 ( [5,18])을 반환했습니다 .
Arnauld

1
아-네, 조옮김에 0의 필러가 필요합니다. ÆEz®0iṂ$¦€ZÆẸ13의 속임수를 써야합니다.
Jonathan Allan

4

R, 143 (139) 123 바이트

f=function(a,b,q=1:(a*b))for(i in 1:a)for(j in 1:b)if(!a%%i+b%%j&max(q[!i%%q+j%%q])<2&i*j==min(q[!q%%a+q%%b]))cat(i,j,"\n")

(19 바이트를 해제 한 @Giuseppe에게 감사드립니다!)

들여 쓰기, 줄 바꿈 및 일부 설명 :

f=function(a,b,
           q=1:(a*b)) #Defined as function arguments defaults to avoid having to use curly brackets
    for(i in 1:a)
        for(j in 1:b)
            if(!a%%i + b%%j & #Is a divided by c and b divided by d
               max(q[!i%%q+j%%q])<2 & #Are c and d coprimes
               i*j==min(q[!q%%a+q%%b])) #Is this the same lcm
                   cat(i,j,"\n") #Then print

테스트 사례 :

> f=function(a,b,q=1:(a*b))for(i in 1:a)for(j in 1:b)if(!a%%i+b%%j&max(q[!i%%q+j%%q])<2&i*j==min(q[!q%%a+q%%b]))cat(i,j,"\n")
> f(5,7)
5 7 
> f(12,18)
4 9 
> f(6,15)
2 15 
6 5 
> f(1,1)
1 1 

!보다 우선 순위가 &하고 |이상하지만 낮은 +*; 그런 식으로 몇 바이트를 줄이십시오. 즉, !i%%q&j%%q동등해야한다!i%%q+j%%q
주세페

1
잘 관찰하십시오 : GCD(c,d)==1그렇다면 LCM(c,d)==c*d. 그래서 우리는 후자가 ... 이후 GCD(c,d)==1인지 테스트 하고 확인할 수 있습니다 .c*d==a*b/GCD(a,b)LCM(a,b)
Giuseppe

1
과연! (계산 a*b/GCD(a,b)은보다 짧지 않습니다 LCM(a,b)).
plannapus

120 바이트 -익명 함수 + -3 바이트에 대한 리터럴 개행
Giuseppe

4

껍질 , 10 바이트

→ÖF§-⌋⌉ΠmḊ

무차별 대입 목록을 가져오고 반환하며 둘 이상의 숫자에도 적용됩니다. 온라인으로 사용해보십시오!

설명

→ÖF§-⌋⌉ΠmḊ  Implicit input, say [6,15]
        mḊ  Map divisors: [[1,2,3,6],[1,3,5,15]]
       Π    Cartesian product:[[1,1],[2,1],[1,3],[2,3],[3,1],[1,5],[3,3],[6,1],[1,15],[2,5],[3,5],[6,3],[2,15],[6,5],[3,15],[6,15]]
 Ö          Sort by
  F         reduce by
     ⌉      lcm
   -⌋       minus gcd: [[1,1],[3,3],[2,1],[1,3],[3,1],[6,3],[1,5],[2,3],[6,1],[2,5],[3,15],[1,15],[3,5],[6,15],[2,15],[6,5]]
→           Get last element: [6,5]

3

수학, 82 바이트

#&@@Select[Subsets[Flatten@Divisors[{t=#,r=#2}],{2}],GCD@@#==1&&LCM@@#==t~LCM~r&]&

확실하지 않지만 바이트를 저장하는 Select[...][[1]]대신 목록 색인을 사용할 수 First@Select[...]없습니까?
Jonathan Frech

그렇습니다. 그러나 하나를 더 절약하기 위해 #&@@대신 사용할 수 있습니다. [[1]];-)
J42161217

3

자바 스크립트 (ES6), 90 84 80 바이트

카레 구문으로 입력을 받아서 (a)(b)2 개의 정수 배열을 반환합니다.

a=>g=(b,c=1)=>(G=(a,b)=>b?G(b,a%b):a)(c,d=a*b/G(a,b)/c)-1|a%c|b%d?g(b,c+1):[c,d]

테스트 사례

방법?

a =>                            // a = first input
  g = (                         // g = recursive function that takes:
    b,                          //   b = second input
    c = 1                       //   c = first output divisor, initially set to 1
  ) =>                          //
    (G = (a, b) =>              // G = function that takes a and b
      b ? G(b, a % b) : a       //     and returns the greatest common divisor
    )(                          // we call it with:
      c,                        //   - c
      d = a * b / G(a, b) / c   //   - d = LCM(a, b) / c = a * b / GCD(a, b) / c
    ) - 1 |                     // if the result is not 1 (i.e. c and d are not coprime)
    a % c |                     // or c does not divide a
    b % d ?                     // or d does not divide b:
      g(b, c + 1)               //   do a recursive call with c + 1
    :                           // else:
      [c, d]                    //   return [c, d], a valid factorization of the LCM


3

하스켈 ,50 48 47 45 42 바이트

(?)=gcd;a!b|c<-div a$a?b=(c*c?b,div b$c?b)

아이디어 : 나는 그것을 알아 차렸다 c*d = a*b/gcd(a,b). 따라서 알고리즘은 두 단계를 수행합니다.

  1. 로 시작 c' = a/gcd(a,b)하고 d' = b. 이 충족 것을 제외하고 모든 요구 사항 c'd'공동 프라임해야합니다.
  2. 나는 계산, 그들이 공동 프라임 만들려면 e = gcd(c',d')다음 설정 c = c'*e하고 d = d'/e. (결합 된 요소는 동일하게 유지 때문에)이 모든 속성을 유지하지만 내가 모든 공유 요소를 제거하기 때문에 d, 나는하게 c하고 d서로 소.

내 구현에서는 c'이라고 c합니다.

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

Laikoni 덕분에 -3 바이트


패턴 가드를 사용하여 바인드 c하면 3 바이트가 절약됩니다. 온라인으로 사용해보십시오!
Laikoni

@ Laikoni Ooh, 나는 그 트릭조차 몰랐다. 감사!
Sacchan


2

R , 126 바이트

function(a,b,g=function(x,y)ifelse(o<-x%%y,g(y,o),y),l=a*b/g(a,b))matrix(c(C<-(1:l)[!l%%1:l],D<-l/C),,2)[g(C,D)<2&!a%%C+b%%D,]

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

이것은 다른 R answer와 다른 값을 찾는 데 다른 (그리고 명백하게 덜 골프적인) 접근법을 취합니다 .

설명:

function(a,b){
 G <- function(x,y)ifelse(o<-x%%y,G(y,o),y) #gcd function, vectorized for x,y
 l <- a*b/g(a,b)                            #lcm of a,b
 C <- (1:l)[!l%%1:l]                        #divisors of l
 D <- l/C                                   #l/C is the other half of the pair
 rel_prime <- G(C, D) < 2                   #pairs where C,D are relatively prime, lol, GCD
 a_div <- !a%%C                             #divisors of a
 b_div <- !b%%D                             #divisors of b
 C <- C[rel_prime & a_div & b_div]
 D <- D[rel_prime & a_div & b_div]          #filter out the bad pairs
 matrix(c(C,D),,ncol = 2)                   #matrix of pairs, returned
}

모든 정의를 기본 인수로 지정하고 골퍼를 위해 한 줄로 모든 계산을 수행합니다.



2

하스켈 , 91 74 바이트

a!b=[(x,y)|x<-[1..a],y<-[1..b],rem a x+rem b y+gcd x y<2,lcm a b==lcm x y]

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

저장된 17 Laikoni 덕분 바이트


1
u*v`div`gcd u v바이트를 저장합니다.
Lynn

내장 lcm기능 을 사용하지 않는 이유가 있습니까?
Laikoni

또한 rem a x+rem b y+gcd x y<2작동해야합니다.
Laikoni

@ Laikoni 아주 좋은 이유 : 나는 내장이 lcm존재 하는지도 몰랐다 . rem a x+rem b y+gcd x y<2작동하고 작동하는지 궁금 rem a x+rem b y+gcd x y+lcm a b-lcm x y<2 합니다. 아마 (수학적) 보장 이 있을 것 입니다 lcm a b>=lcm x y.
jferard

1
실제로, lcm a b>=lcm x y1. 있기 때문에 x=x1*...*xi(주요 분해) y=y1*...yj, lcm x y=z1*...*zk여기서 z1,...,zk공통적으로 x1,...,xiy1,...,yj. 2. a=u1*...*um*x1*...*xi(프라임 분해), 및에 공통적 b=v1*...vn*y1*...yjlcm a b=t1*...*tl곳 . 그것은 그 명백 포함 하여, . 그러나 그것은 조건을 요약하여 쓰는 데 유용하지 않습니다. t1,...,tlu1*...*um*x1*...*xiv1*...vn*y1*...yjt1,...,tlz1,...,zklcm a b>=lcm x y
jferard


1

파이썬 3 , 129 바이트

lambda a,b:[[c,d]for c in range(1,-~a)for d in range(1,-~b)if((gcd(c,d)<2)*a*b/gcd(a,b)==c*d/gcd(c,d))>a%c+b%d]
from math import*

온라인으로 사용해보십시오! 또는 테스트 스위트를 사용해보십시오.

가능한 모든 조합을 중첩 목록 형태로 출력합니다.


3
당신과 당신의 비트 물건 ... -~a그리고는 -~b것처럼 다시 쓸 수 a+1b+1가독성을 위해 : P
스티븐

1
@Stephen 보시다시피 난독 화를
Mr. Xcoder

새로 추가 한 두 번째 테스트 케이스에서는 작동하지 않습니다.
Leaky Nun

@LeakyNun 롤백되었습니다. 골프의 유효성을 확인할 시간이 없었습니다.
Mr. Xcoder

1

젤리 ,  19 15  14 바이트

Leaky Nun의 포인터가있는 -4 (제수 내장 기능 사용)

나는 이것이 실제로 이것을하는 방법이 아니라는 것을 거의 100 % 확신하지만 여기에 첫 번째 시도가 있습니다.
누가 7-8 초로 누가 그것을 능가하는지 봅시다!
그렇다 ... 설명과 함께 린의 대답 을보십시오!

g/־l/
ÆDp/ÇÐṂ

두 숫자의 목록을 가져와 가능성 목록을 반환하는 모나드 링크.

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

방법?

g/־l/  - Link: gcd divided by lcm: list [x, y]
g/      - reduce by gcd = gcd(x, y)
   æl/  - reduce by lcm = lcm(x,y)
  ÷     - divide

ÆDp/ÇÐṂ - Main link: list [a, b]    e.g. [160, 90]
ÆD      - divisors (vectorises)          [[1,2,4,5,8,10,16,20,32,40,80,160],[1,2,3,5,6,9,10,15,18,30,45,90]]
  p/    - reduce by Cartesian product    [[1,1],[1,2],...,[1,90],[2,1],[2,2],...,[2,90],....,[160,90]]
     ÐṂ - entries for which this is minimal:
    Ç   -   call the last link (1) as a monad

누가 7-8 초로 누가 그것을 능가하는지 봅시다! -그렇게 생각하지 마십시오 ...
Mr. Xcoder

여섯 생각? ...다섯?!
Jonathan Allan

: P 아니요. ~ 13-15 이하가 가능하다고 생각하지 않습니다 (Dennis는 물론 동의하지 않습니다!)
Mr. Xcoder

제수 내장?
Leaky Nun

그래 ÆD, 그러나 (으 rug 거리는) 두뇌는 분명히 기어가 아닌 ...
Jonathan Allan

1

펄 6 , 72 바이트

{([X] map {grep $_%%*,1..$_},@^a).grep:{([lcm] @a)==([lcm] $_)==[*] $_}}

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

목록을 가져옵니다 (a, b). 가능한 모든 목록 (c, d)의 목록을 반환합니다.

설명:

-> @ab {
    # Generate all pairs (c, d)
    ([X]
         # where c divides a and d divides b.
         map { grep $_%%*, 1..$_ }, @ab)
    # Only keep pairs with lcm(a, b) = lcm(c, d) and lcm(c, d) = c * d.
    # The latter implies gcd(c, d) = 1.
    .grep: { ([lcm] @ab) == ([lcm] $_) == [*] $_ }
}


1

파이썬 2 + sympy , 148 바이트

from sympy import*
a,b=input()
c=d=z=1
while(a/c*c+b/d*d<a+b)+gcd(c,d)-1+(lcm(c,d)!=lcm(a,b)):E=c==d==z;Q=c==z;d=+E or Q+d;c=+Q or-~c;z+=E
print c,d

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

Jonathan Frech 에게 -1 감사합니다 .

이 답변하여, 파이썬 2 (하지 파이썬 3)에서 작동 sympy.gcd하고 sympy.lcm대신 math.gcd하고 math.lcm있는 파이썬 3에서만 사용할 수 있습니다 그리고 네,이 폭력입니다 :)


골프 진행 중 ...
Outgolfer Erik

당신은 정의하여 바이트를 저장할 수 있습니다 Q=c==z;While 루프의 시작 (7 바이트) 및 교체 or(c==z)+d와 함께 or Q+d(-4 바이트)과 c=+(c==z)orc=+Q or(-4 바이트). ( TIO )
Jonathan Frech

질문으로, +연산자 를 사용 d=+E하거나 c=+(c==z)부울을 정수로 변환합니까?
Jonathan Frech

당신이 사용할 수 없기 때문에 @JonathanFrech 그래, 난, 오전 TrueFalse대신 10sympy에.
아웃 골퍼 에릭

그것이 바닐라 +...가 사용 하는 곳을 본 첫 번째 사례 입니다.
Jonathan Frech

1

젤리 , 13 바이트

Ụ€’×
ÆEz0ÇZÆẸ

온라인으로 사용해보십시오! 나의 첫번째 젤리 답변! 편집 : ÆEz0µỤ€’×µZÆẸ13 바이트에도 작동합니다. 설명:

ÆE              Get prime factor exponents of both values (vectorises)
  z0            Zip but fill the shorter array with 0
    µ           New monadic link
     Ụ€         Grade up each pair (1-indexed)
       ’        Convert to 0-indexing (vectorises)
        ×       Multiply each pair by its grade (vectorises)
         µ      New monadic link
          Z     Zip back into separate lists of prime factor exponents
           ÆẸ   Turn prime exponent lists back into values (vectorises)

1

PARI / GP, 86 바이트

이것은 Lynn이 그녀의 대답에서 말한 것을 수행합니다.

f(a,b)=forprime(p=2,a*b,v=valuation(a,p);w=valuation(b,p);if(w<v,b/=p^w,a/=p^v));[a,b]

f(a,b)=부분을 세지 않으면 79 바이트입니다.


1

05AB1E , 32 26 24 22 20 19 바이트

Ó0ζεD`›0sǝ}øεā<ØsmP

온라인으로 사용해보십시오! 나는 아직도이 언어로 쓰는 법을 모른다. 그러나 적어도 그것은 무차별 대입 알고리즘이 아니다. 설명:

Ó                       Get exponents of prime factors (vectorised)
 0ζ                     Zip, filling with 0
   ε      }             For each prime
    D`                  Extract the pair of exponents
      ›0sǝ              Overwrite the smaller with 0
           ø            Zip back into two lists of prime exponents
            ε           For each list (} implied)
             ā<Ø        Get a list of primes
                sm      Raise each prime to the exponent
                  P     Take the product

뭐하는거야?
Lynn

당신과 동일하지만 실제로 지수를 분해하고 비교하고 요인을 재조합하여.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.