Indeks baris dengan elemen paling tidak nol


26

Ini sederhana: Ambil matriks bilangan bulat sebagai input, dan output indeks baris dengan elemen paling tidak nol. Anda dapat berasumsi bahwa hanya akan ada satu baris dengan elemen paling tidak nol.

Kasus uji:

Ini adalah 1-diindeks, Anda dapat memilih jika Anda ingin 0 atau 1-diindeks.

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

Jawaban:




6

05AB1E , 8 6 byte

ΣĀO}θk

Cobalah online!

-2 Bytes terima kasih kepada Erik the Outgolfer

Penjelasan

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

Gunakan Āsebagai ganti Ä0›untuk -2.
Erik the Outgolfer

Yee baru menyadari mungkin ada cara yang lebih baik untuk melakukan bagian itu daripada apa yang saya miliki. Sialan aku merasa seperti aku belajar perintah 05AB1E baru setiap hari ^^
Datboi

6

R , 31 byte

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

mengembalikan fungsi anonim yang mengambil matriks:

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

rowSumsmenjumlahkan baris, dengan !mmengubah 0 menjadi 1 dan yang lainnya menjadi 0.which.min mengembalikan indeks berbasis 1 dari baris pertama yang berisi jumlah minimum (yaitu, baris yang memiliki nol paling sedikit).

Cobalah online!


Anda perlu which.min()karena elemen yang tidak nol akan menjadi SALAH dengan !m.
user2390246

@ user2390246 oh, wow, saya salah membaca pertanyaan. Diperbaiki, terima kasih.
Giuseppe

5

Haskell, 46 42 41 byte

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

Cobalah online!

Bagaimana itu bekerja

    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

Bagus! Lebih baik dari saya, baik untuk belajar sesuatu.
Henry

4

C #, 69 byte

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

Mengambil List<int[]>input sebagai dan mengembalikan hasil terindeks 0.


3

Sebenarnya , 9 byte

0@♀cñ♂RmN

Cobalah online!

Penjelasan:

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 byte

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

Dicukur 6 byte. Solusi lama:

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

1
Hanya perhatikan itu cocok langsung dengan perubahan pada jawaban python 2 sekarang.
CensoredUsername

3

APL (Dyalog) , 11 byte

(⊢⍳⌈/)+/0≠⎕

Cobalah online!

0≠⎕ Matriks Boolean di mana bukan nol

+/ jumlah baris

( menerapkan fungsi diam-diam berikut ke daftar jumlah

⌈/ maksimum

 indeks

 dalam daftar argumen

)





2

Haskell - 69 68 Bytes

Disimpan satu byte berkat Siracusa!

Baris tidak diindeks

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

Pemakaian

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

Cobalah online!


Menentukan g=filtermenghemat satu byte
siracusa

Anda bahkan dapat menghapus beberapa byte lebih banyak dengan m y=length$takeWhile(<maximum y)ydan memperpendek lengthalih-alihfilter
siracusa

2

Clojure, 64 byte

Yang ini juga berfungsi dengan angka negatif dalam input, untungnya sama panjangnya dengan yang asli:

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

Asli:

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

angka dalam matriks adalah bilangan bulat. jadi pos?tidak benar
cliffroot

Benar, saya lupa menghitung bilangan bulat negatif. Diperbaiki sekarang
NikoNyrh

2

q / kdb +, 25 17 16 byte

Larutan:

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

Contoh:

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

Penjelasan:

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

Catatan:

Masalahnya cukup mudah, solusi ini terasa terlalu rumit. Segera setelah saya menekan kirim, saya menyadari kesalahan cara saya.

Bonus:

Inilah solusi ak yang memberikan bobot pada 16 10 9 byte - hampir persis sama tetapi 7 byte lebih pendek karena faktanya kita tidak memerlukan tanda kurung saat menggunakan k built-in, dan sebagai hasilnya beberapa menjadi lebih pendek daripada kata kunci q ( misalnya +/untuk sum(akan berada (+/)di q)).

