답변:
!gs&X>
입력은 ;
행 분리 자로 매트릭스 입니다.
온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .
! % Transpose
g % Logical: convert non-zeros to 1
s % Sum of each column, or sum of row if there's a single row
&X> % Arg max. Implicitly display
ΣĀ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
pryr::f(which.min(rowSums(!m)))
행렬을 취하는 익명 함수를 반환합니다.
function(m)which.min(rowSums(!m))
rowSums
!m
0을 1 로 변환하고 다른 모든 것을 0 으로 변환 하여 행을 합산합니다 which.min
. 최소 합을 포함하는 첫 번째 행의 1 기반 인덱스 (즉, 어떤 행이 0이 가장 적은지)를 반환합니다.
which.min()
0이 아닌 요소는로 거짓이기 때문에 필요 합니다 !m
.
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
using System.Linq;m=>m.IndexOf(m.OrderBy(r=>r.Count(n=>n!=0)).Last())
a List<int[]>
를 입력으로 취하여 0으로 색인 된 결과를 리턴합니다.
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)
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))
(⊢⍳⌈/)+/0≠⎕
0≠⎕
0이 아닌 부울 행렬
+/
합계 행
(
다음의 암묵적 기능을 합계 목록에 적용하십시오
⌈/
최대
⍳
색인
⊢
인수 목록에서
)
TL$€M
1- 색인.
너무 많은 5 바이트 버전 ...
TL$€M
, T€L€M
, TJ$€M
, T€J€M
, ¬¬Ṣ€M
, ṠAṢ€M
, ṠAS€M
, AṠṢ€M
, AṠS€M
, ¬ċ€0M
, ...
시라쿠사 덕분에 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 바이트를 절약 할 수 있습니다.
m y=length$takeWhile(<maximum y)y
짧게 제거 할 수도 있습니다.length
filter
이것은 입력에서 음수로도 작동합니다. 운 좋게도 원래 길이와 같은 길이입니다.
#(nth(sort-by(fn[i](count(filter #{0}(% i))))(range(count %)))0)
기발한:
#(last(sort-by(fn[i](count(filter pos?(% i))))(range(count %))))
pos?
정확하지 않습니다
해결책:
(*)(<)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=/:
òø0
jòÚDuu/"
dGؾ
대부분의 V 답변과 달리 이것은 인덱스가 0입니다.
00000000: f2f8 300a 6af2 da44 7575 2f12 220a 6447 ..0.j..Duu/.".dG
00000010: d8be ..
숫자를 지원하지 않는 언어에는 나쁘지 않습니다! ;P
또한 count 명령 의 대문자 변형 , 즉 Ø
끔찍한 것이 발견되었습니다 .
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 바이트입니다.
def f(a):b=list(map(sorted,a));return b.index(sorted(b)[-1])
0
하고 min()
대신 사용max()
input()
대신def
lambda
and hash-map lambda x:x.index(min(x,key=lambda n:n.count(0)))
min
, key
매개 변수 와 함께 사용 합니다
인덱스가 0입니다. 2D 배열을 입력으로받습니다.
a=>(a=a.map(x=>x.filter(y=>y).length)).indexOf(Math.max(...a))
filter
"필터"제로 암시?
filter
인지 확인 했다고 가정했다 .
ċ0$ÞḢi@
ċ0$ÞḢi@ Main link
Þ Sort by
ċ0$ the number of occurences of 0
Ḣ Take the first element
i@ Index in the original array
%M`\b0
m`(?<=(¶.+)*)$
;$#1
O#`.+
!`(?<=^.+;).+
인덱스가 0입니다. 양수 및 음수 (및 0)와 함께 작동합니다. 선행 0이 없다고 가정합니다.
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
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 바이트를 저장해 주셔서 감사합니다.)
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;}
m=>m.reduce((a,e,i)=>e.filter(x=>x).length>a?i:a,0)
여기서 m
2D 배열이며 반환되는 인덱스는 0 인덱스입니다.
테스트 사례 :
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이 아닌 행이 하나만 있다고 가정 할 수 있습니다.
항상 하나 이상의 행이 있음을 의미합니다. 틀 렸으면 말해줘.
def f(x,i=0):print i;x[i].remove(0);f(x,-~i%len(x))
이 버전은 배열을 통해 0을 점진적으로 제거하고 현재 색인을 인쇄하며 제거 할 0이 더 이상 없으면 충돌합니다. 마지막으로 인쇄 된 색인이 정답입니다.
lambda x,i=0:0in x[i]>x[i].remove(0)and f(x,-~i%len(x))|i
이미 존재하는 것과 다른 접근법을 시도하고 싶었습니다. 따라서 현재 배열에 더 이상 0이 없을 때까지 한 번에 하나의 0을 제거하여 배열을 반복적으로 반복 한 다음 해당 배열의 색인을 출력합니다.
인덱스가 0입니다. 입력을 배열의 배열로받습니다.
mè
bUrw
배열의 암시 적 입력 U
.[[0,4,1,0],[0,0,-6,0],[0,1,4,-3],[2,0,0,8],[0,0,0,0]]
mè
각 하위 배열에서 진실 (0이 아닌) 요소 수를 반환하는 맵 ( m
) U
. 이 새 배열을에 암시 적으로 할당합니다 U
.[2,1,3,2,0]
Urw
현재 값과 현재 요소를 크게하여 ( r
) 배열 U
을 줄 입니다.3
b
U
요소가 해당 값과 동일한 첫 번째 색인을 가져 오고 결과를 내재적으로 출력하십시오.2
Ā
대신에 사용하십시오Ä0›
.