最大マキシマ!


11

この質問に触発され、ルイスメンドーによって洗練されました。

チャレンジ

整数の2Dマトリックスを指定すると、各行には最大値があります。各行の1つ以上の要素は、それぞれの行の最大値に等しくなります。あなたの目標は、それぞれの行の最大値とこれらの列で見つかった行ごとの最大値に等しいエントリが最も多い列を決定することです。

入力

  • 入力は、選択した言語に適した形式の空でないMx N行列(M> 0およびN> 0)になります。

出力

  • プログラムは、行ごとの最大値の最大数を含む各列のインデックスを返します(個別の値またはリストとして)。0ベースまたは1ベースのインデックスを使用できます(説明で指定します)。
  • プログラムは、これらの列に存在した最大値の数(単一の数)も返す必要があります。
  • 出力の順序/形式は柔軟ですが、回答に付随するテキストで説明する必要があります。

追加情報

  • 入力行列のすべてのエントリは正の整数になります。
  • 行の最大値がその行の複数の要素で共有されている場合、その値のすべての出現は列の合計にカウントされます。
  • 複数の列に同じ数の最大値が含まれる場合、この数の最大値を持つすべての列のリストを返す必要があります。

入力を検討する

 7  93
69  35
77  30     

行1の最大値は93です。これは1回のみ、つまり列2で発生します。行2:列1で発生します。行3:また列1でも発生します。したがって、出力はになります[1] [2]。入力を

 7  93
69  35
77  77

[1 2] [2]両方の列に最大値が2つあるため、出力はになります。

テストケース

input                 =>    output ( [1-based index array], [nMaxima] )
----------------------------------------------
 7  93
69  35                =>    [1], [2]
77  30

 7  93
69  35                =>    [1 2], [2]
77  77     

1   2   3   4         =>    [4], [2]
5   6   7   8

16   2   3  13
 5  11  10   8        =>    [1  2  4], [1]
 9   7   6  12    

 1   1   1   1        =>    [1  2  3  4], [1]

25   6  13  25        =>    [1  4], [1]

1
2
3                     =>    [1], [4] 
4

100                   =>    [1], [1]

得点

これはで、バイト単位の最短コードが勝ちです。Tiebreakerは以前の回答に進みます。

リーダーボード

以下は、すべてのエントリを分析するためのスタックスニペットです。


7
楽しい事実; オランダの女王はマキシマと呼ばれるので、技術的にはマキシマを1つしか持てません。
バスドロップCumberwubwubwub 16年

1
楽しい事実; Maximaと呼ばれるオープンソースCASもあります。
flawr

回答:


3

ゼリー、9 バイト

="Ṁ€SµM,Ṁ

入力は2Dリスト、出力はペアです:1ベースのインデックスのリストと最大値の最大数。

オンラインでお試しください!または、すべてのテストケースを確認します

使い方

="Ṁ€SµM,Ṁ  Main link. Argument: M (matrix)

  Ṁ€       Apply maximum to each row.
="         Zipwith equal; compare the entries of the nth row with its maxmium.
    S      Sum; reduce across columns to count the maxima in each row.
     µ     Begin a new, monadic link. Argument: A (list of maxima)
      M    Yield all indices with maximal value.
        Ṁ  Yield the maximum of A.
       ,   Pair the results to both sides.

3

J、27バイト

((I.@:=;])>./)@(+/@:=>./"1)

これは、2番目の例の場合に次のように使用される単項動詞です。

   f =: ((I.@:=;])>./)@(+/@:=>./"1)
   m =: 3 2 $ 7 93 69 35 77 77
   f m
+---+-+
|0 1|1|
+---+-+

出力は2つのボックスで構成され、0ベースのインデックスを使用します。ここで試してみてください!

説明

((I.@:=;])>./)@(+/@:=>./"1)  Input is m.
(            )@(          )  Composition: apply right hand side, then left hand side.
                     >./"1   Take maximum of each row of m.
                    =        Replace row maxima by 1 and other values by 0,
                +/@:         then take sum (number of maxima) on each column.
                             The result is the array of number of row maxima in each column.
          >./                Compute the maximum of this array
 (     ;])                   and put it in a box with
  I.@:=                      the indices of those entries that are equal to it.

3

MATL、17バイト

vH3$X>G=XstX>tb=f