*<+/+0=/:



1

V , 18 byte

òø0
jòÚDuu/"
dGؾ

Cobalah online!

Tidak seperti kebanyakan jawaban V, ini diindeks 0.

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

Tidak buruk untuk bahasa tanpa dukungan angka! ;P

Saya juga telah menemukan bahwa varian huruf besar dari perintah hitung , yaitu Ø, rusak parah.


1

Python 3 , 92 byte

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

Pertama, sortir setiap baris sedemikian rupa [0,0,..,0,x,x,x]sehingga entri kemudian urutkan seluruh matriks, sehingga entri terakhir masuky adalah baris yang kita cari. Salinan y=x[:]diperlukan, karena .sort()berfungsi di tempat, maka kita tidak tahu indeks asli setelah penyortiran.

Saya menghargai bantuan apa pun untuk menyempurnakan solusi ini. Sebagian besar byte hilang karena spasi putih di setiap baris. Kode itu sendiri hanya sepanjang 68 byte.

Cobalah online!


1
Saya tidak tahu Python tetapi tidak bisakah Anda menghapus sebagian besar spasi putih dari ini?
TheLethalCoder

@TheLethalCoder Python menggunakan lekukan alih-alih tanda kurung untuk kode kunci, bukan tanda kurung atau kata kunci (misalnya untuk .. akhir).
P. Siehr

1
Bahkan kemudian python dapat di-golf dalam jumlah yang wajar. Yang berikut ini setara dengan kode asli Anda:def f(a):b=list(map(sorted,a));return b.index(sorted(b)[-1])
CensoredUsername

Jawaban ini menggunakan for for dan fungsi tetapi tanpa baris baru jadi saya berasumsi Anda dapat menghapus banyak dari mereka meskipun itu adalah Python 2 pembatasan spasi harus sama.
TheLethalCoder


1

Python 2 , 64 55 52 48 byte

  • Terima kasih kepada @Rod untuk mencukur 9 byte !! : hitung 0dan gunakan min()sebagai gantinyamax()
  • @Rod menyimpan 3 byte lagi: gunakan input()sebagai gantidef
  • @ovs menyelamatkan 4 byte : penggunaan lambdadan hash-map
lambda x:x.index(min(x,key=lambda n:n.count(0)))

Cobalah online!



Terima kasih @ovs. Saya tidak benar-benar mengerti cara kerjanya.
officialaimm

1
Logikanya kurang lebih sama dengan jawaban Anda, tetapi gunakan mindengan keyparameter
Rod

1

JavaScript (ES6), 62 byte

Diindeks 0. Mengambil array 2D sebagai input.

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

Bisakah Anda menambahkan penjelasan untuk yang ini? Apakah filtersecara implisit "menyaring" nol?
TheLethalCoder

Anda seharusnya mengembalikan indeks baris ...
Neil

Masih mencoba untuk bermain golf lagi, @TheLethalCoder, akan menambahkan demo dan penjelasan ketika saya selesai. Sementara itu, lihat di sini untuk info lebih lanjut tentang filter, mengingat itu 0adalah falsey.
Shaggy

@Nil: Tetap sekarang.
Shaggy

@ Shaggy saya berasumsi bahwa itu adalah kasus filteryang hanya memastikan.
TheLethalCoder


1

Pyth, 6 byte

xQh/D0

Demonstrasi

Alih-alih menemukan baris dengan elemen paling tidak nol, saya menemukan baris dengan elemen paling sedikit nol.

/D0: Memesan ( D) dengan hitung ( /) dari nol ( 0). Secara implisit diterapkan pada Q, input.

h: Ambil elemen pertama dan minimum.

xQ: Temukan indeks ( x) di input ( Q) elemen itu.


Ini persis seperti apa yang saya miliki. Rasanya kikuk dan sepertinya saya kehilangan sesuatu, tetapi sepertinya tidak ada cara yang bersih untuk melakukannya :(
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;}

