先行ゼロと後続ゼロを削除します


31

次のような非負の整数のみを含む空でないリスト/配列がある場合:

[0, 0, 0, 8, 1, 4, 3, 5, 6, 4, 1, 2, 0, 0, 0, 0]

末尾のゼロと先頭のゼロを削除してリストを出力します。

この出力は次のようになります。

[8, 1, 4, 3, 5, 6, 4, 1, 2]

他のいくつかのテストケース:

[0, 4, 1, 2, 0, 1, 2, 4, 0] > [4, 1, 2, 0, 1, 2, 4]
[0, 0, 0, 0, 0, 0] > nothing
[3, 4, 5, 0, 0] > [3, 4, 5]
[6] > [6]

最短のコードが勝つ


数値は非負の整数のみですか?それを明確にするか、他の番号のテストケースを追加することをお勧めします
ルイスメンドー

1
少なくとも1つの先頭と1つの末尾の0があると仮定できますか?
DJMcMayhem

4
何も構成しないのは何ですか?私はPerlで何ものバリエーションであるいくつかの異なるものを考えることができます6. Nil ()/ [] slip()/ Empty Any {}それらのいくつかの未定義されている、いくつかの定義されているが、単数、他のリストにスリップが、彼らは要素の数を増加させないように、いくつかのこと。(Anyクラス/タイプおよびロールと同数の異なるバリエーションがあります)
ブラッドギルバートb2gills

7
10を超える整数がないのは偶然でしょうか、それともすべての数字が1桁になると仮定できますか?
シモンズ

1
リストを区切り文字列として入出力できますか?例:"0,4,1,2,0,1,2,4,0" => "4,1,2,0,1,2,4"編集:多くの言語が既にこれを行っていることに気付いた。
Mwr247

回答:


25

ゼリー、2バイト

コード:

t0

説明:

t   # Trim off...
 0  #  zero at both sides

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


10
これは動作しますか?うん MATLの答えは正気ではないと思いました。
Skyl3r

4
ゼリーをしないでください
アディソンクランプ

もちろん、ゼリーはほぼ毎回他のすべての男を打ち負かしています...
エリックアウトゴルファー

Jellyは実際のビジネスで使用されていますか?
-Chromozorz

男、私は望んでいない
カレブポール

10

JavaScript(ES6)43

a=>(f=a=>a.reverse().filter(x=>a|=x))(f(a))

少ないゴルフ

a=>{
  f=a=>a.reverse().filter(x=>a|=x) // reverse and remove leading 0
  // leverage js cast rules: operator | cast operands to integer
  // an array casted to integer is 0 unless the array is made of
  // a single integer value (that is ok for me in this case)
  return f(f(a)) // apply 2 times
}

テスト

F=a=>(f=a=>a.reverse().filter(x=>a|=x))(f(a))

function test(){
  var l=(I.value.match(/\d+/g)||[]).map(x=>+x)
  O.textContent=F(l)
}

test()
#I { width:90%}
<input id=I oninput='test()' value='0 0 1 3 7 11 0 8 23 0 0 0'>
<pre id=O></pre>


1
いいね f=(a,r=f(a,a))=>r.reverse().filter(x=>a|=x)また、43バイトです。
ニール

6

CJam、13バイト

