ほとんどの非ゼロ要素を持つ行のインデックス


26

これは単純なものです。整数の行列を入力として受け取り、ゼロ以外の要素が最も多い行のインデックスを出力します。ゼロ以外の要素が最も多い行は1つだけであると想定できます。

テストケース:

これらは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

05AB1E8 6バイト

ΣĀO}θk

オンラインでお試しください!

-Erik the Outgolferのおかげで2バイト

説明

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

-2のĀ代わりに使用しÄ0›ます。
エリックアウトゴルファー

イーはちょうど、私が持っていたよりもおそらくその部分を行うためのより良い方法があることに気付きました。くそー、毎日新しい05AB1Eコマンドを学んでいる気がする^^
ダトボイ

6

R、31バイト

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

行列を取る匿名関数を返します。

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

rowSums行を合計し、!m0を1に変換し、他のすべてを0に変換which.minします。最小合計を含む最初の行の1ベースのインデックスを返します(つまり、ゼロの数が最も少ない行)。

オンラインでお試しください!


which.min()ゼロ以外の要素はでFALSEになるため、必要!mです。
user2390246

@ 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





2

Haskell- 69 68バイト

シラクーサのおかげで1バイト節約できました!

行のインデックスはゼロです

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すると1バイト節約されます
シラクーサ

の代わりに数バイトをさらに削除し、代わりにm y=length$takeWhile(<maximum y)y短縮することもできますlengthfilter
シラクーサ

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は

確かに、負の整数を説明するのを忘れていました。修正されました。
ニコニール

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バイトで重み付けするkソリューションがあります-ほぼ同じですが、kビルトインを使用するときに角かっこが必要ないため7バイト短くなり、その結果、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は、ブラケットやキーワードの代わりに、コードブロックのブラケットではなくインデントを使用します(例:.. end)。
P. Siehr

1
その場合でも、Pythonはかなりの量をゴルフできます。以下は元のコードと同等です。def f(a):b=list(map(sorted,a));return b.index(sorted(b)[-1])
。– CensoredUsername

この答えはforループと関数を使用しますが、改行はありませんので、Python 2ですが、空白の制限は似ているはずですが、それらの多くを削除できると思います。
TheLethalCoder


1

パイソン264の55 52 48バイト

  • 9バイトを削る@Rodに感謝します!! 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
ロッド

1

JavaScript(ES6)、62バイト

0インデックス。入力として2D配列を受け取ります。

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

この説明を追加できますか?いfilter「フィルタ」ゼロ暗黙のうちに?
TheLethalCoder

行のインデックスを返すことになっています
ニール

@TheLethalCoderでさらにゴルフをしようとすると、完了したらデモと説明を追加します。一方、参照ここでは詳細はfilter念頭に置いて、0falseyです。
シャギー

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

glyいですが、動作します。

説明:

ここで試してみてください。

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、その甘い冗長な言語:)

18バイトを保存してくれてありがとう、@ KevinCruijssen;)


+1いい答え。もっと詳細な回答を自分で投稿しようとしていました。それを投稿するかどうか疑問に思っていました。145バイトでsince いので、それは良いことではありませんでした..;)あなたの最後の2つのテストケースが...失敗
ケビンCruijssen

コードを確認すると、答えにバグがあることに気づきました!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バイト
ケビンCruijssen

1

JavaScript(ES6)、51バイト

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

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

リストのリスト(質問のマトリックス)をストリームに変換し、各要素を調べて、各サブリストからこれらの厄介なゼロをすべて削除します。Stream.map()ストリーム内の各オブジェクトをマッピングが返すものに変換するため、ここでは毎回明示的にサブリストを返す必要がありますが、変更する必要はありません。

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

新しくデゼロ化されたサブリストを調べ、それらが互いにどれだけ大きいかを確認して、最大のサブリストを取得します。これ.get()Stream.max()、が追加の関数呼び出しを必要とするOptionalを返すためです。

m.indexOf()

最大のサブリストを取得し、メインリストのどこにあるかを見つけて、結果を出します!

ノート

外側のリストが空の場合、これは壊れますが、私は取っています

ゼロ以外の要素が最も多い行は1つだけであると想定できます。

常に少なくとも1つの行があることを意味します。私が間違っている場合は修正してください。


1

Python 2、51バイト

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

オンラインでお試しください!

このバージョンでは、配列から0が徐々に削除され、現在のインデックスが出力されます。削除するゼロがなくなるとクラッシュします。最後に印刷されたインデックスが答えです。

Python 2、57バイト

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

オンラインでお試しください!

すでにここにあるものとは異なるアプローチを試してみたかった。そこで、現在の配列にゼロがなくなるまで、一度に1つの0を削除しながら配列を再帰的に反復処理し、その配列のインデックスを出力します。


1

Japt、7バイト

0インデックス。入力を配列の配列として受け取ります。

mè
bUrw

試して


説明

arrayの暗黙的な入力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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.