0이 아닌 요소가 가장 많은 행의 인덱스


26

이것은 간단한 것입니다 : 정수 행렬을 입력으로 취하고 0이 아닌 요소가있는 행의 색인을 출력하십시오. 요소가 0이 아닌 행이 하나만 있다고 가정 할 수 있습니다.

테스트 사례 :

이들은 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

답변:




6

05AB1E , 8 6 바이트

ΣĀO}θk

온라인으로 사용해보십시오!

Outgolfer Erik 덕분에 -2 바이트

설명

ΣĀO}θk
Σ  }   # Sort input by following code
 Ā      # Is element not 0? (vectorized)
  O     # Sum
    θk # Get index of "largest" element
       # Implicit print

-2 Ā대신에 사용하십시오 Ä0›.
Outgolfer Erik

방금 내가 가진 것보다 그 부분을 수행하는 더 좋은 방법이 있다는 것을 깨달았습니다. 젠장, 매일 새로운 05AB1E 명령을 배우고있는 것 같아요 ^^
Datboi

6

R , 31 바이트

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

행렬을 취하는 익명 함수를 반환합니다.

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

rowSums!m0을 1 로 변환하고 다른 모든 것을 0 으로 변환 하여 행을 합산합니다 which.min. 최소 합을 포함하는 첫 번째 행의 1 기반 인덱스 (즉, 어떤 행이 0이 가장 적은지)를 반환합니다.

온라인으로 사용해보십시오!


which.min()0이 아닌 요소는로 거짓이기 때문에 필요 합니다 !m.
user2390246 2016 년

@ user2390246 오, 와우, 나는 질문을 완전히 잘못 읽었습니다. 고마워요
주세페

5

하스켈, 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

좋은! 내 것보다 낫고, 배우는 것이 좋습니다.
Henry

4

C #, 69 바이트

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

a List<int[]>를 입력으로 취하여 0으로 색인 된 결과를 리턴합니다.



3

파이썬 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
방금 파이썬 2 답변의 변경 사항과 직접 일치한다는 것을 알았습니다.
검열 된 사용자 이름





2

하스켈 -69 68 바이트

시라쿠사 덕분에 1 바이트 절약!

행은 인덱스가 0입니다

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하면 1 바이트를 절약 할 수 있습니다.
siracusa

대신에 몇 바이트를 더 m y=length$takeWhile(<maximum y)y짧게 제거 할 수도 있습니다.lengthfilter
siracusa

2

클로저, 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?정확하지 않습니다
cliffroot

사실, 음의 정수를 설명하는 것을 잊었습니다. 지금 수정했습니다.
NikoNyrh 2016 년

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

노트:

문제는 매우 간단합니다.이 솔루션은 지나치게 복잡합니다. 제출을 누르 자마자 내 길의 오류를 깨달았습니다.

보너스:

다음은 16 10 9 바이트의 가중치를 갖는 ak 솔루션입니다 .k 내장을 사용할 때 대괄호가 필요하지 않기 때문에 거의 정확히 동일하지만 7 바이트가 짧아서 결과적으로 일부는 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

파이썬 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
파이썬을 모르지만 대부분의 공백을 제거 할 수 없습니까?
TheLethalCoder 2016 년

@TheLethalCoder Python은 코드 블록에 대괄호 대신 대괄호 또는 키워드 대신 들여 쓰기를 사용합니다 (예 : .. end).
P. Siehr

1
그럼에도 불구하고 파이썬은 상당한 금액으로 골프를 칠 수 있습니다. 다음은 원래 코드와 동일합니다.def f(a):b=list(map(sorted,a));return b.index(sorted(b)[-1])
CensoredUsername

이 답변 은 for 루프와 함수를 사용하지만 줄 바꿈이 없으므로 파이썬 2이지만 공백 제한이 비슷해야하지만 많은 것을 제거 할 수 있다고 가정합니다.
TheLethalCoder


1

파이썬 2 , 64 55 52 48 바이트

  • 9 바이트를 면도 해 준 @Rod에게 감사드립니다 !! :를 계산 0하고 min()대신 사용max()
  • @Rod는 또 다른 3 바이트를 저장 : 사용하는 input()대신def
  • @ovs 저장 4 바이트 : use lambdaand hash-map
lambda x:x.index(min(x,key=lambda n:n.count(0)))

온라인으로 사용해보십시오!



감사합니다 @ovs. 나는 그것이 어떻게 작동하는지 정확하게 이해하지 못했습니다.
officialaimm

1
그것은 당신이 당신의 대답과 거의 같은 논리 이지만 min, key매개 변수 와 함께 사용 합니다
Rod

1

자바 스크립트 (ES6), 62 바이트

인덱스가 0입니다. 2D 배열을 입력으로받습니다.

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

