具有大多数非零元素的行的索引


26

这很简单:将整数矩阵作为输入,并输出具有最多非零元素的行的索引。您可以假设只有一行具有最多非零的元素。

测试用例:

这些是1索引的,您可以选择是0还是1索引。

1
0
row = 1
---
0  -1
0   0
row = 1
---
1   1   0   0   0
0   0   5   0   0
2   3   0   0   0
0   5   6   2   2
row = 4
---
0   4   1   0
0   0  -6   0
0   1   4  -3
2   0   0   8
0   0   0   0
row = 3

Answers:





6

R,31个字节

pryr::f(which.min(rowSums(!m)))

返回带有矩阵的匿名函数:

function(m)which.min(rowSums(!m))

rowSums对行进行求和,!m并将0转换为1,将所有其他值转换为0。which.min返回第一行的包含最小总和的从1开始的索引(即,该行具有最少的零)。

在线尝试!


您需要,which.min()因为非零元素将通过变为FALSE !m
user2390246

@ user2390246哦,我完全误解了问题。固定,谢谢。
朱塞佩

5

Haskell,46 42 41字节

snd.minimum.(`zip`[1..]).map(filter(==0))

在线尝试!

怎么运行的

    map                    -- for each row
        (filter(==0))      -- collect the 0s
    (`zip`[1..])           -- pair with row index  (<#0s>, <index>)
  minimum                  -- find the minimum
snd                        -- extract index from pair

真好!比我更好,学习一些东西很好。
亨利

4

C#,69个字节

using System.Linq;m=>m.IndexOf(m.OrderBy(r=>r.Count(n=>n!=0)).Last())

以a List<int[]>作为输入并返回0索引的结果。


3

实际上,9个字节

0@♀cñ♂RmN

在线尝试!

说明:

0@♀cñ♂RmN
0@♀c       count zeroes in each row
    ñ♂R    enumerate and reverse each row (each row becomes [count, index] pair)
       m   minimum
        N  last element (the index)

3

Python 3,54 48字节

lambda a:a.index(min(a,key=lambda r:r.count(0)))

削减了6个字节。旧解决方案:

lambda a:min(range(len(a)),key=lambda i:a[i].count(0))

1
只是注意到它与python 2 answer的更改直接匹配。
CensoredUsername

3

APL(Dyalog),11个字节

(⊢⍳⌈/)+/0≠⎕

在线尝试!

0≠⎕ 布尔矩阵,其中非零

+/ 总行

( 将以下默认函数应用于和列表

⌈/ 最大的

 指数

 在参数列表中

)





2

Haskell- 69 68字节

感谢Siracusa,节省了一个字节!

行的索引为零

g=filter
m y=head$g((==maximum y).(y!!))[0..]
f=m.map(length.g(0/=))

用法

f [[1,1,0,0,0],[2,3,0,0,0],[0,5,6,2,2],[1,1,1,1,1]]

在线尝试!


定义可为g=filter您节省一个字节
siracusa

您甚至可以使用m y=length$takeWhile(<maximum y)y和缩短length而不是删除几个字节filter
siracusa

2

Clojure,64字节

这个也可以在输入中使用负数,幸运的是,其长度与原始数字相同:

#(nth(sort-by(fn[i](count(filter #{0}(% i))))(range(count %)))0)

原版的:

#(last(sort-by(fn[i](count(filter pos?(% i))))(range(count %))))

矩阵中的数字是整数。所以这pos?是不正确的
悬崖根

是的,我忘记考虑负整数了。立即修复。
NikoNyrh

2

q / kdb +,25 17 16字节

解:

(*)(<)sum(+)0=/:

例:

q)(*)(<)sum(+)0=/:enlist(1;0)
0
q)(*)(<)sum(+)0=/:(0 -1;0 0)
0
q)(*)(<)sum(+)0=/:(1 1 0 0 0;0 0 5 0 0;2 3 0 0 0;0 5 6 2 2)
3
q)(*)(<)sum(+)0=/:(0 4 1 0;0 0 -6 0;0 1 4 -3;2 0 0 8;0 0 0 0)
2

