最も一般的な倍数


28

混同しない最小公倍数

複数の要素を持つ正の整数のリストを指定すると、配列内の2つの要素の最も一般的な積を返します。

例えば、リストのMCMは、[2,3,4,5,6]ある12製品のテーブルがあるとして、:

    2  3  4  5  6
  ---------------
2 | #  6  8  10 12
3 | #  #  12 15 18
4 | #  #  #  20 24
5 | #  #  #  #  30
6 | #  #  #  #  #

DJMcMayhemに感謝します

12ほとんどの時間表示されます(の2倍を2*6して3*4)。我々は要素の製品を含め、それ自体、そうではないことに注意してください2*2または4*4このリストには表示されませません。ただし、同一の要素は引き続き乗算されるため、表は[2,3,3]次のようになります。

    2  3  3
  ----------
2 | #  6  6 
3 | #  #  9
3 | #  #  #

MCMで6

同点の場合、任意のタイ要素、またはそれらすべてのリストを返すことができます。

  • これはなので、各言語の最短バイト数が勝ちです!

テストケース:

[2,3,4,5,6] -> 12
[7,2] -> 14
[2,3,3] -> 6
[3,3,3] -> 9
[1,1,1,1,2,2] -> 2
[6,200,10,120] -> 1200
[2,3,4,5,6,7,8,8] -> 24
[5,2,9,10,3,4,4,4,7] -> 20
[9,7,10,9,7,8,5,10,1] -> 63, 70, 90 or [63,70,90]


5
推奨されるテストケース:すべての要素が同じもの(つまり[3,3,3] -> 9)。現在のすべてのテストケースでは、要素が同じであるペアを除外すると([2,3,3]同じ値を含むようなテストケースであっても)、正しいテスト結果が保持されますが、このテストケースではフィルタリング後に何も残らないため失敗します。
ケビンCruijssen

@ケビン良い提案、追加
ジョーキング

回答:


11

Brachylog、11バイト

{⊇Ċ×}ᶠọtᵒth

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

説明

{   }ᶠ          Find all:
 ⊇Ċ×              Product of a subset of 2 elements
      ọtᵒ       Order by occurrences
         th     Take the last element and discard the number of occurrences

コードゴルフが通常どのように機能するかはわかりませんが、これらの文字の一部は標準の256コードポイントの外にありません。
ホロウェイ


11

R54 50 41バイト

order(-tabulate(combn(scan(),2,prod)))[1]

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

または、54 53 44バイトの場合:

names(sort(-table(combn(scan(),2,prod))))[1]

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

原則として、後者のバージョンは、names関数がなくても関連する結果を出力しますが、そのような最も頻繁な製品のカウントが続きます。

-4と-1のCriminallyVulgarと、両方の-9のGiuseppeに感謝します。


1
2番目では、-1に対してdescending = TRUEの代わりに-table()を使用できます。でも、最初のものの賢さは本当に好きです。編集:-4の最初のものにも適用できることに気付いたので、それがあります。オンラインでお試しください!
CriminallyVulgar

1
combn(scan(),2,prod)を使用する代わりに動作しますapply
ジュゼッペ


7

Pyth、12バイト

eo/QN=*M.cQ2

テストスイート

まず、置換なしの入力の2つの要素の組み合わせすべてを使用します(.cQ2)。次に、これらの各ペアをそれぞれの製品にマッピングします(*M)。次に、入力変数を製品のリストで上書きします(=)。次に、製品のリスト内の出現回数で製品のリストをソートします(o/QN)。最後に、ソート済みリストの最後の要素を取得します(e)。


7

MATL8 7バイト

2XN!pXM

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

(@Mr。XcoderのJelly answerのメソッドを使用して-1バイト。)

2XN     % nchoosek - get all combinations of 2 elements from input
!p      % get the product of each combination
XM      % 'mode': get the most common value from that

古い回答:

8バイト

&*XRXzXM

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

&*    % multiply input by its transpose,
      %  getting all elementwise products
XR    % take the upper-triangular portion of that,
      %  zeroing out repetitions and mainly self-multiplications
Xz    % remove the zeroed out parts
XM    % 'mode' calculation - get the most common value from that

6

05AB1E8 6 バイト

æ2ùP.M

@Kaldoのおかげで-2バイト。

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