l~{_{}#>W%}2*

入力された配列で。

長いバージョン:

l~             Puts input on the stack and parse as array
  {       }    Code block
   _           Duplicate the first thing on the stack
    {}#        Finds the index of the first non-0 value in the array, puts it on the stack
       >       Slices the array from that index
        W%     Reverses the array
           2*  Does the code block twice in total

ベースへの変換とベースからの変換によって先行ゼロが削除されるという事実を使用できるといいのですが、長すぎるように見えます。
エソランジングフルーツ

5

Pyth、4バイト

.sQ0

デモ:

llama@llama:~$ pyth -c .sQ0
[0, 0, 0, 1, 2, 0, 3, 4, 0, 0, 5, 0, 0, 0, 0]
[1, 2, 0, 3, 4, 0, 0, 5]

Pyth'srev-doc.txtから:

.s <seq> <any>
    Strip from A maximal prefix and suffix of A consisting of copies of B.



5

R、43バイト

function(x)x[cummax(x)&rev(cummax(rev(x)))]

または読み取り/書き込みSTDIN / STDOUTとして

x=scan();cat(x[cummax(x)&rev(cummax(rev(x)))])

これは、最初と最後の(逆の)文字列から累積最大値を見つけます。&オペレータは、同じサイズの論理1にこれら二つのベクトルを変換しx、(ゼロが常にに変換されますFALSEし、他のすべてにTRUE)、それからサブセットすることが可能となり、このようx出会った条件に従って。



4

Mathematica 34 27バイト

#//.{0,a___}|{a___,0}:>{a}&

これにより、そのようなアクションが新しい出力の提供に失敗するまで、置換ルールが繰り返し適用されます。Alephalphaのおかげで7バイト節約されました。

最初のルールは、先頭のゼロを削除します。2番目のルールは、配列の最後のゼロを削除します。


3
#//.{0,a___}|{a___,0}:>{a}&
-alephalpha


3

Perl、19 + 1 = 20バイト

s/^(0 ?)+|( 0)+$//g

-pフラグが必要:

$ perl -pE's/^(0 )+|( 0)+$//g' <<< '0 0 0 1 2 3 4 5 6 0 0 0'
1 2 3 4 5 6

@MartinBüttner[コメントの追加]を押した直後とほぼ同じですが、今すぐコード
ダウンで

悪意のあるHTMLハック経由。;)
マーティン・エンダー

1
17 + 1バイト:s/^0 | 0$//&&redo
ケニー

@Kenneyそれは美しいです:-)それを答えとして投稿してください!
andlrc

ありがとう!私のオリジナルも19 + 1バイトでしたが、あなたの答えを見て、さらに2つ削るというアイデアがありましたので、あなたが望むならあなたのものです。ちなみに、?例のようにをドロップした場合、実際の答えは18 + 1 "0"です。しかし、それは減少しません
..-ケニー

3

ゼリー、10バイト

Uo\U,o\PTị

これは組み込みを使用しません。

Uo\U            Backward running logical OR
    ,           paired with
     o\         Forward running logical OR
       P        Product
        T       All indices of truthy elements
         ị      Index the input at those values.

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


3

Perl、38バイト

$\.=$_}{$\=~s/^(0\n)*|(0\n)*\n$//gs

で実行しperl -pます(に3バイト追加-p)。

STDINの番号を1行に1つずつ受け入れます。正常に動作するUNIXユーティリティが必要とするように、STDOUTに1行に1つずつ数値を出力します。

「0」で正確に表される数値のみをゼロとして扱います。正規表現でさらに数バイトを使用して、他の表現をサポートすることも可能です。

より長いバージョン、まだで実行される-p

    # append entire line to output record separator
    $\.=$_
}{
    # replace leading and trailng zeroes in output record separator
    $\ =~ s/^(0\n)*|(0\n)*\n$//gs
    # output record separator will be implicitly printed

-pフラグとの相互作用を示す拡張バージョン:

# implicit while loop added by -p
while (<>) {
    # append line to output record separator
    $\.=$_
}{ # escape the implicit while loop
    # replace leading and traling 
    $\=~s/^(0\n)*|(0\n)*\n$//gs
    # print by default prints $_ followed by
    # the output record separator $\ which contains our answer
    ;print # implicit print added by -p
} # implicit closing brace added by -p

で実行していると仮定するとperl -E-pフラグは通常1バイトとしてのみカウントされますperl -pE
クリス

3

Elixir、77バイト

import Enum
z=fn x->x==0 end
reverse(drop_while(reverse(drop_while(l,z)),z))

lは配列です。

編集:わ!コピー/パスタは失敗します。もちろん、Enumをインポートする必要があります。これにより、バイトカウントが12増加します(または、Enum.function_nameを使用すると、さらに長くなります)。


3

Vitsy、13バイト

Vitsyは徐々に良くなっています...(私はあなたのためにゼリーに来ています。._ಠ)

1mr1m
D)[X1m]

これは、スタック上の配列で終了します。読みやすくするために、TryItOnline!説明の下に提供したリンクは、フォーマットされたリストを出力します。

説明:

1mr1m
1m      Do the second line of code.
  r     Reverse the stack.
   1m   I'ma let you figure this one out. ;)

