Індекс рядка з більшістю ненульових елементів


26

Це просте: візьміть матрицю цілих чисел як вхідні та виведіть індекс рядка з найбільш ненульовими елементами. Ви можете припустити, що буде лише один рядок з найбільш ненульовими елементами.

Тестові приклади:

Вони є 1-індексованими, ви можете вибрати, якщо ви хочете 0 або 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

Відповіді:




6

05AB1E , 8 6 байт

ΣĀO}θk

Спробуйте в Інтернеті!

-2 байти завдяки Еріку Переможнику

Пояснення

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

Використовуйте Āзамість Ä0›-2.
Ерік Аутгольфер

Ви щойно зрозуміли, що, мабуть, кращий спосіб зробити цю частину, ніж те, що я мав. Чорт, я відчуваю, що щодня вивчаю нову команду 05AB1E ^^
Datboi

6

R , 31 байт

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

повертає анонімну функцію, яка приймає матрицю:

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

rowSumsпідсумовує рядки, !mперетворюючи 0 в 1, а все інше на 0. which.minповертає індекс на основі 1 першого ряду, який містить мінімальну суму (тобто, який рядок має найменшу нуль).

Спробуйте в Інтернеті!


Вам потрібно, which.min()оскільки ненульові елементи стануть ЛІЖНІМ із !m.
користувач2390246

@ user2390246 О, ух, я цілком неправильно прочитав питання. Виправлено, дякую.
Джузеппе

5

Haskell, 46 42 41 байт

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

Спробуйте в Інтернеті!

Як це працює

    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

Приємно! Краще за моє, добре щось навчитися.
Генрі

4

C #, 69 байт

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

Приймає List<int[]>як вхід і повертає 0-індексований результат.



3

Python 3, 54 48 байт

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

Поголили 6 байт. Старе рішення:

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

1
Щойно помітив, що він відповідає безпосередньо змінам у відповіді python 2 зараз.
CensoredUsername

3

APL (Dyalog) , 11 байт

(⊢⍳⌈/)+/0≠⎕

Спробуйте в Інтернеті!

0≠⎕ Булева матриця, де не нульова

+/ сума рядків

( застосувати наступну негласну функцію до списку сум

⌈/ максимум

 покажчик

 у списку аргументів

)





2

Haskell - 69 68 байт

Збережено один байт завдяки Сиракузі!

Рядки індексуються нулем

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

Використання

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

Спробуйте в Інтернеті!


Визначення g=filterзаощаджує вам один байт
siracusa

Можна навіть видалити ще кілька байт за допомогою m y=length$takeWhile(<maximum y)yі скоротити lengthзамістьfilter
siracusa

2

Clojure, 64 байти

Цей також працює з від'ємними числами на вході, на щастя такою ж довжиною, як і оригінал:

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

Оригінал:

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

числа в матриці - цілі числа. так що pos?не правильно
cliffroot

Щоправда, я забув рахувати мінусові цілі числа. Виправлено зараз.
NikoNyrh

2

q / kdb +, 25 17 16 байт

Рішення:

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

Приклад:

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

Пояснення:

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

Примітки:

Проблема досить проста, таке рішення відчувається надмірно складним. Як тільки я натиснув подати, я зрозумів помилку своїх способів.

Бонус:

Ось ак-рішення, яке важить в 16 10 9 байт - майже точно таке ж, але на 7 байт коротше через те, що нам не потрібні дужки при використанні вбудованих k, і в результаті деякі стають коротшими, ніж ключові слова q ( наприклад +/для sum(було б (+/)у q)).

*<+/+0=/:



1

V , 18 байт

òø0
jòÚDuu/"
dGؾ

Спробуйте в Інтернеті!

На відміну від більшості V відповідей, це 0-індексується.

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

Непогано для мови без числової підтримки! ;P

Я також виявив, що великий варіант команди count , тобто Øжахливо порушений.


1

Python 3 , 92 байти

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

Спочатку сортуйте кожен рядок таким [0,0,..,0,x,x,x]чином, щоб записи потім сортували всю матрицю, так що останній запис у yрядку, який ми шукаємо. Копія y=x[:]необхідна, оскільки .sort()працює на місці, отже, ми не знаємо оригінальний індекс після сортування.

Я вдячний за будь-яку допомогу щодо подальшого гольфу над цим рішенням. Більшість байтів втрачається через пробіли в кожному рядку. Сам код довжиною всього 68 байт.

Спробуйте в Інтернеті!


1
Я не знаю Python, але чи не можете ви видалити з цього більшість пробілів?
TheLethalCoder

@TheLethalCoder Python використовує відступ замість дужок для кодових блоків, замість дужок або ключових слів (наприклад, для .. кінця).
P. Siehr

1
Навіть тоді пітон може бути в гольф неабиякою сумою. Наступний еквівалент вашому вихідному коду:def f(a):b=list(map(sorted,a));return b.index(sorted(b)[-1])
CensoredUsername

У цій відповіді використовується цикл for та функція, але без нових рядків, тому я припускаю, що ви можете видалити багато з них, хоча саме Python 2 обмеження пробілів мають бути подібними.
TheLethalCoder


1

Пітон 2 , 64 55 52 48 байт

  • Дякуємо @Rod за гоління 9 байт !! : count 0s і використовувати min()замістьmax()
  • @Rod зберегли ще 3 байти: використовувати input()замістьdef
  • @ovs збережено 4 байти : використання lambdaта хеш-карту