æ         # Take the powerset of the input-list
          #  i.e. [2,3,3] → [[],[2],[3],[3],[2,3],[2,3],[3,3],[2,3,3]]
 2ù       # Leave only the inner lists of size 2:
          #  i.e. [[],[2],[3],[3],[2,3],[2,3],[3,3],[2,3,3]] → [[2,3],[2,3],[3,3]]
   P      # Take the product of each remaining pair
          #  i.e. [[2,3],[2,3],[3,3]] → [6,6,9]
    .M    # Only leave the most frequent value(s) in the list
          #  i.e. [6,6,9] → [6]

1
6バイトの
æ2ùP.M

@Kaldoありがとう!を完全に忘れましたù
ケビンクルーッセン

6

Mathematica、32バイト

-17バイト(および修正)、JungHwan Minに感謝します。

Commonest[1##&@@@#~Subsets~{2}]&

純粋な機能。数値のリストを入力として受け取り、MCMのリストを出力として返します。


実際、私たち二人は質問を読み違えたようです。これはinputでは失敗します{3, 3, 3}。修正:Commonest[1##&@@@#~Subsets~{2}]&
ジョンファンミン

@JungHwanMinフー。Subsets繰り返しを個別の要素としてカウントしないと思った。しかし、そうであるように思えるので、ありがとう!
LegionMammal978

5

MATLAB、43バイト

I=input('');i=I'*I*1-eye(nnz(I));mode(i(:))

それは一種の早口言葉でもあります!

説明

I=input('');           % Takes an input like "[2,3,4,5,6]"
i=I'*I                 % Multiplies the input by its own transverse
      *1-eye(nnz(I));  % Multiplies by 1-identity matrix to remove diagonal
mode(i(:))             % Calculates most common value and prints it

1
私はあなたがする必要があることを確認していないI'*I*1-eyeのはなぜないだけI'*I-eye
aaaaaは、モニカを

5

Perl 6の41の 38バイト

{key max bag(@_ X*@_)∖@_»²: *{*}:}

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


コロンが何をしているのか教えてください(またはドキュメントを参照してください)。私はそれを完全に理解することはできません...それは引数の引き渡しと関係があるが、それ以上のことはないことがわかります。
ラミリーズ

1
@Ramilliesこれは中置:演算子です。
-nwellnhof

ああ、なるほど。ありがとうございました。
ラミリーズ



4

アタッシェ、59バイト

Last##~SortBy#`&&:`~##{Flat[UpperTriangle&1!Table&_!`*]^^0}

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

まだこれを少しゴルフに取り組んでいますが、これは私が選んだアプローチにとって最適に近いと思います。

説明

これは、3つの機能の組み合わせです。

  1. {Flat[UpperTriangle&1!Table&_!`*]^^0}
  2. SortBy#`&&:`~
  3. Last

最初の関数は、計算の大部分を実行します。

{Flat[UpperTriangle&1!Table&_!`*]^^0}
{                                   }    anonymous lambda; input: _ (e.g.: [2,3,4,5,6])
                      Table&_!`*         shorthand for Table[`*, _]
                                         this creates a multiplication table using the input
                                         e.g.:
                                           4  6  8 10 12
                                           6  9 12 15 18
                                           8 12 16 20 24
                                          10 15 20 25 30
                                          12 18 24 30 36

      UpperTriangle&1!                   takes the strict upper triangle of this matrix
                                         e.g.:
                                          0 6  8 10 12
                                          0 0 12 15 18
                                          0 0  0 20 24
                                          0 0  0  0 30
                                          0 0  0  0  0
Flat[                           ]^^0     flattens this list and removes all 0s
                                         e.g.: [6, 8, 10, 12, 12, 15, 18, 20, 24, 30]

2番目は少し複雑ですが、かなり単純なことを行います。まず、それがf&n引数...xで呼び出されたときにを返す関数であることを知っておくと便利ですf[...x, n]f&:n戻り値は同様f[n, ...x]です。さて、これを分解しましょう:

( ~SortBy ) # (`& &: `~)

まず、f#gフォークを作成します。入力nでは、戻りますf[n, g[n]]。ただし、この場合、f~SortByです。~f関数の引数を逆にします。これは、または~f#gと同等であることを意味します。f[g[n], n]SortBy[(`& &: `~)[n], n]

`& &: `~ フォームに従います f&:n。しかし、何`&とは`~?これらは「演算子引用符」であり、引用符で囲まれた演算子に相当する関数を返します。したがって、この場合、`&はと同じです${ x & y }。そのことを念頭に置いて、この式は二項演算子の次の式と同等です。

f&:n   <=>   ${ f[n, x] }
       <=>   ${ (`&)[`~, x] }
       <=>   ${ `~ & x }

