Sıfır olmayan çoğu öğenin bulunduğu satırın dizini


26

Bu basit bir tanesidir: Girdi olarak bir tamsayı matrisi alın ve sıranın dizinini en sıfır olmayan öğeyle çıktılayın. Sıfır olmayan öğelerin yalnızca bir satır olacağını varsayabilirsiniz.

Test durumları:

Bunlar 1 indekslidir, 0 indeksli veya 1 indeksli olarak seçebilirsiniz.

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

Yanıtlar:




6

05AB1E , 8 6 bayt

ΣĀO}θk

Çevrimiçi deneyin!

-2 Baykuş Erik sayesinde Bayt

açıklama

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

-2 Āyerine kullanın Ä0›.
Outgolfer Erik,

Yee, bu kısmı yapmam gerekenden çok daha iyi bir yol olabileceğini fark etti. Lanet olsun her gün yeni bir 05AB1E komutu öğreniyormuşum gibi hissediyorum ^^
Datboi

6

R , 31 bayt

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

bir matris alan anonim bir işlev döndürür:

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

rowSums!m0'a 1 ve her şeyi 0'a dönüştürerek satırları toplar, which.minmin toplamını içeren ilk satırın 1 tabanlı dizinini döndürür (yani, hangi satırın en az sıfırı vardır).

Çevrimiçi deneyin!


which.min()Sıfır olmayan elemanlar ile birlikte YANLIŞ olacağına ihtiyacınız var !m.
user2390246

@ user2390246 oh, vay, soruyu tamamen yanlış anladım. Sabit, teşekkür ederim.
Giuseppe

5

Haskell, 46 42 41 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

    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

Güzel! Benden daha iyi, bir şeyler öğrenmek güzel.
Henry

4

C #, 69 bayt

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

Bir Alır List<int[]>giriş olarak ve 0-endeksli sonuç döndürür.


3

Aslında 9 bayt

0@♀cñ♂RmN

Çevrimiçi deneyin!

Açıklama:

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 bayt

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

6 bayt kapalı. Eski çözüm:

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

1
Sadece şimdi doğrudan python 2 cevap değişiklikleri ile eşleşiyor fark ettim.
Sansürlü Kullanıcı Adı

3

APL (Dyalog) , 11 bayt

(⊢⍳⌈/)+/0≠⎕

Çevrimiçi deneyin!

0≠⎕ Boole matrisi sıfır olmayan

+/ toplam satır

( aşağıdaki tacit işlevini toplamlar listesine uygulayın

⌈/ en fazla

 indeks

 bağımsız değişken listesinde

)





2

Haskell - 69 68 Bayt

Siracusa sayesinde bir bayt kurtarıldı!

Satırlar sıfır dizinli

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

kullanım

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

Çevrimiçi deneyin!


Tanımlama g=filtersizi bir bayttan kurtarır
siracusa

Hatta daha birkaç byte kaldırabilirsiniz m y=length$takeWhile(<maximum y)yve kısaltılması lengthyerinefilter
siracusa

2

Clojure, 64 bayt

Bu, aynı zamanda girişteki negatif sayılarla çalışır, neyse ki orijinaliyle aynı uzunluktadır:

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

Orijinal:

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

matristeki sayılar tam sayılardır. bu yüzden pos?doğru değil
cliffroot

Doğru, negatif tamsayıları hesaba katmayı unuttum. Şimdi düzeltildi.
NikoNyrh

2

q / kdb +, 25 17 16 bayt

Çözüm:

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

Örnek:

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

Açıklama:

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

Notlar:

Sorun oldukça basittir, bu çözüm aşırı karmaşık hissediyor. Gönderim vurulduktan hemen sonra yolumdaki hatayı anladım.

Bonus:

İşte 16 10 9 byte ağırlığındaki ak çözümü - hemen hemen tamamen aynı ancak 7 yerleşik, k yerleşiklerini kullanırken braketlere ihtiyacımız olmadığı için kısaydı ve sonuç olarak bazıları q anahtar kelimesinden daha kısa hale geldi ( örneğin +/için sum(olacaktır (+/)q)).

