Chỉ số của hàng với hầu hết các phần tử khác không


26

Đây là một cách đơn giản: Lấy một ma trận các số nguyên làm đầu vào và xuất chỉ mục của hàng với các phần tử khác không nhất. Bạn có thể cho rằng sẽ chỉ có một hàng có hầu hết các phần tử khác không.

Các trường hợp thử nghiệm:

Đây là 1 chỉ mục, bạn có thể chọn nếu bạn muốn 0 hoặc 1 chỉ mục.

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

Câu trả lời:




6

05AB1E , 8 6 byte

ΣĀO}θk

Hãy thử trực tuyến!

-2 byte nhờ Erik the Outgolfer

Giải trình

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

Sử dụng Āthay vì Ä0›cho -2.
Erik the Outgolfer

Yee chỉ nhận ra có lẽ có một cách tốt hơn để làm phần đó hơn những gì tôi đã có. Chết tiệt, tôi cảm thấy như đang học một lệnh 05AB1E mới mỗi ngày ^^
Datboi

6

R , 31 byte

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

trả về một hàm ẩn danh có ma trận:

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

rowSumstính tổng các hàng, với việc !mbiến đổi 0 thành 1 và mọi thứ khác thành 0. which.mintrả về chỉ số dựa trên 1 của hàng đầu tiên chứa tổng nhỏ (nghĩa là hàng nào có số 0 ít nhất).

Hãy thử trực tuyến!


Bạn cần which.min()vì các phần tử khác không sẽ trở thành FALSE với !m.
dùng2390246

@ user2390246 oh, wow, tôi hoàn toàn đọc sai câu hỏi. Đã sửa, cảm ơn bạn.
Giuseppe

5

Haskell, 46 42 41 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

    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

Tốt đẹp! Tốt hơn tôi, tốt để học một cái gì đó.
Henry

4

C #, 69 byte

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

Lấy List<int[]>đầu vào làm đầu vào và trả về kết quả được lập chỉ mục 0.




3

APL (Dyalog) , 11 byte

(⊢⍳⌈/)+/0≠⎕

Hãy thử trực tuyến!

0≠⎕ Ma trận Boolean nơi khác không

+/ tổng hàng

( áp dụng hàm ngầm định sau vào danh sách tổng

⌈/ tối đa

 mục lục

 trong danh sách đối số

)





2

Haskell - 69 68 byte

Đã lưu một byte nhờ Siracusa!

Hàng không được lập chỉ mục

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

Sử dụng

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

Hãy thử trực tuyến!


Xác định g=filtergiúp bạn tiết kiệm một byte
siracusa

Bạn thậm chí có thể xóa thêm một vài byte bằng m y=length$takeWhile(<maximum y)yvà rút ngắn lengththay vìfilter
siracusa

2

Clojure, 64 byte

Cái này cũng hoạt động với các số âm trong đầu vào, may mắn là cùng độ dài với bản gốc:

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

Nguyên:

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

số trong ma trận là số nguyên. vì vậy pos?không đúng
cliffroot

Đúng, tôi quên tài khoản cho số nguyên âm. Đã sửa bây giờ.
NikoNyrh

2

q / kdb +, 25 17 16 byte

Dung dịch:

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

Thí dụ:

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

Giải trình:

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

Ghi chú:

Vấn đề khá đơn giản, giải pháp này cảm thấy quá phức tạp. Ngay khi tôi nhấn trình, tôi nhận ra lỗi của mình.

Tiền thưởng:

Đây là giải pháp có trọng lượng 16 10 9 byte - gần như giống hệt nhau nhưng ngắn hơn 7 byte do thực tế chúng ta không cần dấu ngoặc khi sử dụng k dựng sẵn và kết quả là một số trở nên ngắn hơn từ khóa q ( ví dụ +/cho sum(sẽ (+/)ở q)).

*<+/+0=/:



1

V , 18 byte

òø0
jòÚDuu/"
dGؾ

Hãy thử trực tuyến!

Không giống như hầu hết các câu trả lời V, đây là 0 chỉ mục.

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

Không tệ cho một ngôn ngữ không có hỗ trợ số! ;P

Tôi cũng đã phát hiện ra rằng biến thể chữ hoa của lệnh đếm , nghĩa là Øbị phá vỡ khủng khiếp.


