ดัชนีของแถวที่มีองค์ประกอบที่ไม่ใช่ศูนย์ส่วนใหญ่


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 ไบต์ขอบคุณErik the Outgolfer

คำอธิบาย

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

ใช้ĀแทนÄ0›-2
Erik the Outgolfer

ยีเพิ่งรู้ว่าอาจเป็นวิธีที่ดีกว่าในการทำส่วนนั้นมากกว่าสิ่งที่ฉันมี ประณามฉันรู้สึกเหมือนฉันกำลังเรียนรู้คำสั่ง 05AB1E ใหม่ทุกวัน ^^
Datboi

6

R , 31 ไบต์

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

ส่งคืนฟังก์ชันที่ไม่ระบุชื่อซึ่งใช้เมทริกซ์:

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

rowSumsสรุปจำนวนแถวโดย!mแปลงเป็น 0 ถึง 1 และทุกอย่างเป็น 0which.minจะส่งคืนดัชนีที่อิง 1 ของแถวแรกซึ่งมีผลรวมขั้นต่ำ (เช่นแถวใดที่มีค่าศูนย์น้อยที่สุด)

ลองออนไลน์!


คุณต้องตั้งแต่ที่ไม่ใช่ศูนย์องค์ประกอบจะกลายเป็นเท็จด้วยwhich.min() !m
user2390246

@ user2390246 โอ้ว้าวฉันอ่านผิดไปหมด คงที่ขอบคุณ
Giuseppe

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

APL (Dyalog) 11 ไบต์

(⊢⍳⌈/)+/0≠⎕

ลองออนไลน์!

0≠⎕ บูลีนเมทริกซ์โดยที่ไม่เป็นศูนย์

+/ แถวผลรวม

( ใช้ฟังก์ชัน tacit ต่อไปนี้กับรายการผลรวม

⌈/ สูงสุดของ

 ดัชนี

 ในรายการอาร์กิวเมนต์

)





2

Haskell - 69 68 ไบต์

บันทึกไว้หนึ่งไบต์ขอบคุณ Siracusa!

แถวถูกทำดัชนีเป็นศูนย์

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?ไม่ถูกต้อง
หน้าผา

จริงฉันลืมบัญชีสำหรับจำนวนเต็มลบ แก้ไขแล้ว
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

หมายเหตุ:

ปัญหานี้ค่อนข้างตรงไปตรงมาวิธีนี้ให้ความรู้สึกซับซ้อนเกินไป ทันทีที่ฉันกดปุ่มส่งฉันก็ตระหนักถึงข้อผิดพลาดของวิธีการของฉัน

โบนัส:

นี่คือโซลูชัน ak ที่มีน้ำหนักอยู่ที่16 10 9 ไบต์ - เกือบจะเหมือนกัน แต่สั้นกว่า 7 ไบต์เนื่องจากเราไม่ต้องการวงเล็บเหลี่ยมเมื่อใช้ k-ins ในตัวและทำให้บางคำสั้นกว่า 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 ใช้การเยื้องแทนวงเล็บสำหรับ codeblocks แทนวงเล็บหรือคำหลัก (เช่นสำหรับ .. end)
P. Siehr

1
แม้กระทั่งงูหลามก็สามารถตีกอล์ฟได้ในจำนวนที่พอใช้ ข้อมูลต่อไปนี้เทียบเท่ากับรหัสต้นฉบับของคุณ:def f(a):b=list(map(sorted,a));return b.index(sorted(b)[-1])
เซ็นเซอร์ชื่อผู้ใช้

คำตอบนี้ใช้สำหรับการวนซ้ำและฟังก์ชั่น แต่ไม่มี newlines ดังนั้นฉันคิดว่าคุณสามารถลบได้มากถึงแม้ว่ามันจะเป็น Python 2 ข้อ จำกัด ของช่องว่างควรจะคล้ายกัน
TheLethalCoder


1