*<+/+0=/:



1

V , 18 bayt

òø0
jòÚDuu/"
dGؾ

Çevrimiçi deneyin!

Çoğu V cevabından farklı olarak, bu 0 indekslidir.

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

Sayısal desteği olmayan bir dil için fena değil! ;P

Ayrıca count komutunun büyük değişkeninin Økorkunç bir şekilde kırıldığını da keşfettim .


1

Python 3 , 92 bayt

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

Öncelikle her satırı, girişler [0,0,..,0,x,x,x]daha sonra tüm matrisi sıralayacak şekilde sıralayın, böylece son giriş y, aradığımız satırdır. Kopya y=x[:]gereklidir, çünkü .sort()yerinde çalıştığından, sıralamadan sonra orijinal dizini bilmiyoruz.

Bu çözümü daha fazla nasıl golf oynayacağınız konusunda her türlü yardımınız için teşekkür ederim. Baytların çoğu, her satırdaki boşluklardan dolayı kaybolur. Kodun kendisi yalnızca 68 bayttır.

Çevrimiçi deneyin!


1
Python'u tanımıyorum ama boşlukların çoğunu bundan çıkaramaz mısınız?
TheLethalCoder

@TheLethalCoder Python, parantez veya anahtar sözcük yerine kod kilidi için parantez yerine parantez yerine kullanır (örn. .. sonunda).
P. Siehr

1
O zaman bile piton adil bir miktarda golf oynayabilir. Orijinal kodunuza eşdeğerdir:def f(a):b=list(map(sorted,a));return b.index(sorted(b)[-1])
Sansürlü Kullanıcı

Bu cevap bir for döngüsü ve işlevini kullanır, ancak yeni satır yok, bu yüzden Python 2 boşluk alanı kısıtlamalarının aynı olması gerektiği halde bunların çoğunu kaldırabileceğinizi varsayalım.
TheLethalCoder


1

Python 2 , 64 55 52 48 bayt

  • 9 byte tıraş için @Rod !! : 0s say ve min()yerine kullanmax()
  • @Rod başka bir 3 byte daha kaydetti: input()yerinedef
  • @ov'lar 4 byte kurtardı : kullanımı lambdave karma haritası
lambda x:x.index(min(x,key=lambda n:n.count(0)))

Çevrimiçi deneyin!



@Ovs teşekkürler. Nasıl çalıştığını tam olarak anlamadım.
officialaimm

1
Az ya da çok da yanıta sahip olduğu aynı mantığı var, ama kullanan minile keyparametre
Çubuk

1

JavaScript (ES6), 62 bayt

0 endeksli. Giriş olarak 2B dizi alır.

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

Bunun için bir açıklama ekleyebilir misiniz? Does filter"filtre" sıfır dolaylı?
TheLethalCoder

Satır dizini döndürmeniz gerekiyor ...
Neil

Hala biraz daha golf oynamaya çalışıyorum, @ TheLethalCoder, bittiğinde bir demo ve bir açıklama ekliyor olacak. Bu arada, daha fazla bilgi için buraya bakın filter, bunun yanlış 0olduğunu unutmayın .
Shaggy

@Neil: Şimdi düzeltildi.
Shaggy

@Shaggy Ben filtersadece emin olmak ile durum böyle olduğunu düşündüm .
TheLethalCoder


1

Pyth, 6 bayt

xQh/D0

gösteri

Sıfır olmayan elemanların bulunduğu satırı bulmak yerine, sıfırı en az sıfır elemanlı buluyorum.

/D0: Sıfır ( D) sayısının ( /) sayısına göre sıralayın 0. Örtülü olarak Q, girişe uygulanır .

h: İlk ve en az elemanı alın.

xQ: O elemanın xgirişindeki ( Q) dizinini ( ) bulun .


Bu tam olarak bir kuyu vardı. Clunky gibi hissettim ve bir şeyleri özlüyorum, ama yapmanın temiz bir yolu yok gibi görünüyor :(
FryAmTheEggman


1

Java 8, 145 bayt

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

Çirkin, ama işe yarıyor ..

Açıklama:

Burada dene.

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 bayt

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

Çevrimiçi deneyin!

Java, tatlı tatlı dil :)