D)[X1m]
D       Duplicate the top item of the stack.
 )[   ] If the top item of the stack is zero, do the stuff in brackets.
   X    Remove the top item of the stack.
    1m  Execute the second line of code.

これにより、不当に大きな入力に対してStackOverflowExceptionがスローされることに注意してください。

TryItOnline!


2
VitsyはいつかJellyを取得します。
コナーオブライエン

EOL / EOFにオートブラケットマッチングを追加
チョイス

3

R、39バイト

function(x)x[min(i<-which(x>0)):max(i)]

David ArenburgのR回答より4バイト短い。この実装は、配列内でゼロより大きい最初と最後のインデックスを見つけ、それらの2つのインデックス間の配列内のすべてを返します。



2

Dyalog APL、15バイト

{⌽⍵↓⍨+/0=+\⍵}⍣2

               ⍣2     Apply this function twice:
{             }       Monadic function:
           +\⍵        Calculate the running sum.
       +/0=           Compare to zero and sum. Number of leading zeroes.
   ⍵↓⍨               Drop the first that many elements from the array.
 ⌽                   Reverse the result.

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


どう{⌽⍵/⍨×+\⍵}⍣2
-lstefano

2

ルビー、49 44バイト

->a{eval ?a+'.drop_while{|i|i<1}.reverse'*2}

マナトワークのおかげでまったく異なる方法で5バイトてにます!

これdropは配列の最初の要素であるwhile0であり、配列を反転し、繰り返し、最後に配列を反転して適切な順序に戻します。


痛い。これで、.drop_while()ベースのソリューションでさえ短くなります(2つの機能を使用する場合):f=->a{a.drop_while{|i|i<1}.reverse};->a{f[f[a]]}
manatwork

ど 2つの関数は必要ありませんが、いくつかのevalさがあります->a{eval ?a+'.drop_while{|i|i<1}.reverse'*2}
マナトワーク

@manatwork <1とにかく、私が考えなかった理由がわからない。ありがとう!
ドアノブ

2

Vim 16キーストローク

i<input><esc>?[1-9]<enter>lD0d/<up><enter>

入力はとの間iでユーザーによって入力さescれ、キーストロークとしてカウントされません。これは、少なくとも1つの先行ゼロと1つの後続ゼロがあることを前提としています。それが有効な仮定でない場合、この少し長いバージョンを使用できます:(18キーストローク)

i <input> <esc>?[1-9]<enter>lD0d/<up><enter>

1
ユーザーが数字(iおよび<esc>)を入力できるようにするコードを含める必要はないと思います。vimゴルフでは、ゴルファーは、バッファーにロードされたファイルに既に入力された状態で開始し、左上隅にカーソルがありますが、ユーザーは保存して終了する必要があります(ZZ通常は最速の方法です)。その後、次のようなことを行うことができますd[1-9]<enter>$NlDZZ(13キーストローク)。注N/のn代わりに/<up><enter>
-daniero

2

ES6、51バイト

f=a=>a.map(x=>x?t=++i:f<i++||++f,f=i=0)&&a.slice(f,t)

tは、最後のゼロ以外の値の後のインデックスに設定されますが、fこれまでにゼロのみが表示されている限り増分されます。


2

Perl 6、23バイト

{.[.grep(?*):k.minmax]}
{.[minmax .grep(?*):k]}

使用法:

# replace the built-in trim subroutine
# with this one in the current lexical scope
my &trim = {.[.grep(?*):k.minmax]}

say trim [0, 0, 0, 8, 1, 4, 3, 5, 6, 4, 1, 2, 0, 0, 0, 0];
# (8 1 4 3 5 6 4 1 2)
say trim [0, 4, 1, 2, 0, 1, 2, 4, 0];
# (4 1 2 0 1 2 4)
say trim [0, 0, 0, 0, 0, 0];
# ()
say trim [3, 4, 5, 0, 0];
# (3 4 5)
say trim [6];
# (6)


2

JavaScript(ES6)、47バイト

a=>a.join(a="").replace(/(^0+|0+$)/g,a).split(a)

a配列はどこにありますか。


4
入力を取得するには、匿名関数を作成する必要があると思いますa=>a.join(a="")...
-andlrc

2
これは、整数が1桁の場合にのみ適切に処理します
16

@ dev-null完了。
user2428118

