非ゼロとその近傍を保持する


26

Stack Overflowのこの質問から引用。@milesと@Dadaにも、いくつかのコーナーケースに対処するテスト入力を提案してくれてありがとう。

チャレンジ

整数値の配列が与えられた場合、ゼロ以外の値に挟まれていないゼロをすべて削除します。

同様に、エントリがゼロ以外の場合、またはエントリがゼロ以外の値にすぐに近い場合は、エントリを保持する必要があります。

保持されるエントリは、入力での順序を出力で維持する必要があります。

与えられた

[2 0 4 -3 0 0 0 3 0 0 2 0 0]

削除する必要がある値には、x次のマークが付いています。

[2 0 4 -3 0 x 0 3 0 0 2 0 x]

そして、出力は次のようになります

[2 0 4 -3 0 0 3 0 0 2 0]

ルール

入力配列が空の場合があります(そして出力も空でなければなりません)。

入力および出力形式は、通常どおり柔軟です:配列、リスト、文字列、または合理的なもの。

コードゴルフ、最高の最少。

テストケース

[2 0 4 -3 0 0 0 3 0 0 2 0 0] -> [2 0 4 -3 0 0 3 0 0 2 0]
[] -> []
[1] -> [1]
[4 3 8 5 -6] -> [4 3 8 5 -6]
[4 3 8 0 5 -6] -> [4 3 8 0 5 -6]
[0] -> []
[0 0] -> []
[0 0 0 0] -> []
[0 0 0 8 0 1 0 0] -> [0 8 0 1 0]
[-5 0 5] -> [-5 0 5]
[50 0] -> [50 0]

_2代わりに使用できます-2か?かなりの数の言語がその形式を使用しています。
リーキー修道女

あり-0ますか?
リーキー修道女

@LeakyNun 1はい2いいえ
ルイスメンドー

数字に先行ゼロはありますか?好き[010 0 0 01 1]
FryAmTheEggman

@FryAmTheEggmanいいえ
ルイスメンドー

回答:


16

JavaScript(ES6)、35バイト

a=>a.filter((e,i)=>e|a[i-1]|a[i+1])

2バイト余分にフロートでも動作します。


10

Python、50バイト

f=lambda l,*p:l and l[:any(l[:2]+p)]+f(l[1:],l[0])

タプルを受け取る再帰関数。最初の2つの要素または前回から保存された以前の値のいずれかにゼロ以外の値がある場合、最初の要素を含めます。次に、最初の要素を削除して再帰します。前の要素はsingleton-listに格納されますp。これはリストに自動的にパックされ、空として開始します(これで3バイトのDennisに感謝します)。


55バイト:

lambda l:[t[1]for t in zip([0]+l,l,l[1:]+[0])if any(t)]

リストのすべての長さ3のチャンクを生成し、最初に開始と終了にゼロを置き、すべてがゼロではないものの中間要素を取ります。

反復アプローチがより長くなった(58バイト)

a=0;b,*l=input()
for x in l+[0]:a|b|x and print(b);a,b=b,x

b,*lPython 3が必要なため、これは正確に機能しませんが、Python 3 inputは文字列を提供します。初期化もalsoいです。同様の再帰的アプローチがうまくいくかもしれません。

残念ながら、

lambda l:[x for i,x in enumerate(l)if any(l[i-1:i+2])]

は、リストの開始点ではなくリストの終了点としてl[-1:2]解釈さ-1れるため、機能しません。


10

Haskell、55 48バイト

h x=[b|a:b:c:_<-scanr(:)[0]$0:x,any(/=0)[a,b,c]]

使用例:h [0,0,0,8,0,1,0,0]-> [0,8,0,1,0]

scanr開始および終了時にx追加0で入力リストを再構築します。各ステップで、3つの要素をパターンマッチングし、非ゼロ要素が少なくとも1つある場合は真ん中の要素を保持します。

からzip3に切り替えて、@ xnorに7バイトをありがとうscanr


実行するだけでいいのですがh x=[snd t|t<-zip3(0:x)x$tail x++[0],(0,0,0)/=t]、実際に3タプルの2番目の要素を取得する簡単な方法はないと思います。
xnor

外のトリプルを取得するための短い判明scanよりzip3h x=[b|a:b:c:_<-scanr(:)[0]$0:x,any(/=0)[a,b,c]]
-xnor

8

Matlab、29 27バイト

入力は1*n行列で構成する必要があります(n=0可能な場合)。(0*0行列に対してエラーをスローします。)

@(a)a(conv(a.*a,1:3,'s')>0) 

畳み込みは成功の鍵です。


's'代わりに'same'<-:-D
ルイスメンドー

そのトリックは
ビルトイン

私は、ゴルフ以外の質問であっても、フラグを使って'UniformOutpout'(理解できるように)そのトリックを見てきました。しかし、私はこれについて知りませんでした
ルイスメンドー

