Maxima สูงสุด!


11

แรงบันดาลใจจากคำถามนี้และกลั่นโดยหลุยส์ Mendo

ท้าทาย

เมื่อพิจารณาจากเมทริกซ์จำนวนเต็มสองมิติแต่ละแถวจะมีค่าสูงสุด องค์ประกอบอย่างน้อยหนึ่งองค์ประกอบของแต่ละแถวจะเท่ากับค่าสูงสุดของแถวที่เกี่ยวข้อง เป้าหมายของคุณคือพิจารณาว่าคอลัมน์ใดมีรายการมากที่สุดซึ่งเท่ากับมูลค่าสูงสุดของแถวนั้น ๆ รวมถึงจำนวนสูงสุดของแถวอัจฉริยะที่พบในคอลัมน์เหล่านี้

อินพุต

  • อินพุตจะเป็นเมทริกซ์Mx ว่างเปล่าN( M> 0 และN> 0) ในรูปแบบใดก็ตามที่เหมาะสมกับภาษาที่คุณเลือก

เอาท์พุต

  • โปรแกรมของคุณควรกลับดัชนีของแต่ละคอลัมน์ที่มีจำนวนสูงสุดของแถวที่ฉลาดที่สุด (ไม่ว่าจะเป็นค่าที่แยกจากกันหรือรายการ) สามารถใช้ดัชนีแบบอิงดัชนี 0- หรือ 1 ก็ได้ (ระบุในคำอธิบายของคุณ)
  • โปรแกรมของคุณควรคืนค่าจำนวนสูงสุดที่ปรากฏในคอลัมน์เหล่านี้ (ตัวเลขเดียว)
  • คำสั่ง / รูปแบบของผลลัพธ์มีความยืดหยุ่น แต่ควรอธิบายไว้ในข้อความที่มาพร้อมกับคำตอบของคุณ

ข้อมูลเพิ่มเติม

  • รายการทั้งหมดในเมทริกซ์การป้อนข้อมูลจะเป็นจำนวนเต็มบวก
  • หากค่าสูงสุดของแถวถูกแชร์โดยองค์ประกอบหลายอย่างในแถวนั้นการเกิดขึ้นทั้งหมดของค่านั้นจะนับรวมไปยังผลรวมของคอลัมน์
  • หากหลายคอลัมน์มีจำนวน maxima เท่ากันคุณควรส่งคืนรายการของคอลัมน์ทั้งหมดที่มี maxima จำนวนนี้

ตัวอย่าง

พิจารณาการป้อนข้อมูล

 7  93
69  35
77  30     

แถวที่ 1 มี maxium 93 ซึ่งเกิดขึ้นเพียงครั้งเดียวคือที่คอลัมน์ 2 แถวที่ 2: เกิดขึ้นที่คอลัมน์ 1 แถวที่ 3: ที่คอลัมน์ 1 ดังนั้นคอลัมน์ผู้ชนะคือ 1 ด้วย 2 สูงสุด [1] [2]ดังนั้นการส่งออกจะได้รับ ถ้าเราเปลี่ยนอินพุตเป็น

 7  93
69  35
77  77

ผลลัพธ์จะเป็น[1 2] [2]เพราะทั้งสองคอลัมน์มี 2 maxima

กรณีทดสอบ

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 แมกม่าได้เท่านั้น
Bassdrop Cumberwubwubwub

1
สนุกจริงๆ; นอกจากนี้ยังมี CAS opensource เรียกว่าแม็กซิม่า
ข้อบกพร่อง

คำตอบ:


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)

นี่คือคำกริยา monadic ใช้ดังนี้ในกรณีของตัวอย่างที่สอง:

   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

เอาต์พุตแรกคือจำนวนสูงสุดของ maxima และเอาต์พุตที่สองคือคอลัมน์ที่สิ่งนี้เกิดขึ้น (การจัดทำดัชนีแบบ 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]

เอาต์พุตคือ: จำนวนสูงสุดสูงสุดเป็นอันดับแรกจากนั้นหนึ่งดัชนีขึ้นไป

ลองออนไลน์!

คำอธิบาย

นี้จะใช้วิธีการที่แตกต่างจากคำตอบของ 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 ไบต์

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

เอาท์พุทเป็นอาร์เรย์ของดัชนีคอลัมน์ที่มี 1 และตัวเลข

ลองออนไลน์!


q~_::e>.f=:.+_:e>_@f{=U):Ua*~}pบันทึกไม่กี่ไบต์ เปลี่ยนเป็นบล็อกรหัสจะช่วยประหยัด 1 อีก
Dennis

@ เดนนิสขอบคุณ! ตอนนี้ฉันต้องเข้าใจสิ่งที่{=U):Ua*~}...
Luis 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)]

ส่งคืนอาร์เรย์ของสององค์ประกอบ แรกคือการนับสูงสุดสูงสุดที่สองคืออาร์เรย์ของคอลัมน์ zero-indexed ด้วยการนับที่


1

Octave, 47 46 bytes

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

สิ่งนี้จะสร้างฟังก์ชั่นนิรนามที่กำหนดตัวเองโดยอัตโนมัติansและสามารถใช้งานans([1 2 3; 4 5 6])ได้ ส่งคืนอาร์เรย์เซลล์สององค์ประกอบที่องค์ประกอบแรกคือจำนวนสูงสุดสูงสุดและที่สองคือดัชนีที่ใช้ 1 ของคอลัมน์ที่มี maxima เหล่านี้

กรณีทดสอบทั้งหมด


1

Python 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)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.