贡献最大的行


17

给定一个非负整数的非空矩阵,请回答哪些唯一行对矩阵中元素总数的贡献最大。

通过任何合理的指示来回答,例如,唯一行的出现顺序(或排序顺序)的掩码,或这些行的索引(从零或一开始的索引),或由行组成的子矩阵(以任何顺序)或某些一种字典构造……–但要解释一下!

例子

[[1,2,3],[2,0,4],[6,3,0],[2,0,4],[6,3,0],[2,0,4]]

唯一的行是[1,2,3],,[2,0,4]并且[6,3,0]每次出现时各自分别贡献6、6和9。但是,它们分别出现一次,三次和两次,因此它们各自的出现对总数(42)的贡献分别为6、18和18,因此后两行是贡献最大的。因此,有效的答案是:

[false,true,true] 上面或 实际行的 外观/排序顺序或
[1,2]/ [2,3]基于零/一的索引的 掩码⋮
[[2,0,4],[6,3,0]]


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

[false,false,true](出现顺序)/ [false,true,false](排序次序)
[2]/ [3](出现顺序)/ [1]/ [2](排序次序)
[[2,3]]

Answers:




4

R,64字节

function(M)max(x<-tapply(rowSums(M),apply(M,1,toString),sum))==x

在线尝试!

以排序顺序(字典顺序)返回带有TRUE / FALSE的布尔向量。
唯一的行显示为矢量名称,因此很容易确定最有帮助的行。


3

Python 3中153个 145 129字节

-8个字节,感谢@Mr。Xcoder!

from itertools import*
def f(l):a=[[sum(map(sum,[*s])),k]for k,s in groupby(sorted(l))];return[v[1]for v in a if v[0]==max(a)[0]]

在线尝试!


2

Haskell,60个字节

import Data.Lists
f x=nub$argmaxes(\e->sum e*countElem e x)x

返回行列表。


2

木炭,25字节

IΦθ∧⁼κ⌕θι⁼×№θιΣι⌈Eθ×№θλΣλ

在线尝试!链接是详细版本的代码。默认输出格式是每行元素在其自己的行上,行以双倍行距隔开。说明:

  θ                         Input array
 Φ                          Filtered where
     κ                      Current index
    ⁼                       Equals
      ⌕                     First index of
        ι                   Current row
       θ                    In input array
   ∧                        Logical And
           №                Count of
             ι              Current row
            θ               In input array
          ×                 Multiplied by
              Σ             Sum of
               ι            Current row
         ⁼                  Equals
                ⌈           Maximum of
                  θ         Input array
                 E          Mapped over rows
                    №       Count of
                      λ     Current row
                     θ      In input array
                   ×        Multiplied by
                       Σ    Sum of
                        λ   Current row
I                           Cast to string
                            Implicitly printed

2

Mathematica,48个字节

