Максимум Максима!


11

Натхненний цим питанням і вдосконалений Луїсом Мендо .

Виклик

З огляду на 2D матрицю цілих чисел, кожен рядок має максимальне значення. Один або кілька елементів кожного рядка буде дорівнює максимальному значенню їх відповідного рядка. Ваша мета - визначити, який стовпець (и) містять найбільше записів, які дорівнюють максимальному значенню відповідного рядка, а також кількості максимумів у рядках, розміщених у цих стовпцях.

Вхідні дані

  • Вхід буде не порожньою матрицею Mx N( M> 0 і N> 0) у будь-якій формі, яка добре відповідає вашій вибраній мові.

Вихідні дані

  • Ваша програма повинна повертати індекс кожного стовпця, що містить максимальну кількість максимумів у рядках (або як окремі значення, або як список). Можна використовувати або індексацію на основі 0 або 1 (вкажіть у своєму описі).
  • Ваша програма також повинна повертати кількість максимумів, що були в цих стовпцях (єдине число).
  • Порядок / формат виводу є гнучким, але його слід пояснити в тексті, що супроводжує вашу відповідь.

Додаткова інформація

  • Усі записи у вхідній матриці будуть додатними цілими числами.
  • Якщо максимальне значення рядка поділяється на кілька елементів у цьому рядку, всі входження цього значення зараховуються до загальної кількості їх стовпців.
  • Якщо кілька стовпців містять однакову кількість максимумів, вам слід повернути список усіх стовпців, які мали цю кількість максимумів.

Приклад

Розглянемо вхід

 7  93
69  35
77  30     

Рядок 1 має максимум 93, який відбувається лише один раз, а саме у стовпці 2. Рядок 2: відбувається у стовпці 1. Рядок 3: також у стовпці 1. Отже, стовпець-переможець - 1, максимум 2. Таким чином, вихід буде [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]

Оцінка балів

Це , виграє найкоротший код у байтах. Тібрейкер переходить до більш ранньої відповіді.

Таблиця лідерів

Нижче представлений фрагмент стека для аналізу всіх записів.


7
Смішний факт; голландську королеву називають Maxima, тому технічно ми можемо мати лише 1 Maxima.
Bassdrop Cumberwubwubwub

1
Смішний факт; також є відкритий джерело CAS під назвою Maxima .
flawr

Відповіді:


3

Желе , 9 байт

="Ṁ€SµM,Ṁ

Вхід - це двовимірний список, вихід - пара: список індексів на основі 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)

Це монадійне дієслово, яке використовується у випадку другого прикладу:

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

Вихід складається з двох коробок і використовує індексацію на основі 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

Перший вихід - це максимальна кількість максимумів, а другий - стовпці, в яких це відбулося (індексація на основі 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]

Вихід - це: спочатку максимальна кількість максимумів, потім один або кілька індексів стовпців.

Спробуйте в Інтернеті!

Пояснення

Для цього використовується інший підхід від відповіді Сьювера .

Спочатку обчислюється матриця логічних значень ( 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 байт

1 байт завдяки @Suever .

1 байт завдяки @Jakube .

{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

CJam , 38 35 31 байт

На 2 байти менше завдяки @FryAmTheEggMan, за допомогою також від @quartata. Дякуємо також @Dennis, що видалив ще 4 байти.

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

Введення має форму

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

Вихід - це масив індексів стовпців на основі та числа.

Спробуйте в Інтернеті!


q~_::e>.f=:.+_:e>_@f{=U):Ua*~}pекономить кілька байт. Перетворення його в блок коду заощадило б ще 1.
Денніс

@Dennis Дякую! Тепер мені потрібно зрозуміти, що {=U):Ua*~}робить ...
Луїс Мендо


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

Вхід - це двовимірний список плавців, вихід - пара: список індексів на основі 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)]

Повертає масив з двох елементів; перший - це максимальний підрахунок максимумів, другий - масив стовпців, що індексуються нулем, з цим підрахунком.


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]). Він повертає двоелементний масив комірок, де перший елемент є максимальною кількістю максимумів, а другий - 1-заснований індекс стовпців, що містять ці максимуми.

Усі тестові справи


1

Пітон 3, 142 байти

Алгоритм тут, в основному, проходьте кожен рядок і збільшуйте кількість стовпців, що мають максимум цього рядка. Потім знайдіть максимальну кількість балів і знайдіть стовпці, які мають цю максимальну оцінку, і поверніть їх. Стовпці є 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в списку стовпців дозволено містити елементи, які ми ігноруємо, це може бути на 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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.