Index der Zeile mit den meisten Nicht-Null-Elementen


26

Dies ist eine einfache Methode: Nehmen Sie eine Ganzzahlmatrix als Eingabe und geben Sie den Index der Zeile mit den meisten Nicht-Null-Elementen aus. Sie können davon ausgehen, dass es nur eine Zeile mit den meisten Nicht-Null-Elementen gibt.

Testfälle:

Diese sind 1-indiziert. Sie können wählen, ob Sie 0 oder 1-indiziert möchten.

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

Antworten:




6

05AB1E , 8 6 Bytes

ΣĀO}θk

Probieren Sie es online!

-2 Bytes dank Erik dem Outgolfer

Erläuterung

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

Verwenden Sie Āanstelle von Ä0›für -2.
Erik der Outgolfer

Yee hat gerade gemerkt, dass es wahrscheinlich einen besseren Weg gibt, diesen Teil zu machen, als den, den ich hatte. Verdammt Ich fühle mich wie ich jeden Tag einen neuen 05AB1E Befehl lerne ^^
Datboi

6

R , 31 Bytes

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

gibt eine anonyme Funktion zurück, die eine Matrix annimmt:

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

rowSumssummiert die Zeilen, wobei !m0 in 1 und alles andere in 0 umgewandelt wird.which.min Gibt den 1-basierten Index der ersten Zeile zurück, die die Min-Summe enthält (dh welche Zeile die wenigsten Nullen hat).

Probieren Sie es online!


Sie benötigen, which.min()da Nicht-Null-Elemente mit FALSE werden !m.
user2390246

@ user2390246 oh, wow, ich habe die Frage komplett falsch verstanden. Behoben, danke.
Giuseppe

5

Haskell, 46 42 41 Bytes

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

Probieren Sie es online!

Wie es funktioniert

    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

Nett! Besser als meins, gut etwas zu lernen.
Henry

4

C #, 69 Bytes

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

Nimmt a List<int[]>als Eingabe und gibt das 0-indizierte Ergebnis zurück.


3

Eigentlich 9 Bytes

0@♀cñ♂RmN

Probieren Sie es online!

Erläuterung:

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 Bytes

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

6 Bytes abgeschabt. Alte Lösung:

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

1
Ich habe gerade bemerkt, dass es direkt mit den Änderungen an der Python 2-Antwort übereinstimmt.
CensoredUsername

3

APL (Dyalog) , 11 Bytes

(⊢⍳⌈/)+/0≠⎕

Probieren Sie es online!

0≠⎕ Boolesche Matrix, die nicht Null ist

+/ Summenzeilen

( Wenden Sie die folgende implizite Funktion auf die Liste der Summen an

⌈/ das Maximum ist

 Index

 in der Argumentliste

)





2

Haskell - 69 68 Bytes

Dank Siracusa ein Byte gespart!

Zeilen sind mit Null indiziert

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

Verwendung

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

Probieren Sie es online!


Das Definieren g=filterspart Ihnen ein Byte
Siracusa

Sie können sogar ein paar Bytes mehr mit m y=length$takeWhile(<maximum y)yund Kürzung lengthstattfilter
Siracusa

2

Clojure, 64 Bytes

Dieser funktioniert auch mit negativen Zahlen in der Eingabe, zum Glück in der gleichen Länge wie das Original:

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

Original:

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

Zahlen in der Matrix sind ganze Zahlen. so pos?ist nicht korrekt
cliffroot

Richtig, ich habe vergessen, negative ganze Zahlen zu berücksichtigen. Jetzt behoben.
NikoNyrh

2

q / kdb +, 25 17 16 Bytes

Lösung:

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

Beispiel:

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

Erläuterung:

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

Anmerkungen:

Das Problem ist ziemlich einfach, diese Lösung fühlt sich zu kompliziert an. Sobald ich Submit drückte, bemerkte ich den Fehler meiner Wege.

Bonus:

Hier ist eine Lösung, die mit 16 10 9 Bytes gewichtet wird - fast genau das gleiche, aber 7 Bytes kürzer, da bei Verwendung der k integrierten Funktionen keine eckigen Klammern erforderlich sind und einige davon kürzer werden als die q Schlüsselwörter ( zB +/für sum(wäre (+/)in q)).

