Indice della riga con la maggior parte degli elementi diversi da zero


26

Questo è semplice: prendi una matrice di numeri interi come input e genera l'indice della riga con il maggior numero di elementi diversi da zero. Si può presumere che ci sarà solo una riga con il maggior numero di elementi diversi da zero.

Casi test:

Questi sono 1 indicizzati, puoi scegliere se vuoi 0 o 1 indicizzato.

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

Risposte:




6

05AB1E , 8 6 byte

ΣĀO}θk

Provalo online!

-2 byte grazie a Erik the Outgolfer

Spiegazione

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

Utilizzare Āinvece di Ä0›per -2.
Erik the Outgolfer,

Ti sei appena reso conto che probabilmente c'è un modo migliore per fare quella parte di quello che avevo. Accidenti mi sento come se stessi imparando un nuovo comando 05AB1E ogni giorno ^^
Datboi,

6

R , 31 byte

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

restituisce una funzione anonima che accetta una matrice:

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

rowSumssomma le righe, !mtrasformando 0 in 1 e tutto il resto in 0. which.minrestituisce l'indice in base 1 della prima riga che contiene la somma minima (ovvero, quale riga ha il minor numero di zeri).

Provalo online!


È necessario which.min()poiché gli elementi diversi da zero diventeranno FALSE con !m.
user2390246,

@ user2390246 oh, wow, ho letto male la domanda. Risolto, grazie.
Giuseppe,

5

Haskell, 46 42 41 byte

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

Provalo online!

Come funziona

    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

Bello! Meglio del mio, bello imparare qualcosa.
Henry,

4

C #, 69 byte

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

Prende un List<int[]>input e restituisce il risultato indicizzato 0.


3

In realtà , 9 byte

0@♀cñ♂RmN

Provalo online!

Spiegazione:

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

Rimozione di 6 byte. Vecchia soluzione:

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

1
Ho appena notato che ora si abbina direttamente con le modifiche alla risposta di Python 2.
CensoredUsername

3

APL (Dyalog) , 11 byte

(⊢⍳⌈/)+/0≠⎕

Provalo online!

0≠⎕ Matrice booleana dove diversa da zero

+/ somma righe

( applica la seguente funzione tacita all'elenco delle somme

⌈/ il massimo

 indice

 nell'elenco degli argomenti

)





2

Haskell - 69 68 byte

Salvato un byte grazie a Siracusa!

Le righe sono indicizzate zero

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

uso

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

Provalo online!


La definizione g=filterti fa risparmiare un byte
siracusa il

Puoi anche rimuovere qualche byte in più con m y=length$takeWhile(<maximum y)ye accorciamento lengthinvece difilter
siracusa il

2

Clojure, 64 byte

Questo funziona anche con numeri negativi nell'input, per fortuna della stessa lunghezza dell'originale:

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

Originale:

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

i numeri nella matrice sono numeri interi. quindi pos?non è corretto
cliffroot il

Vero, ho dimenticato di tenere conto degli interi negativi. Riparato ora.
NikoNyrh,

2

q / kdb +, 25 17 16 byte

Soluzione:

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

Esempio:

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

Spiegazione:

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

Gli appunti:

Il problema è abbastanza semplice, questa soluzione sembra eccessivamente complicata. Non appena premo invio mi sono reso conto dell'errore dei miei modi.

Bonus:

Ecco una soluzione ak che pesa a 16 10 9 byte - quasi esattamente la stessa ma 7 byte più corti a causa del fatto che non abbiamo bisogno di parentesi quando si usano i built-in k, e di conseguenza alcuni diventano più brevi delle parole chiave q ( ad es. +/per sum(sarebbe (+/)in q)).

*<+/+0=/:



1

V , 18 byte

òø0
jòÚDuu/"
dGؾ

Provalo online!

A differenza della maggior parte delle risposte V, questo è indicizzato 0.

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

Non male per una lingua senza supporto numerico! ;P

Ho anche scoperto che la variante maiuscola del comando count , cioè Ø, è terribilmente rotta.


1

Python 3 , 92 byte

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

Prima ordina ogni riga in modo tale che le voci siano [0,0,..,0,x,x,x]quindi ordinate l'intera matrice, in modo che l'ultima voce ysia la riga che stiamo cercando. La copia y=x[:]è necessaria, poiché .sort()funziona sul posto, quindi non conosciamo l'indice originale dopo l'ordinamento.

Apprezzo qualsiasi aiuto su come golf ulteriormente questa soluzione. La maggior parte dei byte viene persa a causa degli spazi bianchi in ciascuna riga. Il codice stesso è lungo solo 68 byte.

Provalo online!


1
Non conosco Python ma non puoi rimuovere la maggior parte degli spazi bianchi da questo?
TheLethalCoder il

@TheLethalCoder Python utilizza il rientro anziché parentesi per i blocchi di codice, anziché parentesi o parole chiave (ad es. Per ... fine).
P. Siehr,

1
Anche allora il pitone può essere giocato a golf un discreto importo. Quanto segue equivale al codice originale:def f(a):b=list(map(sorted,a));return b.index(sorted(b)[-1])
CensoredUsername

Questa risposta usa un ciclo for e una funzione ma senza nuove righe, quindi suppongo che tu possa rimuoverne molti anche se è Python 2, le restrizioni degli spazi bianchi dovrebbero essere simili.
TheLethalCoder il


1