最初の出力は最大値の最大数であり、2番目の出力はこれが発生した列です(1ベースのインデックス付け)。

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

説明

v       % Vertically concatenate everything on the stack (nothing), yields []
        % Implicitly grab the input
H       % Push the number 2 to the stack
3$X>    % Compute the maximum value of each row (along the second dimension)
G       % Explicitly grab input again
=       % Compare each row of the input to the row-wise max (automatically broadcasts). 
Xs      % Sum the number of matches in each column
t       % Duplicate the array
X>      % Determine the max number of maxima in all columns
t       % Duplicate this value
b=f     % Find the index of the columns which had the maximum number of maxima
        % Implicitly display stack contents

3

MATL、17バイト

!tvX>!G=5#fFTT#XM

入力は、行がセミコロンで区切られた2D配列です。したがって、テストケースの入力は

[7 93; 69 35; 77  30]
[7 93; 69 35; 77  77]
[1 2 3 4; 5 6 7 8]
[16 2 3 13; 5 11 10 8; 9 7 6 12]
[1 1 1 1]
[25 6 13 25]
[1; 2; 3; 4]
[100]

出力は、最初に最大量の最大値、次に1つ以上の列インデックスです。

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

説明

これは、Sueverの答えとは異なるアプローチを使用しています

最初に、論理値(trueおよびfalse)の行列が計算されます。ここtrueで、行の最大値の存在が示されます。次に、true値の列インデックスがベクトルに抽出されます。最後に、そのベクトルのモードが計算され(最大値の最大数)、最も頻度の高いすべての値(望ましい列インデックス)が計算されます。

!        % Implicit input. Transpose
tv       % Duplicate. Concatenate vertically. This forces next function (max)
         % to work along columns even if input is a row vector
X>       % Maximum of each column (gives row vector)
!        % Transpose into column vector
G        % Push input again
=        % Test for equality, with broadcast. Gives matrix of true and false
5#f      % Column indices of true values, as a column vector
FTT#XM   % Mode of that vector, and all values that occur maximum number of times
         % Implicit display

3

Pyth、20 19 17バイト

@Sueverのおかげで1バイト。

@Jakubeのおかげで1バイト。

{MC.MhZrSsxLeSdQ8

テストスイート。

出力は0から始まります。

順序が逆になります。

すべての入力

[[7,93],[69,35],[77,30]]
[[7,93],[69,35],[77,77]]
[[1,2,3,4],[5,6,7,8]]
[[16,2,3,13],[5,11,10,8],[9,7,6,12]]
[[1,1,1,1]]
[[25,6,13,25]]
[[1],[2],[3],[4]]
[[100]]

すべての出力

[[2], [0]]

[[2], [0, 1]]

[[2], [3]]

[[1], [0, 1, 3]]

[[1], [0, 1, 2, 3]]

[[1], [0, 3]]

[[4], [0]]

[[1], [0]]

使い方

{MC.MhZrSsxLeSdQ8

               Q   Yield input.
           L       For each array in input (as d):
            eSd      Yield maximum of d.
          x          Yield the 0-indexed indices of the maximum in d.
         s          Flatten.
        S           Sort.
       r         8  Run-length encoding.
                    Now the array is:
                      [number of maxima in column, index of column]
                      for all the columns
   .MhZ             Yield the sub-arrays whose first element is maximum.
                     The first element of each sub-array
                     is "number of maxima in column".
                     Now the array is:
                       [number of maxima in column, index of column]
                       for all the required columns
  C                 Transpose.
                    Now the array is:
                      [[number of maxima in each column],
                       [index of each required column]]
                    Note that every element in the
                    first sub-array is the same.
{M                  Deduplicate each.

3

CJam38 35 31バイト

@FryAmTheEggManのおかげで2バイト減り、@ quartataの助けもあります。さらに4バイトを削除してくれた@Dennisにも感謝します。

q~_::e>.f=:.+_:e>_@f{=U):Ua*~}p

入力は次の形式です

[[7 93] [69 35] [77 77]]

出力は、1ベースの列インデックスと数値の配列です。

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


q~_::e>.f=:.+_:e>_@f{=U):Ua*~}p数バイト節約します。コードブロックに変換すると、さらに1つ節約できます。
デニス

@デニスありがとう!今、私は何を理解する必要が{=U):Ua*~}ありません...
ルイスMendo