lambda x:x.index(min(x,key=lambda n:n.count(0)))

Спробуйте в Інтернеті!



Дякую @ovs. Я не точно зрозумів, як це працює.
officialaimm

1
Це більш-менш ту ж логіку , що у вас на вашу відповідь, але при використанні minз keyпараметром
Rod

1

JavaScript (ES6), 62 байти

0-індексований. Приймає 2D масив як вхідний.

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

Чи можете ви додати пояснення до цього? Чи filterнеявно «фільтрує» нулі?
TheLethalCoder

Ти повинен повернути індекс рядка ...
Ніл

І все ж намагаюся пограти ще трохи, але @TheLethalCoder додасть демонстрацію та пояснення, коли я закінчу. Тим часом, дивіться тут, щоб отримати більше інформації про filter, маючи на увазі, що 0це фальси.
Shaggy

@Neil: Виправлено зараз.
Кудлатий

@Shaggy Я припускав, що це filterбуло так, що я просто переконався.
TheLethalCoder


1

Pyth, 6 байт

xQh/D0

Демонстрація

Замість того, щоб знайти рядок з найбільш ненульовими елементами, я знаходжу рядок з найменшими нульовими елементами.

/D0: Порядок ( D) по підрахунку ( /) нулів ( 0). Неналежне застосування до Qвводу.

h: Візьміть перший, і мінімум, елемент.

xQ: Знайдіть індекс ( x) у вході ( Q) цього елемента.


Це саме те, що я мав колодязь. Це здавалося незграбним, і мені здається, що я щось пропустив, але, схоже, просто немає чистого способу зробити це :(
FryAmTheEggman


1

Java 8, 145 байт

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

Некрасиво, але це працює ..

Пояснення:

Спробуйте тут.

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 байт

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

Спробуйте в Інтернеті!

Ява, ця мила багатослівна мова :)

Дякуємо за збереження 18 байт, @KevinCruijssen;)


+1 приємна відповідь. Я вже збирався опублікувати ще більш детальну відповідь. Сумнівався, чи слід її публікувати, і це добре, що я не мав, оскільки це 145 байт і некрасиво ..;) Ось це ... EDIT: Хм, btw, ваші останні два тестові справи провалюються ..
Кевін Круїйсен

Перевірка вашого коду щойно дала мені зрозуміти, що у моїй відповіді є помилка! o_O Я навіть не знаю, як проходять мої тестові справи ...
Олів'є Грегоар

Добре йти, я це виправив!
Олів’є Грегоар

1
Приємно! До речі, ви можете пограти в гольф, використовуючи кожну внутрішню петлю, щоб позбутися jта інших довших деталей, таких як j=m[i].length,і m[i][j]це: 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 байт )
Кевін Крейсейсен,

1

JavaScript (ES6), 51 байт

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

де mє двовимірний масив, а повернутий індекс 0-індексується

Тестові приклади:


1

Java 8, 100 байт

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

Пояснення

Сила списків і потоків! (і без імпорту, для завантаження!)

Давайте розбимо цю маленьку лямбда на шматки:

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

Ми перетворюємо наш Список списків (матриця у питанні) в потік і проходимо кожен елемент, видаляючи всі ці примхливі нулі з кожного підсписку. Нам потрібно щоразу явно повертати підсписи сюди, тому що Stream.map()перетворює кожен об'єкт у потоці до того, що відображається відображення, і ми не хочемо їх змінювати.

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

Ми проходимо наші недавно зняті з нуля списки і просто перевіряємо, наскільки вони великі поруч, отримуючи для нас найбільший підпис. Це .get()тому, що Stream.max()повертає необов'язково, вимагаючи цього додаткового виклику функції.

m.indexOf()

Ми беремо цей найбільший підсклад і знаходимо, де він знаходиться в головному списку, і даємо нам результат!

Примітки

Це порушується, якщо зовнішній список порожній, але я беру

Ви можете припустити, що буде лише один рядок з найбільш ненульовими елементами.

мається на увазі, що завжди буде хоча б один ряд. Виправте мене, якщо я помиляюся.


1

Python 2 , 51 байт

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

Спробуйте в Інтернеті!

Ця версія видаляє 0s поступово через масиви, друкуючи поточний індекс, і збої, коли немає більше нулів для видалення. Останній надрукований індекс - це відповідь.

Python 2 , 57 байт

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

Спробуйте в Інтернеті!

Хотів спробувати інший підхід від того, що вже є тут. Тож тут я рекурсивно повторюю над масивом, видаляючи по одному 0, поки поточний масив більше не має нулів - і потім виводжу індекс цього масиву.


1

Japt , 7 байт

0-індексований. Приймає введення як масив масивів.

mè
bUrw

Перевірте це


Пояснення

Неявне введення масиву U.
[[0,4,1,0],[0,0,-6,0],[0,1,4,-3],[2,0,0,8],[0,0,0,0]]

Мапа ( m) над Uповерненням кількості правдивих (ненульових) елементів у кожному підмасиві. Недвозначно призначити цьому новому масиву U.
[2,1,3,2,0]

Urw

Зменшити rмасив ( ) U, отримавши більше значення поточного значення та поточного елемента.
3

b

Отримайте перший індекс, Uде елемент дорівнює цьому значенню, і неявно виводить результат.
2

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.