それでも、複数桁の整数に対して間違った値を返します。[14]戻り[1, 4]ます。
Mwr247

実際、私はまだこのコメントへの返信を待っていました(そして今も)。とにかく、私は残念ながら、私は私の答えに使用したのと同じ手法を用いてハンドル複数桁の整数を行う方法を見ていないと私は私が打つことができるでしょうとは思わない、この答えをとにかく。時間があれば試してみるかもしれませんが。
user2428118


2

JavaScript(ES6)、34バイト

a=>a.replace(/^(0 ?)*|( 0)*$/g,'')

入力と出力は、などのスペース区切りリストの形式です"0 4 1 2 0 1 2 4 0"



2

PHP、56 54 52バイト

Windows-1252エンコードを使用

文字列ベースのソリューション

<?=preg_replace(~ÜÒ×ßÏÖÔƒ×ßÏÖÔÛÜ,"",join($argv,~ß));

次のように実行します:

echo '<?=preg_replace(~ÜÒ×ßÏÖÔƒ×ßÏÖÔÛÜ,"",join($argv,~ß));' | php -- 0 0 123 234 0 500 0 0 2>/dev/null;echo

端末がUTF-8に設定されている場合、これは同じです。

echo '<?=preg_replace("#-( 0)+|( 0)+$#","",join($argv," "));' | php -- 0 0 123 234 0 500 0 0 2>/dev/null;echo

微調整

  • 文字列を無効にし、文字列区切り文字を削除して、2バイトを節約しました
  • 短い印刷タグを使用して2バイトを保存

1
ASCIIソリューションを提供してください。誰もこれを読むことができません!
タイタス

1
@タイタス確かに。しかし、そこには読めないエソランがたくさんあります....私の答えが家にいると感じないというわけではありません。
アロス

結合の最初のパラメーターとしての配列?
ヨルクヒュルサーマン16年

1
@JörgHülsermannYup。他の方法で文書化されていますが、両方を受け入れます。
アロス

あなたは正しいです、私はそれを認識していません
ヨルグヒュルサーマン

2

Python 2、69 67バイト

def f(a):
 for i in(0,-1):
  while a and a[i]==0:a.pop(i)
 return a

2行目のタプルの前のスペースを削除できます。
ザックゲイツ

できることfor i in-1,0:
mbomb007

また、バイトを再カウントすることもできます。私は67をそのまま数えます。また、置き換えることができ[space][space]while[tab]while。と==0することができます<1mothereff.in/...
mbomb007


1

PowerShell、49バイト

($args[0]-join',').trim(',0').trim('0,')-split','

入力$args[0]を取得し、-joinそれらをコンマと一緒に使用して文字列を形成します。次に、.Trim()2回呼び出される関数を使用して、最初に末尾のゼロとコンマを削除します。次に-split、コンマ上の文字列を配列に戻します。


変換PowerShell を使用しない代替バージョン、
81バイト

function f{param($a)$a=$a|%{if($_-or$b){$b=1;$_}};$a[$a.Count..0]}
f(f($args[0]))

PowerShellには配列をトリミングする関数がないfため、この半分を処理する新しい関数を定義します。関数は$a入力として受け取り、foreach loopで各アイテムをループします|%{...}。繰り返しごとに、の条件をチェックします$_ -or $b。ゼロ以外の整数は真実である$nullが偽であるため(および$b、以前に定義されていないため、として開始します$null)、これは$true配列内の最初のゼロ以外の要素にヒットすると評価されます。次に$b=1、現在の値$_を設定してパイプラインに追加します。その後、入力配列の最後まで続きます。中央にゼロがあり、出力に最後が追加されます。$bます。真実です。

ループの結果をカプセル化し、すべて保存します$a。次に、$a逆の順序でインデックスを作成します(つまり、配列を逆にします)。これはパイプライン上に残されるため、関数の戻り値になります。

$args[0]プログラムの入力で関数を2回呼び出して、正面から「トリム」し、次に正面(逆にしたので背面)を再度トリムします。2回反転するため、順序は保持されます。

このバージョンは、すべてゼロの入力配列の規則で少し緩い動作をしますが、STDERRを無視することは慣習として受け入れられているため、プログラムは(PowerShellの同等の) STDERRに2つの(詳細な)Cannot index into a null arrayエラーを吐き出し、何も出力しません。

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