Maksimum Maksima!


11

Bu sorudan esinlenerek Luis Mendo tarafından rafine edildi .

Meydan okuma

2D tam sayı matrisi verildiğinde, her satırın maksimum değeri vardır. Her satırdaki bir veya daha fazla öğe, ilgili satırın maksimum değerine eşit olacaktır. Amacınız, hangi sütun (lar) ın ilgili satırların maksimum değerine eşit olduğunu ve bu sütunlarda bulunan satır bazında maksimumların sayısını içerdiğini belirlemektir.

Giriş

  • Giriş , seçtiğiniz dil için uygun olan herhangi bir biçimde boş olmayan bir Mx Nmatrisi ( M> 0 ve N> 0) olacaktır.

Çıktı

  • Programınız , maksimum satır başı maksimum değeri içeren her sütunun dizinini döndürmelidir (ayrı değerler veya liste olarak). 0- veya 1 tabanlı indeksleme kullanılabilir (açıklamanızda belirtin).
  • Programınız ayrıca bu sütunlarda bulunan maksima sayısını da döndürmelidir (tek bir sayı).
  • Çıktının sırası / biçimi esnektir, ancak cevabınızla birlikte gelen metinde açıklanmalıdır.

ek bilgi

  • Giriş matrisindeki tüm girdiler pozitif tamsayı olacaktır.
  • Bir satırın maksimum değeri, bu satırdaki birden çok öğe tarafından paylaşılıyorsa, bu değerin tüm tekrarlamaları sütunlarının toplamına dahil edilir.
  • Birden çok sütun aynı sayıda maksimum içeriyorsa, bu maksimum sayısına sahip tüm sütunların bir listesini döndürmelisiniz .

Bir örnek

Girişi düşünün

 7  93
69  35
77  30     

Satır 1, yalnızca bir kez, yani sütun 2'de gerçekleşen maksimum 93 değerine sahiptir. Satır 2: sütun 1'de gerçekleşir. Satır 3: sütun 1'de de olur. Böylece kazanan sütun 1'dir ve 2 maxima ile. Böylece çıktı olacak [1] [2]. Girişi şu şekilde değiştirirsek:

 7  93
69  35
77  77

çıktı her [1 2] [2]iki sütun da 2 maksimaya sahip olacaktır.

Test Durumları

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]

puanlama

Bu , bayttaki en kısa kod kazanıyor. Tiebreaker önceki cevaba gider.

Liderler Sıralaması

Aşağıda, tüm girdileri analiz etmek için bir yığın snippet'i bulunmaktadır.


7
Eğlenceli gerçek; Hollanda kraliçesine Maxima denir, teknik olarak sadece 1 Maxima'ya sahip olabiliriz.
Bassdrop Cumberwubwubwub

1
Eğlenceli gerçek; Maxima adında bir açık kaynak CAS var .
Kusur

Yanıtlar:


3

Jöle , 9 bayt

="Ṁ€SµM,Ṁ

Giriş bir 2B listedir, çıkış bir çifttir: 1 tabanlı indekslerin listesi ve maksimum maksimum sayısı.

Çevrimiçi deneyin! veya tüm test senaryolarını doğrulayın .

Nasıl çalışır

="Ṁ€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 bayt

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

Bu, ikinci örnek durumunda aşağıdaki gibi kullanılan monadik bir fiildir:

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

Çıktı iki kutudan oluşur ve 0 tabanlı indeksleme kullanır. Burada deneyin!

açıklama