Python 2 , 64 55 52 48 ไบต์

  • ขอบคุณ @Rod สำหรับการโกน 9 ไบต์ !! : นับจำนวน0และใช้min()แทนmax()
  • @Rod บันทึกอีก 3 ไบต์: ใช้input()แทนdef
  • @ovs บันทึก 4 ไบต์ : use of lambdaand hash-map
lambda x:x.index(min(x,key=lambda n:n.count(0)))

ลองออนไลน์!



ขอบคุณ @ovs ฉันไม่เข้าใจเลยว่ามันทำงานอย่างไร
อย่างเป็นทางการ

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

คุณควรจะส่งคืนดัชนีของแถว ...
Neil

@TheLethalCoder ยังคงพยายามที่จะเล่นกอล์ฟให้มากขึ้นจะเพิ่มการสาธิตและคำอธิบายเมื่อฉันทำเสร็จแล้ว ในระหว่างนี้โปรดดูที่นี่สำหรับข้อมูลเพิ่มเติมfilterโดยคำนึงถึงความ0ผิดพลาด
Shaggy

@Neil: แก้ไขแล้ว
Shaggy

@Shaggy ฉันคิดว่าเป็นกรณีของfilterก็แค่ทำให้แน่ใจ
TheLethalCoder


1

Pyth, 6 ไบต์

xQh/D0

สาธิต

แทนที่จะค้นหาแถวที่มีองค์ประกอบที่ไม่ใช่ศูนย์มากที่สุดฉันจะพบแถวที่มีองค์ประกอบที่เป็นศูนย์น้อยที่สุด

/D0: คำสั่งซื้อ ( D) โดยการนับ ( /) ของศูนย์ ( 0) ใช้กับQอินพุตโดยปริยาย

h: ใช้องค์ประกอบแรกและต่ำสุด

xQ: ค้นหาดัชนี ( x) ในอินพุต ( Q) ขององค์ประกอบนั้น


นี่คือสิ่งที่ฉันมีดี มันรู้สึกว่าเป็น clunky และเหมือนว่าฉันหายไปบางสิ่งบางอย่าง แต่ดูเหมือนว่ามีวิธีไม่สะอาดที่จะทำ :(
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;}

ลองออนไลน์!

Java, ภาษา verbose ที่แสนหวาน :)

ขอบคุณที่บันทึก 18 ไบต์ @KevinCruijssen;)


+1 คำตอบที่ดี กำลังจะโพสต์คำตอบที่ละเอียดยิ่งขึ้นด้วยตัวเอง .. สงสัยว่าจะโพสต์หรือไม่และเป็นสิ่งที่ดีที่ฉันไม่ได้เพราะมันมีขนาด 145 ไบต์และน่าเกลียด .. ;) นี่คือ ...แก้ไข: อืม btw กรณีทดสอบสองรายการสุดท้ายของคุณล้มเหลว ..
Kevin Cruijssen

การตรวจสอบรหัสของคุณทำให้ฉันรู้ว่ามีข้อบกพร่องในคำตอบของฉัน! o_O ฉันไม่รู้ด้วยซ้ำว่ากรณีทดสอบของฉันผ่านไปได้อย่างไร ...
Olivier Grégoire

ดีไปฉันแก้ไขมัน!
Olivier Grégoire

1
ดี! กอล์ฟโดยใช้สำหรับแต่ละวงภายใน Btw, คุณสามารถที่จะได้รับการกำจัด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 ไบต์ )
เควิน Cruijssen

1

JavaScript (ES6), 51 ไบต์

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

โดยที่mเป็นอาร์เรย์ 2D และดัชนีที่ส่งคืนคือ 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;}

เราเปลี่ยน List of Lists (เมทริกซ์ในคำถาม) ของคุณเป็น Stream และผ่านแต่ละองค์ประกอบโดยลบค่าศูนย์ที่น่ารำคาญทั้งหมดออกจากแต่ละรายการย่อย เราจำเป็นต้องส่งคืนรายการย่อยอย่างชัดเจนทุกครั้งที่นี่เพราะ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 bytes

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

Reduce (r) array U by getting the greater of the current value and the current element.
3

b

Get the first index in U where the element equals that value and implicitly output the result.
2

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.