これにより、関数が生成されます `~&x。ここでx、最初の関数の結果です。in n ~ aの出現回数をカウントnしますaます。したがって、これは、関数1から計算された配列内の引数の出現をカウントする関数を返します。

に戻る SortBy、配列内の各要素は、その要素に出現する回数だけ表示されます。

最後に、Last最も多く発生する要素を取ります。ソートアルゴリズムによって関係が壊れます。


UpperTriangleパーツは必要ですか?テーブルを平らにして並べ替えることはできますか?
-svavil

@svavilはい、必須です。[5, 2, 9, 10, 3, 4, 4, 4, 7] -> 16代わりに20
コナーオブライエン

4

JavaScript(ES6)、72 70バイト

a=>a.map(m=o=(y,Y)=>a.map(x=>Y--<0?m=(o[x*=y]=-~o[x])<m?m:o[r=x]:0))|r

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


@tsh問題は主な対角線であり、倍数はまったくカウントされません。したがって、最後から2番目のテストケースでは失敗します。16 メインの対角線に、予想されるのではなく、返されるのに十分高いスコアをもたらす 20
アーナウルド

3

、24バイト

WθF×⊟θθ⊞υκI⊟Φυ⁼№υι⌈Eυ№υλ

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

Wθ

入力配列は空ではありませんが...

×⊟θθ

...最後の要素をポップし、残りの配列にその要素を掛けます...

F...⊞υκ

...結果を事前定義された空のリストにプッシュします。

⌈Eυ№υλ

リストに各製品が表示される回数をカウントし、最大値を取ります...

Φυ⁼№υι...

...次に、カウントがその最大値に等しい製品をフィルタリングします...

I⊟

...次に、最後の要素をポップし、暗黙的な印刷のために文字列にキャストします。



3

APL(Dyalog Unicode)29 27 19バイト

{⌈/⊢/⊣¨⌸∊⍵}⍳∘≢↓¨⊢×⊂

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

暗黙のfn。

暗黙のバージョンと2バイトのAdámに感謝します。

8バイトのngnに感謝します!

どうやって:

{⌈/⊢/⊣¨⌸∊⍵}⍳∘≢↓¨⊢×⊂
                ⊢×⊂    Multiply each element with the entire argument, then
           ⍳∘≢↓¨       Remove 1 from the first, two from the next etc. (removes repeated multiplications);
                       The result is then fed into the function:
{       ∊⍵}            Flatten the result;
     ⊣¨⌸               Key; creates a matrix in which each row corresponds to a unique product;
   ⊢/                  Get the rightmost column of the matrix;
 ⌈/                    Get the highest value.

1
これはわずか27です。
アダム


3

CJam70 68バイト

q',/S*~_,(:L{LX-,0a\+[{X1++}*](;{_X=\_Y=@*\}fY}fX]~;]_{\_@e=}$\;_,(=

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

説明

q',/S*~                                                                  Turn input string into a valid CJam array
       _,(                                                               Find the length of the array and subtract 1
          :L                                                             Assign the result to L
            {                                 }fX                        Outer for loop
             LX-,0a\+[{X1++}*](;                                         Create an array with all the array indexes bigger than X
                                {          }fY                           Inner for loop
                                 _X=\_Y=@*\                              Create a multiple of array[X] and array[Y] (Guaranteed to be from a unique combination of factors)
                                                 ~;]                     Casts away all stack items except for an array of the multiples
                                                    _{\_@e=}$\;          Sorts array by number of occurrences (largest number of occurences at the end)
                                                               _,(=      Gets the last element of the array

コードは非常に長いため、説明を表示するには、右にスクロールする必要があります。


これは書くのが絶対に悪夢でした。CJamにはパワーセット機能がありません(他の多くのゴルフ言語とは異なり-私にとっては素晴らしい選択です)。つまり、パワーセットを手動で見つける必要がありました。ただし、これにより、powerset関数の他の回答とは異なり、無効な数の要因を無視する機会が与えられました。

私はCJamでひどいことを考えると、これはゴルフができるはずです。


変更点:

ヘレンは 2バイトを切り捨てました!

古い:q',/S*~_,1-:L{LX-,0a\+[{X1++}*](;{_X=\_Y=@*\}fY}fX]~;]_{\_@e=}$\;_,1-=
新しい:q',/S*~_,(:L{LX-,0a\+[{X1++}*](;{_X=\_Y=@*\}fY}fX]~;]_{\_@e=}$\;_,(=

1-sを単純に変更することにより(、同じ効果が得られますが、バイトカウントが少なくなります。




2

MATLAB 39バイト

a=input('');
b=triu(a'*a,1);
mode(b(b~=0))

ジェイコブ・ワトソンによる回答もご覧ください


1
2行目にすることでb=triu(a'*a,1);4バイト節約できます。
スンダ

スナップああ@sundar、あなたは正しいです:)私が持っていたtriuintially何とか離れて漂流
AAAAAはREINSTATEモニカ言う

良い解決策です。上三角関数がこんなに短いことに気がつきませんでした!
ジェイコブワトソン

2

SQL Server、93バイト

SELECT TOP 1a.a*b.a
FROM @ a
JOIN @ b ON a.i<b.i
GROUP BY a.a*b.a
ORDER BY COUNT(a.a*b.a)DESC

入力は次の形式のテーブルからのものと想定されます

DECLARE @ TABLE (A int, i int identity);

テーブル作成の例:

INSERT INTO @ VALUES (9), (7), (10), (9), (7), (8), (5), (10), (1);

説明:

「整数のリスト」にはインデックスが関連付けられていると仮定します。これは、私の場合はcolumn iです。列aにはリストの値が含まれます。

すべてのペアの製品を作成します。左のペアが右のペアよりも先にリストに表示されます。次に製品をグループ化し、最も人口の多い順に並べ替えます。

cte句またはパーティショニング句を使用できなかったのは少し残念ですが、長すぎました。SELECT非常に高価なキーワードです。

代替、183バイト

WITH c
AS(SELECT a,ROW_NUMBER()OVER(ORDER BY a)r
FROM @),d AS(SELECT a.a*b.a p,COUNT(a.a*b.a)m
FROM c a
JOIN c b ON a.r<b.r GROUP BY a.a*b.a)SELECT TOP 1p
FROM d
ORDER BY m DESC

SQLに個別のインデックス列がない場合、ROW_NUMBER関数を使用してインデックスを作成するソリューションを次に示します。私は個人的に注文を気にしませんが、注文が必要であり、a列を使用するのが最短です。




2

C#(Visual C#Interactive Compiler)、95バイト

x=>x.SelectMany(y=>(x=x.Skip(1)).Select(z=>y*z)).GroupBy(y=>y).OrderBy(y=>y.Count()).Last().Key

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

より少ないコード:

// x is a list of integers
x=>
  // iterate over each integer and
  // return a list per element.
  // flatten the list of lists to 1 list
  x.SelectMany(y=>
    // skip the current value and save
    // newly offset list to x so that it
    // can be incrementally offset
    // again next pass
    (x=x.Skip(1))
      // compute the product
      .Select(z=>y*z))
    // get the unique products
    .GroupBy(y=>y)
    // sort the products by number
    // of occurrences
    .OrderBy(y=>y.Count())
    // pick the product with the
    // greatest number of occurrences
    .Last().Key

1

PHP、91バイト

while($c=$argv[++$i])for($k=$i;--$k;)$r[$c*$argv[$k]]++;asort($r);echo end(array_flip($r));

コマンドライン引数から入力を受け取ります。-nrまたはで実行、オンラインで試してください

厳密モードの警告を回避するには、PHP 7を使用します。


1

J、29 25 24 23バイト

(0{~.\:1#.=)@(</#&,*/)~

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

どうやって

(~. {.@\: 1 #. =)@(</ #&, */)~
                  (</ #&, */)~  NB. all products, dups removed:
                          */    NB. create the times table
                   </           NB. lower triangular ones matrix
                       &,       NB. flatten each and
                      #         NB. filter based on lower triangle
                 @              NB. pass that result to
(~. {.@\: 1 #. =)               NB. get the most frequent list item:
       \:                       NB. sort down
 ~.                             NB. the uniq elements
          1 #. =                NB. by their count
    {.@                         NB. and take the first element


0

APL(NARS)、53文字、106バイト

{0=l←↑⍴⍵:⍵⋄t⊃⍨q⍳⌈/q←{+/t=⍵}¨t←×/¨(∊(⍳l)∘.<⍳l)/,⍵∘.,⍵}

テスト:

  p←{0=l←↑⍴⍵:⍵⋄t⊃⍨q⍳⌈/q←{+/t=⍵}¨t←×/¨(∊(⍳l)∘.<⍳l)/,⍵∘.,⍵}
  p 9
9
  p 1 3
3
  p 2 3 4 5 6
12
  p 7 2
14
  p 2 3 3
6
  p 3 3 3
9
  p 1 1 1 1 2 2
2
  p 6 200 10 120
1200
  p 2 3 4 5 6 7 8 8
24
  p 5 2 9 10 3 4 4 4 7
20
  p 9 7 10 9 7 8 5 10 1
63
  p 3 3
9
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.