이것에 대한 설명을 추가 할 수 있습니까? 합니까 filter"필터"제로 암시?
TheLethalCoder

행의 인덱스를 반환해야합니다.
Neil

@TheLethalCoder는 여전히 더 많은 골프를 치기 위해 데모와 설명을 추가 할 것입니다. 한편, 참조 여기 에 대한 추가 정보를 원하시면 filter염두에두고, 0falsey입니다.
얽히고 설킨

@Neil : 이제 수정되었습니다.
얽히고 설킨

@Shaggy 나는 그것이 사실 filter인지 확인 했다고 가정했다 .
TheLethalCoder


1

Pyth, 6 바이트

xQh/D0

데모

0이 아닌 요소가 가장 많은 행을 찾는 대신 요소가 가장 적은 행을 찾습니다.

/D0: D카운트 ( /)를 0으로 정렬 ( 0)합니다. Q입력에 암시 적으로 적용됩니다 .

h: 첫 번째 및 최소 요소를 가져옵니다.

xQ: 해당 요소 x의 입력 ( Q) 에서 색인 ( )을 찾으십시오 .


이것은 내가 잘했던 것입니다. 그것은 울퉁불퉁하다고 느꼈고 뭔가 빠진 것처럼 보이지만 그것을 할 수있는
확실한


1

자바 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

자바 (오픈 JDK 8) , 119 (101) 바이트

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;}

온라인으로 사용해보십시오!

자바, 그 달콤한 장황한 언어 :)

@KevinCruijssen 18 바이트를 저장해 주셔서 감사합니다.)


+1 좋은 답변. 더 자세한 답변을 직접 게시하려고했습니다 .. 게시할지 여부를 의심하고 있었으며 145 바이트 이후로 나쁘지 않은 것이 좋았습니다.;) 여기 있습니다 ... 편집 : 흠, btw, 당신의 마지막 두 테스트 케이스가 실패합니다.
Kevin Cruijssen

코드를 확인하면 내 답변에 버그가 있음을 알게되었습니다! O_O 난 내 테스트 케이스가 ... 통과 방법을 모른다
올리비에 그레 구 아르

잘 했어요, 고 쳤어요!
Olivier Grégoire

1
좋은! Btw, 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;}
칠 수 있습니다

1

자바 스크립트 (ES6), 51 바이트

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

여기서 m2D 배열이며 반환되는 인덱스는 0 인덱스입니다.

테스트 사례 :


1

자바 8, 100 바이트

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

설명

리스트와 스트림의 힘! (가져 오기없이 부팅 할 수 있습니다!)

이 작은 람다를 덩어리로 나누자.

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

우리는 List of Lists (질문의 행렬)를 Stream으로 바꾸고 각 요소를 통과하여 각 하위 목록에서 성가신 제로를 모두 제거합니다. Stream.map()Stream의 각 객체를 매핑이 반환하는 대상으로 변환 하기 때문에 매번 하위 목록을 명시 적으로 반환해야하며 변경하지 않기 때문입니다.

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

우리는 새로 제로화되지 않은 하위 목록을 살펴보고 서로 얼마나 큰지 확인하여 가장 큰 하위 목록을 얻습니다. 이는 추가 함수 호출이 필요한 Optional을 반환 .get()하기 때문 Stream.max()입니다.

m.indexOf()

가장 큰 하위 목록을 가져 와서 기본 목록의 위치를 ​​찾아서 결과를 제공합니다!

노트

외부 목록이 비어 있으면 중단되지만 복용 중입니다.

요소가 0이 아닌 행이 하나만 있다고 가정 할 수 있습니다.

항상 하나 이상의 행이 있음을 의미합니다. 틀 렸으면 말해줘.


1

파이썬 2 , 51 바이트

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

온라인으로 사용해보십시오!

이 버전은 배열을 통해 0을 점진적으로 제거하고 현재 색인을 인쇄하며 제거 할 0이 더 이상 없으면 충돌합니다. 마지막으로 인쇄 된 색인이 정답입니다.

파이썬 2 , 57 바이트

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

온라인으로 사용해보십시오!

이미 존재하는 것과 다른 접근법을 시도하고 싶었습니다. 따라서 현재 배열에 더 이상 0이 없을 때까지 한 번에 하나의 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]]

각 하위 배열에서 진실 (0이 아닌) 요소 수를 반환하는 맵 ( m) U. 이 새 배열을에 암시 적으로 할당합니다 U.
[2,1,3,2,0]

Urw

현재 값과 현재 요소를 크게하여 ( r) 배열 U을 줄 입니다.
3

b

U요소가 해당 값과 동일한 첫 번째 색인을 가져 오고 결과를 내재적으로 출력하십시오.
2

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.