18 bayt kaydettiğiniz için teşekkür ederiz, @KevinCruijssen;)


+1 güzel cevap. Daha da ayrıntılı bir cevap göndermek üzereydim .. Gönderip göndermeyeceğinden şüpheliydim ve 145 byte ve çirkin olduğundan beri sahip olmadığım iyi bir şey ..;) İşte ... EDIT: Hmm, btw, son iki test durumunuz başarısız ..
Kevin Cruijssen

Kodunuzu kontrol etmek cevabımda bir hata olduğunu fark etmemi sağladı! o_O Test vakalarımın nasıl geçtiğini bile bilmiyorum ...
Olivier Grégoire

Gitmek iyi, ben düzelttim!
Olivier Grégoire

1
Güzel! Bir for-her bir iç döngü kullanarak Btw yapabilirsiniz golf onu kurtulmak jve benzeri diğer uzun parçalar j=m[i].length,ve m[i][j]bunun gibi: 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 bayt )
Kevin Cruijssen

1

JavaScript (ES6), 51 Bayt

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

nerede mbir 2D dizidir ve döndürülen dizin 0-endeksli olduğu

Test durumları:


1

Java 8, 100 bayt

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

açıklama

Listeler ve Akışların gücü! (ve ithalat olmadan, önyükleme yapmak için!)

Bu küçük lambayı parçalara ayıralım:

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

Listeler Listemizi (söz konusu matris) bir Akışa dönüştürüyoruz ve her elemanın içinden geçerek tüm bu sinir bozucu sıfırları her bir alt Listeden kaldırıyoruz. Her seferinde alt listeyi açıkça geri döndürmemiz gerekiyor, çünkü Stream.map()Akıştaki her nesneyi eşlemenin döndürdüğü yere dönüştürür ve değiştirmek istemeyiz.

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

Yeni sıfırlanmış alt listelerimizden geçiyoruz ve birbirlerinin yanında ne kadar büyük olduklarını kontrol ederek bizi en büyük alt liste haline getiriyoruz. Bunun .get()nedeni, Stream.max()ekstra işlev çağrısı gerektiren bir İsteğe Bağlı döndürmesidir.

m.indexOf()

En büyük alt listeyi alıyoruz ve ana Listede nerede olduğunu buluyoruz, sonuçta bize!

notlar

Dış liste boşsa bu kesilir, ancak alıyorum

Sıfır olmayan öğelerin yalnızca bir satır olacağını varsayabilirsiniz.

her zaman en az bir satır olacağı anlamına gelir. Yanlışsam düzelt.


1

Python 2 , 51 bayt

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

Çevrimiçi deneyin!

Bu sürüm, dizileri boyunca aşamalı olarak 0'ları kaldırır, geçerli dizini yazdırır ve kaldırılacak sıfır olmadığında çöker. Son yazdırılan dizin cevaptır.

Python 2 , 57 bayt

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

Çevrimiçi deneyin!

Zaten burada olanlardan farklı bir yaklaşım denemek istedi. Böylece, tekrar tekrar dizilimin üzerinde yinelenerek, geçerli dizinin artık sıfırları kalmayıncaya kadar bir seferde bir 0 çıkarmasını sağlarım - ve ardından dizinin dizini çıktılar.


1

Japt , 7 bayt

0 endeksli. Bir dizi dizisi olarak girdiyi alır.

mè
bUrw

Dene


açıklama

Dizinin örtük girişi U.
[[0,4,1,0],[0,0,-6,0],[0,1,4,-3],[2,0,0,8],[0,0,0,0]]

Map ( m) Uher alt dizideki truthy (sıfır olmayan) öğelerin sayısını döndürme üzerinde . Örtülü olarak bu yeni diziyi atayın U.
[2,1,3,2,0]

Urw

Reduce ( r) dizisini Ugeçerli değerden ve akım elemanından daha büyük alarak
3

b

UÖğenin bu değere eşit olduğu ilk sonucu alın ve sonucu kesin olarak çıktılayın.
2

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.