이 GCD 작업을 반복하십시오


19

2008 Putnam 경쟁의 A3 문제 는 다음과 같습니다.

유한 시퀀스 의 양의 정수로 시작하십시오. 가능 하면 가 나누지 않도록 두 개의 인덱스 선택 하고 및 를 각각 및 \ text {lcm} (a_j, a_k)로 바꾸십시오 . 이 프로세스가 반복되면 결국 중지해야하며 최종 시퀀스는 선택한 사항에 따라 달라지지 않습니다.a1,a2,,anj<kajakajakgcd(aj,ak)lcm(aj,ak)

이 과제의 목표는 한정된 양의 정수 정수를 입력으로 사용하여 더 이상 진행할 수 없을 때까지이 프로세스를 반복 한 결과를 출력하는 것입니다. (즉, 결과 시퀀스의 모든 숫자가 그 뒤에 오는 모든 숫자를 나눌 때까지입니다.) Putnam 문제를 해결할 필요는 없습니다.

이것은 . 모든 프로그래밍 언어에서 가장 짧은 솔루션이 승리합니다.

테스트 사례

[1, 2, 4, 8, 16, 32] => [1, 2, 4, 8, 16, 32]
[120, 24, 6, 2, 1, 1] => [1, 1, 2, 6, 24, 120]
[97, 41, 48, 12, 98, 68] => [1, 1, 2, 4, 12, 159016368]
[225, 36, 30, 1125, 36, 18, 180] => [3, 9, 18, 90, 180, 900, 4500]
[17, 17, 17, 17] => [17, 17, 17, 17]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] => [1, 1, 1, 1, 1, 2, 2, 6, 60, 2520]

9
정말 깔끔한 문제입니다! 각 정수 ai2αi3βi5γi 프로세스는 단순히 \ alpha, \ beta, \ gamma, \ dots 목록을 버블 정렬합니다 α,β,γ,. 병렬 :)
Lynn

답변:


12

젤리 , 9 바이트

ÆEz0Ṣ€ZÆẸ

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

작동 원리

ÆEz0Ṣ€ZÆẸ  Main link. Argument: A (array)

ÆE         For each n in A, compute the exponents of n's prime factorization.
           E.g., 2000000 = 2⁷3⁰5⁶ gets mapped to [7, 0, 6].
  z0       Zip 0; append 0's to shorter exponent arrays to pad them to the same
           length, then read the resulting matrix by columns.
    Ṣ€     Sort the resulting arrays (exponents that correspond to the same prime).
      Z    Zip; read the resulting matrix by columns, re-grouping the exponents by
           the integers they represent.
       ÆẸ  Unexponents; map the exponent arrays back to integers.


5

J , 17 바이트

/:~"1&.|:&.(_&q:)

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

아마도 PPCG의 첫 번째 J 답변은 &.두 번 사용할 것 입니다. 이것과 저것 후에 , 나는 이상한 J 해커처럼 느끼기 시작했다.

기본적으로 Dennis 'Jelly 의 번역입니다 .

작동 원리

/:~"1&.|:&.(_&q:)  Single monadic verb.
           (_&q:)  Convert each number to prime exponents
                   (automatically zero-filled to the right)
       |:&.        Transpose
/:~"1&.            Sort each row in increasing order
       |:&.        Transpose again (inverse of transpose == transpose)
           (_&q:)  Apply inverse of prime exponents; convert back to integers

더 이른 것은 여기에있다
FrownyFrog 9

5

Wolfram Language (Mathematica) , 44 바이트

Table[GCD@@LCM@@@#~Subsets~{i},{i,Tr[1^#]}]&

결과 의 번째 요소는 요소 를 부분 집합의 LCM의 GCD입니다 .kk

bk=gcd({lcm(ai1,,aik)|1i1<<ikn})

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


아주 좋아요! 당신이있는 거 두 내가 :) 오는 보지 않았다 이상한 접근에 두
미샤 라브 로프

5

파이썬 3 , 103 바이트

import math
def f(a,i=0,j=-1):d=math.gcd(a[i],a[j]);a[j]*=a[i]//d;a[i]=d;a[i:j]and f(a,i,j-1)==f(a,i+1)

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

설명

이 문제는 본질적으로 소인수에 대한 병렬 정렬이며 (gcd (a, b), lcm (a, b))는 (min (a, b), max (a, b))와 유사합니다. 정렬에 관해 이야기 해 봅시다.

f (i, j) 후에 a [i]는 (이전 값) L에서 가장 작은 값이되며 L은 a [i]와 a [j] 사이의 범위이며 양쪽 끝을 포함합니다. . 그리고 j = -1이면 f (i, j)는 범위 L을 정렬합니다.

L에 하나의 요소가 포함 된 경우는 사소합니다. 첫 번째 주장의 경우 스왑 후 L의 가장 작은 L은 a [j]에 머무를 수 없으므로 f (i, j-1)은 a [i]에 넣고 f (i + 1,- 1) 영향을 미치지 않습니다.