*<+/+0=/:



1

V , 18 Bytes

òø0
jòÚDuu/"
dGؾ

Probieren Sie es online!

Im Gegensatz zu den meisten V-Antworten ist dies 0-indiziert.

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

Nicht schlecht für eine Sprache ohne numerische Unterstützung! ;P

Ich habe auch , dass die Groß Variante des entdeckte Zählung Befehls, das ist Ø, ist schrecklich gebrochen.


1

Python 3 , 92 Bytes

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

Sortieren Sie zuerst jede Zeile so, dass die Einträge [0,0,..,0,x,x,x]dann die gesamte Matrix sortieren, sodass der letzte Eintrag in yder Zeile ist, nach der wir suchen. Die Kopiey=x[:] ist notwendig, da sie an Ort und Stelle .sort()funktioniert. Daher kennen wir den ursprünglichen Index nach dem Sortieren nicht.

Ich freue mich über jede Hilfe, um diese Lösung weiter zu verbessern. Die meisten Bytes gehen aufgrund der Leerzeichen in jeder Zeile verloren. Der Code selbst ist nur 68 Byte lang.

Probieren Sie es online!


1
Ich kenne Python nicht, aber können Sie nicht den größten Teil des Leerzeichens entfernen?
TheLethalCoder

@TheLethalCoder Python verwendet Einrückungen anstelle von Klammern für Codeblöcke, anstelle von Klammern oder Schlüsselwörtern (z. B. für .. end).
P. Siehr

1
Selbst dann kann Python ein gutes Stück Golf gespielt werden. Folgendes entspricht Ihrem ursprünglichen Code:def f(a):b=list(map(sorted,a));return b.index(sorted(b)[-1])
CensoredUsername

In dieser Antwort werden eine for-Schleife und eine Funktion verwendet, jedoch ohne Zeilenumbrüche. Daher gehe ich davon aus, dass Sie viele davon entfernen können, obwohl es sich um Python 2 handelt. Die Leerzeichenbeschränkungen sollten ähnlich sein.
TheLethalCoder


1

Python 2 , 64 55 52 48 Bytes

  • Danke an @Rod für das Rasieren von 9 Bytes !! : zähle 0s und benutze min()stattmax()
  • @Rod hat noch 3 Bytes gespeichert: benutze input()stattdef
  • @ovs sparte 4 Bytes : Verwendung von lambdaund Hash-Map
lambda x:x.index(min(x,key=lambda n:n.count(0)))

Probieren Sie es online!



Vielen Dank @ovs. Ich habe nicht genau verstanden, wie es funktioniert.
Amtszeit

1
Es ist mehr oder weniger die gleiche Logik, die Sie für Ihre Antwort hatten, aber minmit dem keyParameter
Rod

1

JavaScript (ES6), 62 Byte

0-indiziert. Nimmt ein 2D-Array als Eingabe.

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

Können Sie eine Erklärung für diese hinzufügen? Ist filter„Filter“ Nullen implizit?
TheLethalCoder

Sie sollten den Index der Zeile zurückgeben ...
Neil

@TheLethalCoder wird noch eine Demo und eine Erklärung hinzufügen, wenn ich fertig bin. In der Zwischenzeit sieht hier für weitere Informationen auf filter, in Anbetracht, dass 0Falsey ist.
Shaggy

@Neil: Jetzt behoben.
Shaggy

@ Shaggy Ich nahm an, dass dies der Fall filterwar, nur um sicher zu gehen.
TheLethalCoder


1

Pyth, 6 Bytes

xQh/D0

Demonstration

Anstatt die Zeile mit den meisten Nicht-Null-Elementen zu finden, finde ich die Zeile mit den niedrigsten Null-Elementen.

/D0: Reihenfolge ( D) nach Anzahl ( /) der Nullen ( 0). Implizit angewendet auf Qdie Eingabe.

h: Nehmen Sie das erste und minimale Element.

xQ: Finden Sie den Index ( x) in der Eingabe ( Q) dieses Elements.


