Indeks wiersza z większością elementów niezerowych


26

To jest proste: weź macierz liczb całkowitych jako dane wejściowe i wyślij indeks wiersza z najbardziej niezerowymi elementami. Możesz założyć, że będzie tylko jeden wiersz z najbardziej niezerowymi elementami.

Przypadki testowe:

Są to indeksy 1, możesz wybrać, czy chcesz indeksować 0 czy 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

Odpowiedzi:




6

05AB1E , 8 6 bajtów

ΣĀO}θk

Wypróbuj online!

-2 bajty dzięki Erikowi Outgolfer

Wyjaśnienie

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

Użyj Āzamiast Ä0›dla -2.
Erik the Outgolfer

Właśnie zdałeś sobie sprawę, że jest prawdopodobnie lepszy sposób na wykonanie tej części niż to, co miałem. Cholera, czuję, że uczę się każdego nowego polecenia 05AB1E ^^
Datboi

6

R , 31 bajtów

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

zwraca anonimową funkcję, która przyjmuje macierz:

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

rowSumssumuje wiersze, !mprzekształcając 0 na 1, a wszystko inne na 0. which.minzwraca indeks pierwszego wiersza oparty na 1, który zawiera sumę minimalną (tj. który wiersz ma najmniej zer).

Wypróbuj online!


Potrzebujesz, which.min()ponieważ niezerowe elementy staną się NIEPOPRAWNE !m.
user2390246

@ user2390246 och, wow, całkowicie błędnie odczytałem pytanie. Naprawiono, dziękuję.
Giuseppe

5

Haskell, 46 42 41 bajtów

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

Wypróbuj online!

Jak to działa

    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

Miły! Lepsze niż moje, dobrze się czegoś nauczyć.
Henry

4

C #, 69 bajtów

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

Pobiera List<int[]>dane wejściowe i zwraca wynik z indeksem 0.


3

Właściwie 9 bajtów

0@♀cñ♂RmN

Wypróbuj online!

Wyjaśnienie:

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 bajtów

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

Ogolono 6 bajtów. Stare rozwiązanie:

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

1
Właśnie zauważyłem, że teraz pasuje bezpośrednio do zmian w odpowiedzi na python 2.
CensoredUsername

3

APL (Dyalog) , 11 bajtów

(⊢⍳⌈/)+/0≠⎕

Wypróbuj online!

0≠⎕ Macierz boolowska gdzie niezerowa

+/ suma wierszy

( zastosuj następującą ukrytą funkcję do listy sum

⌈/ maksimum

 indeks

 na liście argumentów

)





2

Haskell - 69 68 bajtów

Oszczędność jednego bajtu dzięki Siracusa!

Rzędy są indeksowane zerowo

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

Stosowanie

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

Wypróbuj online!


Zdefiniowanie g=filteroszczędza jeden bajt
siracusa,

Możesz nawet usunąć kilka bajtów więcej m y=length$takeWhile(<maximum y)yi skrócić lengthzamiastfilter
siracusa

2

Clojure, 64 bajty

Ten działa również z liczbami ujemnymi na wejściu, na szczęście takiej samej długości jak oryginał:

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

Oryginalny:

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

liczby w macierzy są liczbami całkowitymi. więc pos?nie jest poprawne
Cliffroot

To prawda, że ​​zapomniałem uwzględnić ujemne liczby całkowite. Naprawiono teraz.
NikoNyrh

2

q / kdb +, 25 17 16 bajtów

Rozwiązanie:

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

Przykład:

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

Wyjaśnienie:

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

Uwagi:

Problem jest dość prosty, rozwiązanie to wydaje się zbyt skomplikowane. Gdy tylko kliknąłem przycisk Prześlij, zdałem sobie sprawę z błędu moich działań.

Premia:

Oto rozwiązanie ak że ciężary w na 16 10 9 bajtów - niemal dokładnie takie same, ale 7 bajtów krótsze ze względu na fakt, że nie trzeba wsporniki przy użyciu k Zabudowy, aw rezultacie niektóre stają się krótsze niż słowa kluczowe Q ( np. +/dla sum(byłoby (+/)w q)).