Last[SortBy[Gather[m], Total[Flatten[#]] &]][[1]]

要么

TakeLargestBy[Gather[m], Total[#, 2] &, 1][[1, 1]]

哪里(例如)

m = {{1, 2, 3}, {2, 0, 4}, {7, 9, 5}, {6, 3, 0}, {2, 0, 4}, 
     {6, 3, 0}, {2, 0, 4}, {7, 9, 5}};

2
您可以使用简写形式并删除空格以保存字节:SortBy[Gather@m,Total@*Flatten][[-1,1]]
门把手

1
看起来它从预定义的变量获取输入,这是不允许的。默认情况下,提交的内容必须是完整的程序或功能。
丹尼斯,

TakeLargestBy[Gather[m], Total[#, 2] &, 1][[1, 1]] /@ m
David G. Stork

这是无效的;它仅返回具有最大值的行之一,而不是全部。
lirtosiast

1

JavaScript(ES6),88个字节

按出现顺序输出布尔值数组。

m=>m.map(h=o=r=>h=(v=o[r]=~~o[r]+eval(r.join`+`))<h?h:v)&&Object.keys(o).map(x=>o[x]==h)

在线尝试!








0

C#(Visual C#交互式编译器),126个字节

n=>{var i=n.OrderBy(a=>a.Sum()*n.Count(a.SequenceEqual));return i.Where((a,b)=>i.Take(b).Count(a.SequenceEqual)<1).Reverse();}

在线尝试!

由于列表的默认比较器不比较列表中的值,因此大部分代码都花在了删除所有重复值上。这意味着我不能使用Distinct()GroupBy()Contains过滤列表。


0

K(ngn / k),17个字节

{&a=|/a:+//'x@=x}

在线尝试!

{ } 带参数的功能 x

=x 组-形成一个字典,其中的键是行,值是它们在矩阵中的索引的列表

x@用它索引原始矩阵。结果再次是将行作为键的字典。值是相应密钥的多个副本

+//' 求和,直到每个收敛为止(仅作用于值;键保持原样)

a: 分配给 a

|/ 最大值(值)

a=|/a 行对布尔的字典,其中哪些行贡献最大

& “ where”,即哪些键对应于值1



0

05AB1E10 9 字节

ês{γOOZQÏ

在线尝试验证所有测试用例

说明:

ê          # Sort and uniquify the (implicit) input list of lists
           #  i.e. [[2,0,4],[1,2,3],[6,3,0],[2,0,4],[6,3,0],[2,0,4]]
           #   → [[1,2,3],[2,0,4],[6,3,0]]
 s         # Swap so the (implicit) input list of lists is at the top again
  {        # Sort it
           #  i.e. [[2,0,4],[1,2,3],[6,3,0],[2,0,4],[6,3,0],[2,0,4]]
           #   → [[1,2,3],[2,0,4],[2,0,4],[2,0,4],[6,3,0],[6,3,0]]
   γ       # Group the sorted list of lists
           #  i.e. [[1,2,3],[2,0,4],[2,0,4],[2,0,4],[6,3,0],[6,3,0]]
           #   → [[[1,2,3]],[[2,0,4],[2,0,4],[2,0,4]],[[6,3,0],[6,3,0]]]
    O      # Take the sum of each inner-most lists
           #  i.e. [[[1,2,3]],[[2,0,4],[2,0,4],[2,0,4]],[[6,3,0],[6,3,0]]]
           #   → [[6],[6,6,6],[9,9]]
     O     # Take the sum of each inner list
           #  i.e. [[6],[6,6,6],[9,9]] → [6,18,18]
      Z    # Get the max (without popping the list of sums)
           #  i.e. [6,18,18] → 18
       Q   # Check for each if this max is equal to the sum
           #  i.e. [6,18,18] and 18 → [0,1,1]
        Ï  # Filter the uniquified list of lists on truthy values (and output implicitly)
           #  i.e. [[1,2,3],[2,0,4],[6,3,0]] and [0,1,1] → [[2,0,4],[6,3,0]]

0

盖亚 10字节

ȯẋ_¦Σ¦:⌉=¦

在线尝试!

由于Gaia不太容易通过输入接受列表,因此该函数可以从堆栈顶部开始接受列表,并将结果放在顶部(作为排序顺序的掩码)。

ȯ           Sort the list
 ẋ          Split it into runs of the same element (in this case, runs of the same row)
  _¦        Flatten each sublist
    Σ¦      Sum each sublist
      :⌉    Find the maximum sum
        =¦  Compare each sum for equality with the maximum

0

J,16字节

[:(=>./)+/^:2/.~

在线尝试!

以外观顺序给出布尔结果的单子动词。

怎么运行的

[:(=>./)+/^:2/.~
             /.~  Self-classify; collect identical rows in appearance order
                  For each collected rows (= a matrix),
        +/^:2       Sum all the elements into one value
[:(=>./)          Compute the boolean vector:
    >./             Is the max of the array
   =                equal to this element?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.