Genau das hatte ich gut. Es fühlte sich klobig an und als hätte ich etwas verpasst, aber es scheint, als gäbe es keinen sauberen Weg, dies zu tun :(
FryAmTheEggman


1

Java 8, 145 Bytes

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

Hässlich, aber es funktioniert ..

Erläuterung:

Probieren Sie es hier aus.

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 Bytes

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

Probieren Sie es online!

Java, diese süße, ausführliche Sprache :)

Danke, dass du 18 Bytes gespart hast, @KevinCruijssen;)


+1 nette Antwort. War über eine noch ausführlicher schreiben selbst beantworten .. bezweifelte , ob es zu schreiben, und es ist eine gute Sache , die ich 145 Bytes und hässlich nicht , da es hatte ..;) Hier ist sie ... EDIT: Hmm, btw, Ihre letzten beiden Testfälle
schlagen

Das Überprüfen Ihres Codes hat mir nur klar gemacht, dass meine Antwort einen Fehler enthält! o_O Ich weiß nicht einmal, wie meine Testfälle verlaufen ...
Olivier Grégoire

Gut zu gehen, ich habe es repariert!
Olivier Grégoire

1
Nett! Btw, können Sie es Golf , indem ein für-jede innere Schleife loszuwerden jund andere mehr Teile wie j=m[i].length,und m[i][j]wie folgt aus : 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)

Dabei mist ein 2D-Array und der zurückgegebene Index ist 0-indiziert

Testfälle:


1

Java 8, 100 Bytes

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

Erläuterung

Die Kraft der Listen und Streams! (Und ohne die Importe, um zu booten!)

Brechen wir dieses kleine Lambda in Stücke:

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

Wir wandeln unsere Liste der Listen (die Matrix in der Frage) in einen Stream um und gehen jedes Element durch, wobei wir alle diese nervigen Nullen aus jeder Unterliste entfernen. Wir müssen die Unterliste jedes Mal hier explizit zurückgeben, da Stream.map()jedes Objekt im Stream in das konvertiert wird, was auch immer die Zuordnung zurückgibt, und wir möchten sie nicht ändern.

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

Wir gehen unsere neu entnullten Unterlisten durch und überprüfen einfach, wie groß sie nebeneinander sind, um die größte Unterliste zu erhalten. Das .get()liegt daran, dass dasStream.max() eine Optional gibt, erfordern , dass zusätzliche Funktionsaufruf.

m.indexOf()

Wir nehmen diese größte Unterliste und finden heraus, wo sie sich in der Hauptliste befindet. So erhalten wir unser Ergebnis!

Anmerkungen

Dies bricht, wenn die äußere Liste leer ist, aber ich nehme

Sie können davon ausgehen, dass es nur eine Zeile mit den meisten Nicht-Null-Elementen gibt.

zu implizieren, dass es immer mindestens eine Zeile geben wird. Korrigiere mich, wenn ich falsch liege.


1

Python 2 , 51 Bytes

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

Probieren Sie es online!

Diese Version entfernt schrittweise Nullen durch die Arrays, druckt den aktuellen Index und stürzt ab, wenn keine Nullen mehr entfernt werden müssen. Der zuletzt gedruckte Index ist die Antwort.

Python 2 , 57 Bytes

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

Probieren Sie es online!

Wollte eine andere Herangehensweise ausprobieren als die, die bereits hier ist. Also iteriere ich hier rekursiv über das Array und entferne jeweils eine 0, bis das aktuelle Array keine Nullen mehr hat - und gebe dann den Index dieses Arrays aus.


1

Japt , 7 Bytes

0-indiziert. Übernimmt die Eingabe als Array von Arrays.

mè
bUrw

Probier es aus


Erläuterung

Implizite Eingabe eines Arrays U.
[[0,4,1,0],[0,0,-6,0],[0,1,4,-3],[2,0,0,8],[0,0,0,0]]

Map ( m) über die URückgabe der Anzahl der wahrheitsgemäßen (von Null verschiedenen) Elemente in jedem Unterarray. Ordnen Sie dieses neue Array implizit zu U.
[2,1,3,2,0]

Urw

Reduzieren Sie das rArray ( ), Uindem Sie den aktuellen Wert und das aktuelle Element auf den höchsten Wert bringen.
3

b

Rufen Sie den ersten Index ab, in Udem das Element diesem Wert entspricht, und geben Sie das Ergebnis implizit aus.
2

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.