このGCD操作を繰り返します


19

2008年のパトナム大会の問題A3 は次のように述べています。

正の整数の有限シーケンスから始めます。可能であれば、が分割しないように2つのインデックス選択し、とをそれぞれとでます。このプロセスが繰り返される場合、最終的に停止する必要があり、最終的なシーケンスは行われた選択に依存しないことを証明します。a1a2anj<kajakajakgcd(aj,ak)lcm(aj,ak)

このチャレンジでの目標は、入力として正の整数の有限シーケンスを取得し、それ以上の進行が不可能になるまでこのプロセスを繰り返した結果を出力することです。(つまり、結果のシーケンスのすべての数値が、その後に続くすべての数値を分割するまでです。)パトナムの問題を解決する必要はありません。

これはです。すべてのプログラミング言語で最短のソリューションが勝ちます。

テストケース

[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
なんて素敵な問題でしょう!各整数を記述し、プロセスがリスト単にバブルソートすることに注意してください。並行して:)ai αβγ...2αi3βi5γiα,β,γ,
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:)

オンラインでお試しください!

おそらく、&.2回使用するPPCGの最初のJ回答。この後とすることを、私は奇妙なJハッカーのように感じるように始めています。

基本的にデニスのゼリーの答えからの翻訳。

使い方

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

5

Wolfram言語(Mathematica)、44バイト

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

kk

bk=gcd{lcma1ak|11<<kn}

オンラインでお試しください!


非常に素晴らしい!あなた私は:)来て見ていない奇妙なアプローチ上の2つの用だ2
ミーシャラブロフ

5

Python 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に1つの要素が含まれる場合は簡単です。最初のクレームでは、最小のLはスワップ後a [j]に留まることができないため、f(i、j-1)はそれをa [i]に入れ、f(i + 1、- 1)影響はありません。

2番目のクレームでは、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は元の番号間の一致の一部です。$52番目の数字です。$#3(単項ではなく小数で)は、元のを含まないため、$1除算より1つ小さくなります。これは、私たちが乗算に必要LCM計算するために、複数によって最もsuccintlyの和として書かれているとの積とします。$2$2$5$#3$5$#3$5

_+
$.&

10進数に変換します。


Retinaではデフォルトで単項が許可されているため、52バイトとしてカウントできます。
デニス

@Dennis Retinaの回答のうち3つだけが単項で入力を受け取ります。私は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

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

オンラインでお試しください!

  • function lassign lcm(p,q)to a[j]およびassign gcd(p, q)to qif j > i、それ以外の場合はすべてを変更せずに保持します。
    • lcm(p,q) = if p%q=0 then p else p*lcm(q,p%q)/(p%q)

古い答え:

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

オンラインでお試しください!

  • 関数ggcd(u, v)、戻り値を計算して割り当てますu

2

05AB1E15 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バイト。(私は笑うまくとしてポートデニスの答えにしようとしたので、私は前にこれを試してみた)¾
ミスターXcoder

1
使用してεgÅpymP1つの上に別のバイトを救う氏Xcoderが metioned
Emigna

@ Mr.Xcoderああ、0とのフィラーに違いがあることを知りませんでした¾。覚えておく必要があります!実際、今すぐ小さな05AB1Eのヒントに追加します。:)
ケビンクルーイッセン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.