1

Python 3 , 92 byte

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

Đầu tiên sắp xếp mỗi hàng sao cho các mục nhập [0,0,..,0,x,x,x]sau đó sắp xếp toàn bộ ma trận, sao cho mục nhập cuối cùng ylà hàng chúng ta đang tìm kiếm. Bản sao y=x[:]là cần thiết, vì .sort()hoạt động tại chỗ, do đó chúng tôi không biết chỉ mục gốc sau khi sắp xếp.

Tôi đánh giá cao bất kỳ trợ giúp làm thế nào để chơi golf giải pháp này hơn nữa. Hầu hết các byte bị mất vì các khoảng trắng trong mỗi dòng. Bản thân mã chỉ dài 68 byte.

Hãy thử trực tuyến!


1
Tôi không biết Python nhưng bạn không thể xóa hầu hết khoảng trắng khỏi đây?
TheLethalCoder

@TheLethalCoder Python sử dụng thụt lề thay vì dấu ngoặc cho mã cơ sở, thay vì dấu ngoặc hoặc từ khóa (ví dụ: .. end).
P. Siehr

1
Thậm chí sau đó trăn có thể được đánh golf một số tiền hợp lý. Mã sau đây tương đương với mã gốc của bạn:def f(a):b=list(map(sorted,a));return b.index(sorted(b)[-1])
CensoredUsername

Câu trả lời này sử dụng một vòng lặp for và một hàm nhưng không có dòng mới vì vậy tôi giả sử bạn có thể loại bỏ rất nhiều trong số chúng mặc dù đó là Python 2, các hạn chế về khoảng trắng sẽ tương tự nhau.
TheLethalCoder


1

Python 2 , 64 55 52 48 byte

  • Cảm ơn @Rod đã cạo 9 byte !! : đếm 0s và sử dụngmin() thay vìmax()
  • @Rod đã lưu thêm 3 byte: sử dụng input()thay vìdef
  • @ovs đã lưu 4 byte : sử dụng lambdavà hash-map
lambda x:x.index(min(x,key=lambda n:n.count(0)))

Hãy thử trực tuyến!



Cảm ơn @ovs. Tôi đã không hiểu chính xác làm thế nào nó hoạt động mặc dù.
chính thức

1
Nó ít nhiều giống với logic mà bạn có trong câu trả lời của mình, nhưng sử dụng minvới keytham số
Rod

1

JavaScript (ES6), 62 byte

Chỉ số 0. Lấy một mảng 2D làm đầu vào.

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

Bạn có thể thêm một lời giải thích cho điều này? Có filterngầm "lọc" số không?
TheLethalCoder

Bạn phải trả lại chỉ số của hàng ...
Neil

Vẫn đang cố gắng chơi golf thêm nữa, @TheLethalCoder, sẽ thêm một bản demo và một lời giải thích khi tôi hoàn thành. Trong khi chờ đợi, hãy xem ở đây để biết thêm thông tin filter, hãy nhớ rằng đó 0là falsey.
Xù xì

@Neil: Đã sửa bây giờ.
Xù xì

@Shaggy Tôi cho rằng đó là trường hợp filterchắc chắn.
TheLethalCoder


1

Bình thường, 6 byte

xQh/D0

Trình diễn

Thay vì tìm hàng có nhiều phần tử khác không, tôi tìm hàng có phần tử bằng 0.

/D0: Sắp xếp ( D) theo số ( /) của số không ( 0). Ngẫu nhiên áp dụng cho Q, đầu vào.

h: Lấy phần tử đầu tiên và tối thiểu.

xQ: Tìm chỉ mục ( x) trong đầu vào ( Q) của phần tử đó.


Đây chính xác là những gì tôi đã có một cái giếng. Nó cảm thấy cồng kềnh và giống như tôi đang thiếu thứ gì đó, nhưng có vẻ như không có cách nào để làm điều đó :(
FryAmTheEggman


1

Java 8, 145 byte

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

Xấu xí, nhưng nó hoạt động ..

Giải trình:

Hãy thử nó ở đây.

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) , 119 101 byte

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

Hãy thử trực tuyến!

Java, ngôn ngữ dài dòng ngọt ngào đó :)

Cảm ơn vì đã lưu 18 byte, @KevinCruijssen;)