*<+/+0=/:



1

V , 18 bajtów

òø0
jòÚDuu/"
dGؾ

Wypróbuj online!

W przeciwieństwie do większości odpowiedzi V jest on indeksowany na 0.

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

Nieźle jak na język bez obsługi numerycznej! ;P

Odkryłem również, że wariant polecenia liczenia , który jest pisany wielkimi literami Ø, jest strasznie zepsuty.


1

Python 3 , 92 bajty

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

Najpierw posortuj każdy wiersz w taki sposób, aby wpisy były [0,0,..,0,x,x,x]następnie posortowane przez całą macierz, tak aby ostatni wpis ybył wierszem, którego szukamy. Kopiowanie y=x[:]jest konieczne, ponieważ .sort()działa w miejscu, dlatego nie znamy oryginalnego indeksu po posortowaniu.

Doceniam wszelką pomoc, jak dalej grać w golfa w tym rozwiązaniu. Większość bajtów jest traconych z powodu białych znaków w każdej linii. Sam kod ma tylko 68 bajtów.

Wypróbuj online!


1
Nie znam Pythona, ale czy nie możesz usunąć większości białych znaków?
TheLethalCoder

@TheLethalCoder Python używa wcięć zamiast nawiasów blokowych dla kodu, zamiast nawiasów lub słów kluczowych (np. Dla ... końca).
P. Siehr

1
Nawet wtedy można grać w golfa w Pythonie. Poniższy kod jest równoważny oryginalnemu kodowi:def f(a):b=list(map(sorted,a));return b.index(sorted(b)[-1])
CensoredUsername

Ta odpowiedź używa pętli for i funkcji, ale bez znaków nowej linii, więc zakładam, że możesz usunąć wiele z nich, chociaż jest to Python 2, ograniczenia białych znaków powinny być podobne.
TheLethalCoder


1

Python 2 , 64 55 52 48 bajtów

  • Dzięki @Rod za golenie 9 bajtów !! : count 0s i użyj min()zamiastmax()
  • @Rod zapisał kolejne 3 bajty: użyj input()zamiastdef
  • @ovs zapisał 4 bajty : użycie lambdai hash-map
lambda x:x.index(min(x,key=lambda n:n.count(0)))

Wypróbuj online!



Dzięki @ovs. Nie do końca rozumiałem, jak to działa.
officialaimm

1
To mniej więcej tę samą logikę, że trzeba było na odpowiedź, ale korzystając minz keyparametru
Rod

1

JavaScript (ES6), 62 bajty

0-indeksowane. Pobiera tablicę 2D jako dane wejściowe.

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

Czy możesz dodać wyjaśnienie tego? Czy filterniejawnie „filtruje” zera?
TheLethalCoder

Powinieneś zwrócić indeks wiersza ...
Neil

Wciąż próbuję pograć w golfa, @TheLethalCoder, dodając demo i wyjaśnienie, kiedy skończę. W międzyczasie można znaleźć tutaj , aby uzyskać więcej informacji na temat filter, pamiętając, że 0jest falsey.
Shaggy

@ Neil: Naprawiono teraz.
Shaggy

@Shaggy Przyjąłem, że tak filterwłaśnie było, tylko upewniłem się.
TheLethalCoder


1

Pyth, 6 bajtów

xQh/D0

Demonstracja

Zamiast znajdować wiersz z najbardziej niezerowymi elementami, znajduję wiersz z najmniej zerowymi elementami.

/D0: Kolejność ( D) według liczby ( /) zer ( 0). Domyślnie zastosowane do Qdanych wejściowych.

h: Weź pierwszy i minimalny element.

xQ: Znajdź indeks ( x) na wejściu ( Q) tego elementu.


Właśnie to miałem studnię. Czułem się niezręcznie i jakby czegoś mi brakowało, ale wygląda na to, że nie ma po prostu czystego sposobu na zrobienie tego :(
FryAmTheEggman


1

Java 8, 145 bajtów

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

Brzydkie, ale działa ...

Wyjaśnienie:

Wypróbuj tutaj.

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 bajtów

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

Wypróbuj online!

Java, ten słodki, pełny język :)