说明:

first iasc sum flip 0=/:  / ungolfed
                      /:  / each right, apply a function to each item to the right
                    0=    / returns boolean 1b or 0b if item in each list is equal to zero
               flip       / flip (rotate) the output
           sum            / sum these up
      iasc                / return indices if we were to sort ascending
first                     / take the first one

笔记:

问题很简单,这种解决方案感觉太复杂了。当我点击提交时,我意识到我的方式的错误。

奖金:

这是ak解决方案,权重为16 10 9字节-几乎完全相同,但短了7个字节,这是因为使用k内置函数时不需要括号,因此,结果比q关键字短(例如+/用于sum(将(+/)在q中)。

*<+/+0=/:



1

V,18字节

òø0
jòÚDuu/"
dGؾ

在线尝试!

与大多数V答案不同,这是0索引的。

00000000: f2f8 300a 6af2 da44 7575 2f12 220a 6447  ..0.j..Duu/.".dG
00000010: d8be                                     ..

对于没有数字支持的语言来说还不错! ;P

我还发现count命令的大写变体(即)Ø被严重破坏了。


1

Python 3,92个字节

def f(x):
    for e in x:
        e.sort()
    y=x[:]
    y.sort()
    return x.index(y[-1])

首先对每一行[0,0,..,0,x,x,x]进行排序,以便对条目进行排序,然后对整个矩阵进行排序,以便最后一个条目y是我们要查找的行。该副本y=x[:]是必需的,因为它.sort()可以在原地工作,因此我们不知道排序后的原始索引。

感谢您提供有关如何进一步解决此问题的帮助。由于每行中的空格,大多数字节会丢失。代码本身只有68个字节长。

在线尝试!


1
我不了解Python,但是您不能从中删除大部分空白吗?
TheLethalCoder

@TheLethalCoder Python使用缩进代替代码块的括号,而不是括号或关键字(例如,.. end)。
P. Siehr

1
即使这样,蟒蛇也可以打很多。以下等效于您的原始代码:def f(a):b=list(map(sorted,a));return b.index(sorted(b)[-1])
CensoredUsername

这个答案使用了for循环和一个函数,但是没有换行符,因此我假设您可以删除很多,尽管它是Python 2,空白限制应该相似。
TheLethalCoder



1

JavaScript(ES6),62个字节

0索引。将2D数组作为输入。

a=>(a=a.map(x=>x.filter(y=>y).length)).indexOf(Math.max(...a))

您可以为此添加解释吗?是否filter隐式“过滤”零?
TheLethalCoder

您应该返回该行的索引...
Neil

仍在尝试更多的方法,@ TheLethalCoder将在完成后添加一个演示和说明。同时,请注意此处以获取更多信息,请filter记住这0是错误的。
毛茸茸的

@Neil:现在已修复。
粗野的

@Shaggy我以为就是这样,filter只是要确定一下。
TheLethalCoder


1

Pyth,6个字节

xQh/D0

示范

我没有找到具有非零元素最多的行,而是找到了具有最少零元素的行。

/D0D/零(0)的计数()排序()。隐式应用于Q,输入。

h:采用第一个也是最小的元素。

xQx在该Q元素的输入()中找到索引()。


这正是我的健康。感觉很笨拙,就像我错过了一些东西,但是似乎没有一种干净的方法来做到这一点:(
FryAmTheEggman


1

Java 8,145字节

import java.util.*;m->{int t=0,s=0,i=0,r=0;for(;i<m.size();i++){List l=(List)m.get(i);for(;l.remove(0L););s=l.size();if(s>t){t=s;r=i;}}return r;}

丑陋,但是行得通..

说明:

在这里尝试。

import java.util.*;         // Required import for List

m->{                        // Method with List parameter and integer return-type
  int t=0,s=0,i=0,          //  Temp integers
      r=0;                  //  Result integer
  for(;i<m.size();i++){     //  Loop over the List of Lists
    List l=(List)m.get(i);  //   Get the inner List
    for(;l.remove(0L););    //   Remove all zeros
    s=l.size();             //   Get the size of the List
    if(s>t){                //   If this size is larger than the previous
      t=s;                  //    Set `t` to this size
      r=i;                  //    And set the result to the index of this row
    }
  }                         //  End of loop
  return r;                 //  Return result-integer
}                           // End of method

1

Java(OpenJDK 8)119101字节

m->{int i=m.length,M=0,I=0,c;for(;i-->0;){c=0;for(int x:m[i])if(x!=0)c++;if(c>M){M=c;I=i;}}return I;}

在线尝试!

Java,那冗长的语言:)

感谢您保存18个字节,@KevinCruijssen;)