Python 2 , 64 55 52 48 byte

  • Grazie a @Rod per la rasatura di 9 byte !! : conta se 0usa min()invece dimax()
  • @Rod ha salvato ancora altri 3 byte: usare input()invece didef
  • @ovs ha salvato 4 byte : uso di lambdae hash-map
lambda x:x.index(min(x,key=lambda n:n.count(0)))

Provalo online!



Grazie @ovs. Non ho capito esattamente come funziona però.
officialaimm,

1
È più o meno la stessa logica che avevi sulla tua risposta, ma usando minil keyparametro
Rod

1

JavaScript (ES6), 62 byte

0-indicizzati. Accetta un array 2D come input.

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

Puoi aggiungere una spiegazione per questo? Fa filterimplicitamente zeri "filtro"?
TheLethalCoder il

Dovresti restituire l'indice della riga ...
Neil,

Ancora cercando di giocare un po 'di più, @TheLethalCoder, aggiungerà una demo e una spiegazione quando avrò finito. Nel frattempo, vedi qui per maggiori informazioni filter, tenendo presente che 0è falso.
Shaggy,

@Neil: risolto ora.
Shaggy

@Shaggy Ho pensato che fosse il caso con cui mi filterstavo solo assicurando.
TheLethalCoder


1

Pyth, 6 byte

xQh/D0

Dimostrazione

Invece di trovare la riga con il maggior numero di elementi diversi da zero, trovo la riga con il minor numero di elementi zero.

/D0: Order ( D) per count ( /) di zeri ( 0). Applicato implicitamente a Q, l'input.

h: Prende il primo e minimo elemento.

xQ: Trova l'indice ( x) nell'input ( Q) di quell'elemento.


Questo era esattamente quello che avevo un pozzo. Mi è sembrato goffo e mi mancava qualcosa, ma sembra che non ci sia un modo pulito per farlo :(
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;}

Brutto, ma funziona ..

Spiegazione:

Provalo qui.

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

Provalo online!

Java, quel dolce linguaggio verboso :)

Grazie per aver salvato 18 byte, @KevinCruijssen;)


+1 bella risposta. Stavo per pubblicare una risposta ancora più prolissa da solo .. Stavo dubitando di pubblicarla, ed è una buona cosa che non avevo visto che è di 145 byte e brutta ..;) Eccola ... EDIT: Hmm, btw, i tuoi ultimi due casi di test falliscono ..
Kevin Cruijssen,

Controllare il tuo codice mi ha fatto capire che c'è un bug nella mia risposta! o_O Non so nemmeno come passano i miei casi di test ...
Olivier Grégoire,

Bene, l'ho risolto!
Olivier Grégoire,

1
Bello! A proposito, puoi giocare a golf usando un ciclo interno per ogni per sbarazzarti di je altre parti più lunghe come j=m[i].length,e in m[i][j]questo modo: 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)

dove mè un array 2D e l'indice restituito è indicizzato 0

Casi test:


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

Spiegazione

Il potere di elenchi e stream! (e senza le importazioni, per l'avvio!)

Dividiamo questa piccola lambda in pezzi:

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

Trasformiamo il nostro Elenco di elenchi (la matrice nella domanda) in un flusso e analizziamo ogni elemento, rimuovendo tutti quei fastidiosi zero da ciascun elenco secondario. Dobbiamo restituire esplicitamente la lista secondaria ogni volta qui, perché Stream.map()converte ogni oggetto nello Stream in qualunque cosa restituisca la mappatura e non vogliamo cambiarli.

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

Esaminiamo le nostre liste secondarie appena azzerate e controlliamo semplicemente quanto sono grandi l'una accanto all'altra, ottenendo la più grande lista secondaria. Il .get()perché Stream.max()restituisce un Opzionale, che richiede quella chiamata di funzione aggiuntiva.

m.indexOf()

Prendiamo quella più grande lista e troviamo dove si trova nella lista principale, dandoci il nostro risultato!

Gli appunti

Questo si interrompe se l'elenco esterno è vuoto, ma sto prendendo

Si può presumere che ci sarà solo una riga con il maggior numero di elementi diversi da zero.

implicare che ci sarà sempre almeno una riga. Correggimi se sbaglio.


1

Python 2 , 51 byte

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

Provalo online!

Questa versione rimuove progressivamente gli 0 attraverso gli array, stampa l'indice corrente e si arresta in modo anomalo quando non ci sono più zeri da rimuovere. L'ultimo indice stampato è la risposta.

Python 2 , 57 byte

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

Provalo online!

Volevo provare un approccio diverso da quello che è già qui. Quindi qui ricerco ripetutamente l'array rimuovendo uno 0 alla volta fino a quando l'array corrente non ha più zero - e quindi restituisco l'indice di tale array.


1

Japt , 7 byte

0-indicizzati. Accetta l'input come una matrice di array.

mè
bUrw

Provalo


Spiegazione

Input implicito di array U.
[[0,4,1,0],[0,0,-6,0],[0,1,4,-3],[2,0,0,8],[0,0,0,0]]

Mappa ( m) Urestituendo il conteggio degli elementi di verità (diversi da zero) in ciascun sotto-array. Assegnare implicitamente questo nuovo array a U.
[2,1,3,2,0]

Urw

Reduce ( r) array Uottenendo il maggiore tra il valore corrente e l'elemento corrente.
3

b

Ottieni il primo indice in Ucui l'elemento è uguale a quel valore e genera implicitamente il risultato.
2

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.