Jelek, tapi berhasil ..

Penjelasan:

Coba di sini.

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

Cobalah online!

Java, bahasa verbose yang manis :)

Terima kasih telah menyimpan 18 byte, @KevinCruijssen;)


+1 jawaban yang bagus. Akan memposting jawaban yang bahkan lebih verbose sendiri .. Meragukan apakah akan mempostingnya, dan itu adalah hal yang baik yang belum saya lakukan sejak 145 byte dan jelek ..;) Ini dia ... EDIT: Hmm, btw, dua kasus uji terakhir Anda gagal ..
Kevin Cruijssen

Memeriksa kode Anda hanya membuat saya sadar ada bug dalam jawaban saya! o_O Aku bahkan tidak tahu bagaimana uji kasus saya lulus ...
Olivier Grégoire

Senang pergi, saya memperbaikinya!
Olivier Grégoire

1
Bagus! Btw, Anda bisa golf dengan menggunakan untuk setiap loop dalam untuk menyingkirkan jdan bagian-bagian lain yang lebih panjang seperti j=m[i].length,dan m[i][j]seperti ini: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 Bytes

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

di mana marray 2D dan indeks yang dikembalikan adalah 0-diindeks

Kasus uji:


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())

Penjelasan

Kekuatan Daftar dan Streaming! (dan tanpa impor, untuk boot!)

Mari kita pecahkan lambda kecil ini menjadi beberapa bagian:

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

Kami mengubah Daftar Daftar kami (matriks dalam pertanyaan) menjadi Stream dan menelusuri setiap elemen, menghapus semua nol sial itu dari setiap sub-Daftar. Kita perlu secara eksplisit mengembalikan sublist setiap kali di sini, karenaStream.map() mengkonversi setiap objek dalam Stream ke apa pun yang dikembalikan oleh pemetaan, dan kami tidak ingin mengubahnya.

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

Kita membaca sub-daftar yang baru dihapus, dan cukup memeriksa seberapa besar mereka di samping satu sama lain, menjadikan kita sublist terbesar. Ini .get()karena Stream.max()mengembalikan Opsional, yang membutuhkan panggilan fungsi tambahan.

m.indexOf()

Kami mengambil sublist terbesar itu, dan menemukan di mana itu ada dalam Daftar utama, memberi kami hasil kami!

Catatan

Ini rusak jika daftar luar kosong, tapi saya ambil

Anda dapat mengasumsikan bahwa hanya akan ada satu baris dengan elemen yang paling tidak nol.

menyiratkan bahwa akan selalu ada setidaknya satu baris. Koreksi saya jika saya salah.


1

Python 2 , 51 byte

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

Cobalah online!

Versi ini menghapus 0s secara progresif melalui array, mencetak indeks saat ini, dan crash ketika tidak ada lagi nol untuk dihapus. Indeks cetak terakhir adalah jawabannya.

Python 2 , 57 byte

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

Cobalah online!

Ingin mencoba pendekatan yang berbeda dari yang sudah ada di sini. Jadi di sini saya secara berulang-ulang beralih pada array menghapus satu 0 pada suatu waktu sampai array saat ini tidak lagi memiliki angka nol - dan kemudian menampilkan indeks array itu.


1

Japt , 7 byte

Diindeks 0. Mengambil input sebagai array array.

mè
bUrw

Menguji


Penjelasan

Input array secara implisit U.
[[0,4,1,0],[0,0,-6,0],[0,1,4,-3],[2,0,0,8],[0,0,0,0]]

Map ( m) untuk Umengembalikan jumlah elemen kebenaran (bukan nol) di setiap sub-array. Secara implisit tetapkan larik baru ini ke U.
[2,1,3,2,0]

Urw

Kurangi ( r) array Udengan mendapatkan yang lebih besar dari nilai saat ini dan elemen saat ini.
3

b

Dapatkan indeks pertama di Umana elemen sama dengan nilai itu dan secara implisit mengeluarkan hasilnya.
2

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.