1
~~a代わりに使用できますa.*aか?
feersum

2
@feersum Matlabは残念ながらlogical配列の畳み込みを拒否しています。これは多くの場合、Matlab自体で書かれていないビルトインの問題です。それ以外の場合、論理配列は数字の配列のように動作します。Octaveの考えでは機能するかもしれませんが、現時点ではインストールされていません。
-flawr

6

J、17 14バイト

#~0<3+/\0,~0,|

@ Zgarbの助けを借りて3バイトを節約しました。

使用法

   f =: #~0<3+/\0,~0,|
   f 2 0 4 _3 0 0 0 3 0 0 2 0 0
2 0 4 _3 0 0 3 0 0 2 0
   f ''

   f 0 0 0 8 0 1 0 0
0 8 0 1 0

説明

#~0<3+/\0,~0,|  Input: array A
             |  Get the absolute value of each in A
           0,   Prepend a 0
        0,~     Append a 0
    3  \        For each subarray of size 3, left to right
     +/           Reduce it using addition to find the sum
  0<            Test if each sum is greater than one
                (Converts positive values to one with zero remaining zero)
#~              Select the values from A using the previous as a mask and return

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


0<の代わりに働きますか0~:
ズガルブ

@Zgarbサイズ3のインフィックスは、処理後に正または負のいずれかになります。
マイル

ああ、私は負の値を忘れていました。
ズガルブ

6

MATL、8バイト

tg3:Z+g)

出力は、スペースで区切られた数字の文字列です。出力の空の配列は、何も表示されません(改行も表示されません)。

オンラインでお試しください!または、すべてのテストケースを確認します

説明

コードは入力を論理型に変換します。つまり、ゼロ以外のエントリはtrue(または1)になり、ゼロのエントリはfalse(または0)になります。次に、これはカーネルとコンボリューションされます[1 2 3]。ゼロ以外の値は、その位置とその隣接位置でゼロ以外の結果を引き起こします。論理に変換するtrueと、保持する必要がある値が得られるため、入力にインデックスを付けて目的の出力を生成します。

t    % Input array implicitly. Duplicate
g    % Convert to logical: nonzero becomes true, zero becomes false
3:   % Push array [1 2 3]
Z+   % Convolution, keeping size of first input
g    % Convert to logical
)    % Index into original array. Implicitly display


5

Python 3、55バイト

lambda s:[t[1]for t in zip([0]+s,s,s[1:]+[0])if any(t)]

1
ワオ。この前に@xnorの回答を見たかどうかはわかりませんが、ラムダの名前だけが異なるだけで、まったく同じコードがあります。あなたが彼のコードを使用した場合、彼にクレジットを与えてください。
テオ

誰のコードも見ていない。
RootTwo 16

3
@ T.Lukin実際に同じコードを思い付くのは珍しいことではありません。これはAnarchy Golfで発生することがわかります。AnarchyGolfでは締め切りまでコードが隠されており、複数の人がこのような同じソリューションに集中しています。
XNOR


4

Perl、34 + 1(-pフラグ)= 35バイト

s/([^1-9]0 |^)\K0 ?(?=0|$)//&&redo

実行するには-pフラグが必要です。入力として数値のリストを取得します。例えば ​​:

perl -pe 's/([^1-9]0 |^)\K0 ?(?=0|$)//&&redo' <<< "0 0 0 8 0 1 0 0
0 0 0
-5 0 5"

5入力すると取得します50 0
feersum

@feersum修正、ありがとう
ダダ

4

Haskell、48バイト

p%(h:t)=[h|any(/=0)$p:h:take 1t]++h%t
p%e=e
(0%)

前の要素p、最初の要素h、および後の要素(ある場合)を調べ、ゼロでない場合は最初の要素を付加しますh

条件any(/=0)$p:h:take 1tは長く、特にtake 1tです。おそらくパターンマッチングによって、それを短縮する方法を探します。


4

網膜42 35 33バイト

Martin Enderのおかげで7バイト。

(?<= ^ | \ b0)0(?= $ | 0)

 +

^ | $

最後の行が必要です。

すべてのテストケースを一度に検証します。(すべてのテストケースを一度に実行するために少し変更されています。)

これを行うのに最適な言語のように見えます...まだほとんどの答えに負けました。


I / O形式からブラケットを捨てるだけです。
マーティンエンダー


3

C、96バイト

f()整数のリストへのポインター、およびリストのサイズへのポインターで呼び出します。リストとサイズはインプレースで変更されます。

i,t,e,m;f(int*p,int*n){int*s=p;for(i=m=e=0;i++<*n;s+=t=m+*s||i<*n&&p[1],e+=t,m=*p++)*s=*p;*n=e;}

ideoneで試してみてください


多くの場合、K&Rパラメータースタイルは短くなりますが、ここではそうではありません- f(int*p,int*n)バイトを節約します。またはs、3番目のパラメーターとして定義します(それは渡されません。それは一種のOKです)。
-ugoren