Dzięki za uratowanie 18 bajtów, @KevinCruijssen;)


+1 fajna odpowiedź. Już miałam opublikować jeszcze bardziej wyczerpującą odpowiedź. Wątpiłam, czy ją opublikować, i dobrze, że nie miałam, bo ma 145 bajtów i jest brzydka ..;) Oto jest ... EDYCJA: Hmm, btw, ostatnie dwa przypadki testowe zawiodły ...
Kevin Cruijssen

Sprawdzenie kodu właśnie uświadomiło mi, że w mojej odpowiedzi jest błąd! o_O Nie wiem nawet, jak przebiegają moje testy ...
Olivier Grégoire

Dobrze iść, naprawiłem to!
Olivier Grégoire

1
Miły! Btw, możesz golf go za pomocą pętli for-each wewnętrzną pozbyć ji inne dłuższe części jak j=m[i].length,i m[i][j]tak: 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 bajtów )
Kevin Cruijssen

1

JavaScript (ES6), 51 bajtów

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

gdzie mjest tablica 2D, a zwrócony indeks ma indeks 0

Przypadki testowe:


1

Java 8, 100 bajtów

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

Wyjaśnienie

Moc list i strumieni! (i bez importu, aby uruchomić!)

Podzielmy tę małą lambda na części:

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

Przekształcamy naszą listę list (macierz w pytaniu) w strumień i przeglądamy każdy element, usuwając wszystkie te nieznośne zera z każdej podlisty. Za każdym razem musimy jawnie zwrócić listę podrzędną, ponieważ Stream.map()konwertuje każdy obiekt w strumieniu na wszystko, co zwraca mapowanie, i nie chcemy ich zmieniać.

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

Przeglądamy nasze nowo wyzerowane podlisty i po prostu sprawdzamy, jak duże są obok siebie, co daje nam największą podlistę. Jest .get()tak, ponieważ Stream.max()zwraca wartość Opcjonalne, wymagającą wywołania dodatkowej funkcji.

m.indexOf()

Bierzemy tę największą podlistę i znajdujemy ją na głównej liście, dając nam nasz wynik!

Uwagi

To się psuje, jeśli zewnętrzna lista jest pusta, ale biorę

Możesz założyć, że będzie tylko jeden wiersz z najbardziej niezerowymi elementami.

sugerować, że zawsze będzie co najmniej jeden rząd. Popraw mnie, jeśli się mylę.


1

Python 2 , 51 bajtów

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

Wypróbuj online!

Ta wersja usuwa zera stopniowo przez tablice, drukując bieżący indeks i ulega awarii, gdy nie ma już zer do usunięcia. Ostatni wydrukowany indeks jest odpowiedzią.

Python 2 , 57 bajtów

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

Wypróbuj online!

Chciałem wypróbować inne podejście niż już tutaj. Więc tutaj powtarzam iteracyjnie iterację po tablicy, usuwając po jednym 0, aż bieżąca tablica nie będzie miała już żadnych zer - a następnie wypisuje indeks tej tablicy.


1

Japt , 7 bajtów

0-indeksowane. Pobiera dane wejściowe jako tablicę tablic.

mè
bUrw

Sprawdź to


Wyjaśnienie

Domniemane wejście tablicy U.
[[0,4,1,0],[0,0,-6,0],[0,1,4,-3],[2,0,0,8],[0,0,0,0]]

Map ( m) po Uzwróceniu liczby prawdziwych (niezerowych) elementów w każdej pod-macierzy. Niejawnie przypisz tę nową tablicę do U.
[2,1,3,2,0]

Urw

Zredukuj rtablicę U, uzyskując większą z bieżącej wartości i bieżącego elementu.
3

b

Uzyskaj pierwszy indeks, w Uktórym element równa się tej wartości, i domyślnie wyślij wynik.
2

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.