((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 bayt

vH3$X>G=XstX>tb=f

İlk çıktı maksimum sayıdır ve ikinci çıktı bunun meydana geldiği sütunlardır (1 tabanlı indeksleme).

Çevrimiçi deneyin!

açıklama

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 bayt

!tvX>!G=5#fFTT#XM

Giriş, satırlar noktalı virgülle ayrılmış bir 2B dizidir. Test senaryoları için girdiler

[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]

Çıktı: önce maksimum maksimum miktar, daha sonra bir veya daha fazla sütun indeksi.

Çevrimiçi deneyin!

açıklama

Bu, Suever'in cevabından farklı bir yaklaşım kullanıyor .

İlk önce mantıksal değerlerin ( trueve false) bir matrisi hesaplanır; burada truesatır maksimum değeri bulunur. Sonra truedeğerlerin sütun indeksleri bir vektöre çıkarılır. Son olarak, bu vektörün modu, en sık görülen tüm değerlerle (istenen sütun indeksleri) birlikte hesaplanır (maksimum maksimum sayısı).

!        % 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 bayt

@Suever sayesinde 1 bayt .

@ Jakube sayesinde 1 bayt .

{MC.MhZrSsxLeSdQ8

Test odası.

Çıktı 0 dizinlidir.

Sipariş tersine çevrildi.

Tüm girişler

[[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]]

Tüm çıktılar

[[2], [0]]

[[2], [0, 1]]

[[2], [3]]

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

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

[[1], [0, 3]]

[[4], [0]]

[[1], [0]]

Nasıl çalışır

{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 bayt

@FryAmTheEggMan sayesinde @quartata'nın da yardımıyla 2 bayt daha az. @Dennis'e 4 bayt daha çıkardığı için teşekkürler.

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

Girdi şu şekildedir

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

Çıktı, 1 tabanlı sütun indeksleri ve bir sayı dizisidir.

Çevrimiçi deneyin!


q~_::e>.f=:.+_:e>_@f{=U):Ua*~}pbirkaç bayt kaydeder. Kod bloğuna dönüştürmek 1 tane daha tasarruf sağlar.
Dennis

@Dennis Teşekkürler! Şimdi ne yaptığını anlamam gerek {=U):Ua*~}...
Luis Mendo


2

Python 2, 106 bayt

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

Girdi şamandıraların 2B listesidir, çıktı bir çifttir: 0 tabanlı indekslerin listesi ve bir tamsayı.

Ideone üzerinde test edin .


2

Julia, 54 bayt

f(x,m=maximum,t=sum(x.==m(x,2),1))=find(t.==m(t)),m(t)

Giriş bir matristir, çıkış bir çifttir: 1 tabanlı indekslerin listesi ve maksimum maksimum sayısı.

Çevrimiçi deneyin!


1

JavaScript (ES6), 111 bayt

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)]

İki öğeden oluşan bir dizi döndürür; birincisi maksimum maksimum sayısı, ikincisi bu sayıyla sıfır indeksli sütun dizisidir.


1

Oktav, 47 46 bayt

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

Bu, kendisini otomatik olarak atayan ansve kullanarak çalıştırılabilen anonim bir işlev oluşturur ans([1 2 3; 4 5 6]). İlk elemanın maksimum maksimum sayı ve ikinci elemanın bu maksimum değerleri içeren sütunların 1 tabanlı indeksi olduğu iki elemanlı bir hücre dizisi döndürür.

Tüm test örnekleri


1

Python 3, 142 bayt

Buradaki algoritma temelde, her bir satırdan geçin ve o satırın maksimum değerine sahip sütunların puanını artırın. Ardından, maksimum puanları bulun ve maksimum puanı alan sütunları bulun ve döndürün. Sütunlar 1 dizinlidir. Bunu bir lambda içine astarlamayı denedim, ancak skorları sütun sütun üreterek 153 bayt oldu.

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

Test Durumları

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 bayt

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

Uzun adamım, bunun çok basitleştirilebileceğini hissediyorum. En azından doğru çıktıyı üretir.

[(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 (veya 12) bayt

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

Biçimdeki çıktılar [[1-indexed columns-list], maxima].

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

0Sütun listesinde yok saydığımız öğelerin bulunmasına izin verilirse, aşağıdakileri kaldırarak 2 bayt daha az olabilir 0K:

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

Açıklama:

ε               # 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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.