+1 câu trả lời hay. Tôi đã tự mình đăng một câu trả lời dài dòng hơn nữa .. Không biết có nên đăng nó không, và đó là điều tốt mà tôi đã không có vì nó là 145 byte và xấu xí ..;) Đây là ... EDIT: Hmm, btw, hai trường hợp thử nghiệm cuối cùng của bạn đều thất bại ..
Kevin Cruijssen

Kiểm tra mã của bạn chỉ khiến tôi nhận ra có một lỗi trong câu trả lời của tôi! o_O Tôi thậm chí không biết các trường hợp thử nghiệm của mình vượt qua như thế nào ...
Olivier Grégoire

Tốt để đi, tôi đã sửa nó!
Olivier Grégoire

1
Tốt đẹp! Btw, bạn có thể chơi golf nó bằng cách sử dụng một vòng lặp for-each bên trong để thoát khỏi jvà các bộ phận còn khác như j=m[i].length,m[i][j]như thế này: 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 byte )
Kevin Cruijssen

1

JavaScript (ES6), 51 byte

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

trong đó mmột mảng 2D và chỉ mục được trả về là 0-index

Các trường hợp thử nghiệm:


1

Java 8, 100 byte

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

Giải trình

Sức mạnh của Danh sách và Luồng! (và không có nhập khẩu, để khởi động!)

Chúng ta hãy chia lambda nhỏ này thành nhiều phần:

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

Chúng tôi biến Danh sách Danh sách của chúng tôi (ma trận trong câu hỏi) thành Luồng và đi qua từng phần tử, loại bỏ tất cả các số 0 phiền phức đó khỏi mỗi Danh sách phụ. Chúng tôi cần trả lại rõ ràng danh sách phụ mỗi lần ở đây, vì Stream.map()chuyển đổi từng đối tượng trong Luồng thành bất kỳ thứ gì ánh xạ trả về và chúng tôi không muốn thay đổi chúng.

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

Chúng tôi đi qua các danh sách con mới, và chỉ cần kiểm tra xem chúng lớn như thế nào cạnh nhau, đưa chúng tôi vào danh sách phụ lớn nhất. Các .get()là vì Stream.max()trả về một tùy chọn, đòi hỏi rằng chức năng thêm cuộc gọi.

m.indexOf()

Chúng tôi lấy danh sách phụ lớn nhất đó và tìm vị trí của nó trong Danh sách chính, cho chúng tôi kết quả!

Ghi chú

Điều này sẽ phá vỡ nếu danh sách bên ngoài trống, nhưng tôi đang dùng

Bạn có thể cho rằng sẽ chỉ có một hàng có hầu hết các phần tử khác không.

để ngụ ý rằng sẽ luôn có ít nhất một hàng. Sửa lỗi cho tôi nếu tôi sai.


1

Python 2 , 51 byte

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

Hãy thử trực tuyến!

Phiên bản này loại bỏ 0s dần dần thông qua các mảng, in chỉ mục hiện tại và gặp sự cố khi không còn số không để xóa. Chỉ số in cuối cùng là câu trả lời.

Python 2 , 57 byte

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

Hãy thử trực tuyến!

Muốn thử một cách tiếp cận khác với những gì đã có ở đây. Vì vậy, ở đây tôi lặp lại đệ quy trên mảng loại bỏ một 0 tại một thời điểm cho đến khi mảng hiện tại không còn bất kỳ số 0 nào - và sau đó xuất chỉ mục của mảng đó.


1

Japt , 7 byte

Chỉ số 0. Đưa đầu vào như một mảng của mảng.

mè
bUrw

Kiểm tra nó


Giải trình

Đầu vào ngầm định của mảng U.
[[0,4,1,0],[0,0,-6,0],[0,1,4,-3],[2,0,0,8],[0,0,0,0]]

Map ( m) Utrả về số lượng phần tử trung thực (khác không) trong mỗi mảng con. Hoàn toàn gán mảng mới này cho U.
[2,1,3,2,0]

Urw

Giảm rmảng ( ) Ubằng cách lấy giá trị hiện tại và phần tử hiện tại lớn hơn.
3

b

Lấy chỉ mục đầu tiên trong Uđó phần tử bằng giá trị đó và hoàn toàn đưa ra kết quả.
2

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.