3

Brachylog44 38バイト

,0gL:?:Lc:1fzbh.
~c[A:.:B],[0:0:0]'.l3

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

この言語は、物事を証明するのに適しています。これを使用します。

述語0(メイン述語)

,0gL:?:Lc:1fzbh.
 0gL               [0] = L    (assignment works both ways)
   L:?:Lc          [L:input:L] = temp
         :1f       find all solutions of predicate 1 with temp as input
            zbh.   then transpose and take the middle row and assign to output

述語1(補助述語)

~c[A:.:B],[0:0:0]'.l3
~c[A:.:B]                 input is in the form of [A:output:B]
         ,                and
          [0:0:0]'.       output is not [0:0:0]
                  .l3     and length of output is 3

2

画像処理ツールボックスを備えたMatlab、27バイト

@(a)a(~imerode(~a,~~(1:3)))

これは匿名関数です。

使用例:

>> @(a)a(~imerode(~a,~~(1:3)))
ans = 
    @(a)a(~imerode(~a,~~(1:3)))
>> ans([0 0 0 8 0 1 0 0])
ans =
     0     8     0     1     0

1
私も考えましたimerodeが、私のバージョンは現在のものよりも長くなり続けました、素敵な仕事=)
flawr

2

Bash + GNU utils、25

grep -vC1 ^0|grep -v \\-$

入力を改行で区切られたリストとして受け入れます。

Ideone-スペースで区切られた行と改行で区切られた行を変換することにより、すべてのテストケースを一緒に実行するためのテストドライバコードが追加されました。


2

チェダー、78バイト

a->([[]]+a.map((e,i)->e|(i?a[i-1]:0)|(i-a.len+1?a[i+1]:0)?[e]:[])).reduce((+))

テストスイート。

チェダーにはフィルターがないため、必要な要素をラップし、不要な要素を空の配列に変換してから、すべてを連結することにより、フィルター処理が行われます。

たとえば、に[0,0,0,8,0,1,0,0]なり[[],[],[0],[8],[0],[1],[0],[]]、連結された配列はになります[0,8,0,1,0]


.reduce((+))->.sum
ダウンゴート

@Downgoatいつ修正しましたか?
リーキー修道女

ああ、すみません。アレイを合計していると思いました。アレイに参加しない
-Downgoat

1

APL、14バイト

{⍵/⍨×3∨/0,⍵,0}

テスト:

      {⍵/⍨×3∨/0,⍵,0}2 0 4 ¯3 0 0 0 3 0 0 2 0 0
2 0 4 ¯3 0 0 3 0 0 2 0

説明:

  • 0,⍵,0:zeroの先頭と末尾にゼロを追加します
  • ×3∨/:3つの隣接する数値のすべてのグループのGCDの符号を見つけます(それらがすべてゼロの場合は0、そうでない場合は1になります)。
  • ⍵/⍨:結果が1であったfromからすべてのアイテムを選択します。

1

Ruby 2.x、63バイト

f=->(x){x.select.with_index{|y,i|x[i-1].to_i|y|x[i+1].to_i!=0}}

当然のことながら、これは本質的にNeilの優れたES6回答のポートです。

また、私の最初のpcg提出です。わーい。


1

Brain-Flak 142バイト

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

(<()>)(()){{}([]<([]){{}({}<>)<>({}<>)<>({}<>)<>(<>({}<>)<>({}<>)<>({})<>){{}((<()>))}{}{}([][()])}{}{}<>{}([]){{}({}<>)<>([])}{}<>>[[]])}{}{}

説明

(<()>)                    #Pad the top with an extra zero
(()){{}([]<...>[[]])}{}   #Until the stack height remains the same
 ([]){{}...([][()])}{}    #Until the stack height is one
  ({}<>)<>                #Move the top three to the other stack
  ({}<>)<>
  ({}<>)<>
  (...)                   #Push the sum of the top three
   <>({}<>)               #Move the second and third back
   <>({}<>)
   <>({})<>               #Leave the top of the stack
  {{}...}{}               #If the sum is not zero
   ((<()>))               #Add a buffer to the top of the stack
  {}                      #Pop the buffer/middle value
 {}                       #Remove extra zero
 <>                       #Switch to the off stack
 {}                       #Remove extra zero
 ([]){{}({}<>)<>([])}{}<> #Move the entire off stack back

リンクは空です。コードと入力を貼り付け、[保存]を押して結果のリンクを使用できます
ルイスメンドー

@LuisMendo残念ながら、私はtryitonlineを使用できないため、URLにリンクしました。
小麦ウィザード

なぜtryitonlineにアクセスできないのですか?
DJMcMayhem

@DJMcMayhem私のブラウザにはjavascriptがありませんでした。<s>今すぐ修正します。</ s>すでに完了していることに感謝します。
小麦ウィザード
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.