Lặp lại thao tác GCD này


19

Vấn đề A3 từ cuộc thi Putnam 2008 nói:

một1,một2,Giáo dục,mộtnj<kmộtjmộtkmộtjmộtkgcd(mộtj,mộtk)lcm(mộtj,mộtk)

Mục tiêu của bạn trong thử thách này là lấy một chuỗi hữu hạn các số nguyên dương làm đầu vào và đưa ra kết quả của việc lặp lại quá trình này cho đến khi không thể tiến triển thêm nữa. (Nghĩa là, cho đến khi mọi số trong chuỗi kết quả chia tất cả các số xuất hiện sau nó.) Bạn không cần phải giải bài toán Putnam.

Đây là : giải pháp ngắn nhất trong mọi ngôn ngữ lập trình đều thắng.

Các trường hợp thử nghiệm

[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
Thật là một vấn đề gọn gàng! Viết mỗi số nguyên dưới dạng và lưu ý rằng quy trình chỉ đơn giản là sắp xếp bong bóng các danh sách trong song song :)mộttôi2αtôi3βtôi5γtôiα,β,γ,Giáo dục
Lynn

Câu trả lời:


12

Thạch , 9 byte

ÆEz0Ṣ€ZÆẸ

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Æ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 byte

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

Hãy thử trực tuyến!

Có lẽ câu trả lời J đầu tiên trên PPCG sử dụng &.hai lần. Sau này và đó , tôi bắt đầu cảm thấy như một hacker J kỳ lạ.

Về cơ bản là một bản dịch từ câu trả lời của Dennis 'Jelly .

Làm thế nào nó hoạt động

/:~"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

Một cái trước đó ở đây
FrownyFrog

5

Ngôn ngữ Wolfram (Mathicala) , 44 byte

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

kk

bk= =gcd({lcm(mộttôi1,,mộttôik)|1tôi1<<tôikn})

Hãy thử trực tuyến!


Rất đẹp! Bạn là hai trong hai cách tiếp cận kỳ lạ mà tôi không thấy sắp tới :)
Misha Lavrov

5

Python 3 , 103 byte

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)

Hãy thử trực tuyến!

Giải trình

Vấn đề này thực chất là một loại sắp xếp song song trên các thừa số nguyên tố và (gcd (a, b), lcm (a, b)) tương tự như (min (a, b), max (a, b)). Vì vậy, hãy nói về mặt sắp xếp.

Chúng tôi sẽ chứng minh bằng cảm ứng rằng sau f (i, j), [i] trở thành giá trị nhỏ nhất trong (giá trị cũ của) L, trong đó L là phạm vi giữa một [i] và [j], bao gồm cả hai đầu . Và nếu j = -1, f (i, j) sẽ sắp xếp phạm vi L.

Trường hợp khi L chứa một phần tử là tầm thường. Đối với khiếu nại đầu tiên, lưu ý rằng nhỏ nhất của L không thể ở trong [j] sau khi hoán đổi, vì vậy f (i, j-1) sẽ đặt nó vào [i] và f (i + 1, - 1) sẽ không ảnh hưởng đến nó.

Đối với xác nhận thứ hai, lưu ý rằng [i] là giá trị nhỏ nhất và f (i + 1, -1) sẽ sắp xếp các giá trị còn lại, do đó L sẽ được sắp xếp sau f (i, j).


3

Võng mạc , 65 byte

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

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm nhanh hơn. Giải trình:

\d+
*

Chuyển đổi sang unary.

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

Khớp lặp lại: bất kỳ số nào có một yếu tố, sau đó một số sau đó không chia hết cho số đầu tiên nhưng chia hết cho số đó.

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

$1là số đầu tiên. $2là yếu tố. Bởi vì regex là tham lam, đây là yếu tố lớn nhất tức là gcd. $4là một phần của trận đấu giữa các số ban đầu. $5là số thứ hai. $#3(theo số thập phân chứ không phải đơn nguyên) là một ít hơn $1chia cho $2, vì nó không bao gồm bản gốc $2. Điều này có nghĩa là để tính lcm, chúng ta cần nhân $5với một số nhiều hơn $#3số được viết ngắn gọn nhất là tổng $5và sản phẩm của $#3$5.

_+
$.&

Chuyển đổi thành số thập phân.


Unary được cho phép theo mặc định cho Retina , vì vậy bạn có thể tính số này là 52 byte.
Dennis

@Dennis Chỉ có ba câu trả lời Retina của tôi có đầu vào là unary; Tôi đã quen với việc thực hiện I / O theo số thập phân.
Neil

3

05AB1E , 10 byte

Tín dụng cho cách tiếp cận đi đến alephalpha .

εIæN>ù€.¿¿

Hãy thử trực tuyế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

JavaScript (SpiderMonkey) , 69 byte

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)

Hãy thử trực tuyến!

  • Hàm lgán lcm(p,q)cho a[j]và gán gcd(p, q)cho qnếu j > i, nếu không thì giữ mọi thứ không thay đổi.
    • lcm(p,q) = if p%q=0 then p else p*lcm(q,p%q)/(p%q)

Câu trả lời cũ:

JavaScript (SpiderMonkey) , 73 byte

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)

Hãy thử trực tuyến!

  • Hàm gtính toán gcd(u, v)và gán giá trị trả về cho u.

2

05AB1E , 15 14 13 byte

Ó¾ζ€{øεgÅpymP

Cổng của @ Dennis ♦ 'Câu trả lời Jelly , nhưng thật không may, 05AB1E không có phần mềm dựng sẵn, do đó mất hơn một nửa chương trình .. :(
-1 byte nhờ @ Mr.Xcoder .
-1 byte nhờ vào @Enigma .

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

Ó          # 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
Ồ, tôi đã không thấy câu trả lời của bạn trước khi đăng bài của riêng tôi, lol. 14 byte bằng cách sử dụng ¾và loại bỏ , +1. (Tôi đã thử điều này trước đây vì tôi đã cố gắng chuyển câu trả lời của Dennis cũng như lol)
Ông Xcoder

1
Sử dụng εgÅpymPsẽ tiết kiệm byte khác so với một ông Xcoder metioned
Emigna

@ Mr.Xcoder Ồ, không biết có sự khác biệt giữa filler với 0¾. Cần nhớ điều đó! Trên thực tế, tôi sẽ thêm nó vào các mẹo 05AB1E nhỏ của mình ngay bây giờ. :)
Kevin Cruijssen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.