+1个不错的答案。即将发布一个更详细的回答自己..当时怀疑是否张贴,这是一件好事,我没有,因为它是145个字节和丑陋..;)这是...编辑:嗯,顺便说一句,你的最后两个测试用例失败..
凯文Cruijssen

检查您的代码只是让我意识到答案中存在错误!o_O我什至不知道我的测试用例如何通过……
OlivierGrégoire17年

好去,我修好了!
奥利维尔·格雷戈尔

1
真好!顺便说一句,您可以通过使用for-each内循环来摆脱它j以及其他更长的部分j=m[i].length,m[i][j]例如:m->{int i=m.length,M=0,I=0,c;for(;i-->0;){c=0;for(int x:m[i])if(x!=0)c++;if(c>M){M=c;I=i;}}return I;}101 bytes
Kevin Cruijssen

1

JavaScript(ES6),51字节

m=>m.reduce((a,e,i)=>e.filter(x=>x).length>a?i:a,0)

其中m是2D数组,返回的索引为0索引

测试用例:


1

Java 8,100字节

m->m.indexOf(m.stream().map(z->{z.removeIf(x->x==0);return z;}).max((q,r)->q.size()-r.size()).get())

说明

列表和流的力量!(并且没有导入,要启动!)

让我们把这个小lambda分解成小块:

m.stream().map(z->{z.removeIf(x->x==0);return z;}

我们将列表列表(问题中的矩阵)转换为流,并遍历每个元素,从每个子列表中删除所有讨厌的零。我们每次都需要在此处显式返回子列表,因为Stream.map()将Stream中的每个对象都转换为映射返回的内容,并且我们不想更改它们。

.max((q,r)->q.size()-r.size()).get()

我们遍历新近归零的子列表,然后简单地检查它们彼此相邻的大小,使我们成为最大的子列表。之所以这样,.get()是因为Stream.max()返回的是Optional,需要额外的函数调用。

m.indexOf()

我们选择了最大的子列表,并在主列表中找到它,从而为我们提供了结果!

笔记

如果外部列表为空,这会中断,但是我正在

您可以假设只有一行具有最多非零的元素。

暗示将总是至少有一行。如果我错了纠正我。


1

Python 2,51个字节

def f(x,i=0):print i;x[i].remove(0);f(x,-~i%len(x))

在线尝试!

此版本通过数组逐步删除0,打印当前索引,并且在没有更多要删除的零时崩溃。最后打印的索引就是答案。

Python 2,57字节

lambda x,i=0:0in x[i]>x[i].remove(0)and f(x,-~i%len(x))|i

在线尝试!

想要尝试一种不同于此处已有方法的方法。因此,在这里我递归地遍历数组,一次删除一个0,直到当前数组不再具有任何零为止,然后输出该数组的索引。


1

Japt,7个字节

0索引。将输入作为数组的数组。

mè
bUrw

测试一下


说明

数组的隐式输入U
[[0,4,1,0],[0,0,-6,0],[0,1,4,-3],[2,0,0,8],[0,0,0,0]]

映射(mU返回每个子数组中真实(非零)元素的数量。隐式将此新数组分配给U
[2,1,3,2,0]

Urw

通过获取当前值和当前元素中的较大者来减少(r)数组U
3

b

获取U元素等于该值的第一个索引,并隐式输出结果。
2

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.