두 번째 클레임의 경우 a [i]가 가장 작은 값이고 f (i + 1, -1)이 나머지 값을 정렬하므로 L은 f (i, j) 뒤에 정렬됩니다.


3

레티 나 , 65 바이트

\d+
*
+`\b((_+)(\2)+)\b(.*)\b(?!\1+\b)(\2+)\b
$2$4$5$#3*$5
_+
$.&

온라인으로 사용해보십시오! 링크에는 더 빠른 테스트 사례가 포함됩니다. 설명:

\d+
*

단항으로 변환합니다.

+`\b((_+)(\2)+)\b(.*)\b(?!\1+\b)(\2+)\b

반복적으로 일치 : 인수가있는 숫자, 그 다음 숫자는 첫 번째 숫자로 나눌 수 없지만 인수로 나눌 수있는 숫자입니다.

$2$4$5$#3*$5

$1첫 번째 숫자입니다. $2요인입니다. 정규 표현식이 욕심 많기 때문에 이것이 gcd와 같은 가장 큰 요소입니다. $4원래 숫자 사이의 일치 부분입니다. $5두 번째 숫자입니다. $#3(단항이 아닌 십진수)는 original을 포함하지 않기 때문에 $1로 나눈 것보다 작은 것 입니다. 우리는 곱셈에 필요한 LCM을 계산하기 위해이 방법 보다 하나는보다 있는 가장 succintly의 합으로 작성 및 제품 과 .$2$2$5$#3$5$#3$5

_+
$.&

십진수로 변환합니다.


기본적으로 단항은 Retina에 허용 되므로 52 바이트로 계산할 수 있습니다.
Dennis

@Dennis 단 3 개의 Retina 답변 만 단항으로 입력됩니다. 나는 10 진수로 I / O를하는 데 익숙해졌습니다.

3

05AB1E , 10 바이트

접근에 대한 크레딧은 alephalpha 로갑니다 .

εIæN>ù€.¿¿

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

εIæN>ù€.¿¿     Full program. Takes a list from STDIN, outputs another one to STDOUT.
ε              Execute for each element of the input, with N as the index variable.
 Iæ            Powerset of the input.
   N>ù         Only keep the elements of length N+1.
      €.¿      LCM each.
         ¿     Take the GCD of LCMs.


2

자바 스크립트 (SpiderMonkey) , 69 바이트

a=>a.map((q,i)=>a.map(l=(p,j)=>a[j]=j>i&&(t=p%q)?p/t*l(q,j,q=t):p)|q)

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

  • 기능 l할당 lcm(p,q)a[j], 그리고 할당 gcd(p, q)q하는 경우는 j > i, 그렇지 않으면 모든 변경 유지합니다.
    • lcm(p,q) = if p%q=0 then p else p*lcm(q,p%q)/(p%q)

이전 답변 :

자바 스크립트 (SpiderMonkey) , 73 바이트

a=>a.map((u,i)=>a.map((v,j)=>i<j?a[j]*=u/(g=p=>p%u?g(u,u=p%u):u)(v):0)|u)

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

  • 함수는를 g계산 gcd(u, v)하고 반환 값을 할당합니다 u.

2

05AB1E , 15 14 13 바이트

Ó¾ζ€{øεgÅpymP

포트의 데니스 ♦ @ '젤리 대답 ,하지만 그 이등분보다 더 많은 프로그램을한다, 그래서 불행하게도 05AB1E는 Unexponents - 내장이없는 .. :(
-1 바이트 감사 @ Mr.Xcoder .
-1 바이트 감사 @Enigma .

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

Ó          # Prime exponents of the (implicit) input-list
 ¾ζ        # Zip, swapping rows and columns, with integer 0 as filler
   €{      # Sort each inner list
     ø     # Zip, swapping rows and columns again
ε          # Map each inner list:
 gÅp       #  Get the first `l` primes, where `l` is the size of the inner list
    ym     #  Take the power of the prime-list and inner list
      P    #  And then take the product of that result
           # (And output implicitly)

1
오, 내 자신의 롤을 게시하기 전에 당신의 대답을 보지 못했습니다. , +1 을 사용 및 제거 하여 14 바이트 . (나는 데니스의 대답뿐만 아니라 lol를 포팅하려고 시도했기 때문에 이것을 시도했다)¾
Mr. Xcoder

1
사용하여 εgÅpymP하나 이상의 다른 바이트를 절약 할 수 씨 Xcoder이 metioned
Emigna

Mr.Xcoder 오 @의와 필러 사이의 차이가 알고하지 않았다 0및이 ¾. 기억해야합니다! 실제로 지금은 작은 05AB1E 팁에 추가하겠습니다. :)
Kevin Cruijssen의
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.