2

Python 2、106バイト

x=map(sum,zip(*[map(max(r).__eq__,r)for r in input()]))
m=max(x);print[i for i,n in enumerate(x)if n==m],m

入力はフロートの2Dリスト、出力は0ベースのインデックスのリストと整数のペアです。

Ideoneでテストします。



1

JavaScript(ES6)、111バイト

a=>[m=Math.max(...a=a[0].map((_,i)=>a.map(a=>c+=a[i]==Math.min(...a),c=0)|c)),[...a.keys()].filter(i=>a[i]==m)]

2つの要素の配列を返します。最初は最大値の最大カウント、2番目はそのカウントを持つゼロインデックス列の配列です。


1

オクターブ、47 46バイト

@(r){m=max(s=sum(r==max(r,0,2),1)),find(s==m)}

これにより、に自動的に割り当てられans、を使用して実行できる匿名関数が作成されますans([1 2 3; 4 5 6])。2要素のセル配列を返します。最初の要素は最大値の最大数で、2番目はこれらの最大値を含む列の1から始まるインデックスです。

すべてのテストケース


1

Python 3、142バイト

ここでのアルゴリズムは基本的に、各行を調べて、その行の最大値を持つ列のスコアを増やします。次に、スコアの最大値を見つけ、その最大スコアを持つ列を見つけてそれらを返します。列は1から始まります。これをラムダに1行で並べてみましたが、スコアを列ごとに生成すると153バイトでした。

def f(r):
    s=[0]*len(r[0]);e=enumerate
    for x in r:
        for i,j in e(x):
            s[i]+=(0,1)[j==max(x)]
    m=max(s);return[i+1for i,j in e(s)if j==m],m

テストケース

x=[[7, 93],
[69, 35],              
[77, 30]]

print(f(x)) #=>    [[1], 2]

x=[[ 7, 93],
[69, 35],             
[77, 77]]    

print(f(x)) #=>    [[1 2], 2]

x=[[1,  2,   3,  4],        
[5,  6,  7,  8]]

print(f(x)) #=>    [[4], 2]

x=[[16,  2,  3, 13],
 [5, 11, 10,  8],      
 [9,  7, 6, 12]]

print(f(x)) #=>    [[1  2  4], 1]

x=[[1,  1,  1,  1]]      

print(f(x)) #=>    [[1  2  3  4], 1]

x=[[25,   6,  13,  25]]        

print(f(x)) #=>    [[1  4], 1]

x=[[1],
[2],
[3],                   
[4]]

print(f(x)) #=>    [[1], 4] 

x=[[100]]                   

print(f(x)) #=>    [[1], 1]

1

Clojure、150バイト

(fn[M](let[F(dissoc(frequencies(mapcat(fn[r](map-indexed #(if(=(apply max r)%2)%)r))M))nil)m(apply max(vals F))][(map first(filter #(#{m}(% 1))F))m]))

長い男、私はこれを非常に単純化できると感じています。少なくとも正しい出力が生成されます。

[(f [[ 7  93][69  35][77  30]])
 (f [[ 7  93][69  35][77  77]])
 (f [[16   2   3  13][5  11  10   8][9   7   6  12]])]

[[(0) 2] [(1 0) 2] [(0 1 3) 1]]

1

05AB1E、14(または12)バイト

εZQ}øOZ©Qƶ0K®‚

形式で出力します[[1-indexed columns-list], maxima]

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

0無視する項目をcolumns-listに含めることが許可されている場合、以下を削除することで2バイト少なくすることができます0K

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

説明:

ε               # Map each row in the (implicit) input-matrix:
 Z              #  Get the maximum of the row (without popping)
  Q             #  Check for each value in this row if its equal to the row-maximum
              # After the map: zip/transpose the matrix; swapping rows/columns
     O          # Take the sum of each inner list (the truthy/falsey values of the columns)
      Z         # Get the maximum column-sum (without popping)
       ©        # Store it in the register (without popping)
        Q       # Check for each column-sum if its equal to this maximum
         ƶ      # Multiply each truthy/falsey value in the list by its 1-based index
          0K    # Remove all 0s
            ®‚  # Pair the resulting list with the maximum we stored in the register
                # (and output the result implicitly)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.