Baştaki ve sondaki sıfırları kaldır


31

Bunun gibi yalnızca negatif olmayan tam sayılar içeren boş olmayan bir liste / dizi verilirse:

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

Listeyi sondaki ve çıkarılan sıfırlarla kaldırılmış olarak çıkarın.

Bunun için çıktı şöyle olurdu:

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

Diğer bazı test durumları:

[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]

En kısa kod kazanır


Sayılar negatif olmayan tam sayılar mı? Bunu açıklığa kavuşturmanızı veya başka numaralarla test
senaryosu

1
En az bir lider ve bir son 0 olacağını varsayabilir miyiz?
DJMcMayhem

4
Hiçbir şey olmuyor mu? Perl 6'daki hiçbir şeyde varyasyon olan birkaç farklı şey düşünebilirim. Nil ()/ [] slip()/ Empty Any {}Bazıları tanımsız, bazıları tanımlanmış fakat tekil, bazıları ise diğer listelerde kayan ve öğelerin sayısını artırmayacak şekilde. ( AnySınıflar / türler ve rollerin olduğu kadar çok farklı varyasyonlar vardır)
Brad Gilbert b2gills

7
10'dan fazla tam sayı olmaması tesadüf mü yoksa tüm sayıların tek haneli olacağını varsayabilir miyiz?
Simmons

1
Ayrılmış bir dize olarak listeye giriş / çıkış yapabilir miyiz? Örneğin: "0,4,1,2,0,1,2,4,0" => "4,1,2,0,1,2,4"EDIT: Bunu zaten birçok dilde yaptığını farkettim.
Mwr247

Yanıtlar:



10

JavaScript (ES6) 43

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

Daha az golf oynadı

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
}

Ölçek

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
Güzel. f=(a,r=f(a,a))=>r.reverse().filter(x=>a|=x)ayrıca 43 bayttır.
Neil

6

CJam, 13 bayt

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

Girilen dizi ile.

Daha uzun versiyon:

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

Bir üsse ve bir tabandan dönüştürmenin baştaki sıfırları kaldıracağı gerçeğini kullanabilmeyi isterdim, ancak çok uzun gibi görünüyor.
Esolanging Fruit 0

5

Pyth, 4 bayt

.sQ0

Demo:

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]

Gönderen Pyth enrev-doc.txt :

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



5

R, 43 bayt

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

veya STDIN / STDOUT oku / yaz olarak

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

Bu, kümülatif maksimumu baştan ve sondan (ters) dize olarak bulur. &Gibi, operatör aynı boyutta mantıksal birine bu iki vektör dönüştürür x(sıfır zaman dönüştürülmüş olur, FALSEbaşka ve her şey TRUE), bunun mümkün kılan bu şekilde gelen alt kümesi için xbir araya koşullara göre.



4

Mathematica 34 27 bayt

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

Bu işlem, yeni bir çıktı sağlamada başarısız olana kadar sürekli olarak değiştirme kuralları uygular. Halep sayesinde 7 bayt kurtarıldı.

İlk kural başlangıçta bir sıfır siler; ikinci kural dizinin sonundaki sıfırı siler.


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


3

Perl, 19 + 1 = 20 bayt

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

-pBayrak gerektirir :

$ 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 Ben sadece [Yorum ekle] 'ye bastıktan hemen sonra aynısını düşünüyorum, şimdi
markdown'un

Kötü HTML kesmek yoluyla. ;)
Martin Ender

1
17 + 1 bayt:s/^0 | 0$//&&redo
Kenney,

@Kenney Bu çok güzel :-) Cevap olarak yazmalısınız!
andlrc

Teşekkürler! Orijinalim de 19 + 1 bayttı ama sonra cevabını gördüm, bu da bana 2 tane daha tıraş etmem için bir fikir verdi, bu yüzden istersen senin. Btw, cevabınız ?örnekte olduğu gibi düşürdüğünüzde aslında 18 + 1 - ama bu azalmayacak "0"..
Kenney

3

Jöle, 10 bayt

Uo\U,o\PTị

Bu yerleşik kullanmaz.

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.

Burada dene .


3

Perl, 38 bayt

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

Çalıştır perl -p, (3 bayt için eklendi -p).

Her satırda bir tane olmak üzere STDIN üzerindeki sayıları kabul eder; STDOUT'a, her bir satır için bir tane olmak üzere sayıları yayar;

Yalnızca '0' ile temsil edilen sayıları sıfır olarak kabul eder; regex'te birkaç byte ile başka gösterimleri desteklemek mümkün olacaktır.

Daha uzun sürüm, hala çalıştırılmak üzere -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

Genişletilmiş sürüm, -p flag ile etkileşimleri gösterir:

# 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

Çalıştığınızı varsayarsak perl -E, -pbayrak genellikle yalnızca bir bayt olarak sayılır, çünkü bu ve arasında farklı bir fazla bayt vardır perl -pE.
Chris,

3

İksir, 77 bayt

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

Ben dizi.

Düzenleme: wah! kopyala / makarna başarısız. Elbette kişi bayt sayısını 12'ye yükselten Enum almak zorunda (ya da daha da uzun hale getirecek Enum.function_name kullanın).


3

Vitsy, 13 bayt

Vitsy yavaş yavaş iyileşiyor ... (Senin için geliyorum Jelly. ಠ_ಠ)

1mr1m
D)[X1m]

Bu, yığındaki dizi ile çıkar. Okunabilirlik için TryItOnline! açıklamanın altında sağladığım bağlantı, biçimlendirilmiş bir liste çıkarır.

Açıklama:

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.

Bunun makul olmayan büyük girişler için bir StackOverflowException vereceğini unutmayın.

TryItOnline!


2
Vitsy bir gün Jelly'i alacak.
Conor O'Brien,

EOL /
EOF'de

3

R, 39 bayt

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

David Arenburg'un R cevabından dört byte kısa . Bu uygulama dizideki ilk ve son dizini sıfırdan büyük olanı bulur ve dizideki her şeyi bu iki dizin arasında döndürür.


3

MATL , 9 bayt

2:"PtYsg)

Çevrimiçi deneyin!

açıklama

2:"     % For loop (do the following twice)
  P     %   Flip array. Implicitly asks for input the first time
  t     %   Duplicate
  Ys    %   Cumulative sum
  g     %   Convert to logical index
  )     %   Apply index
        % Implicitly end for
        % Implicitly display stack contents

2

Dyalog APL, 15 bayt

{⌽⍵↓⍨+/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.

Burada dene .


Ne dersiniz {⌽⍵/⍨×+\⍵}⍣2?
lstefano

2

Ruby, 49 44 bayt

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

Tamamen farklı bir yöntemle 5 byte'lık doğrama işlemine teşekkürler !

Bu sadece 0 dropdizisinin ilk elemanıdır, diziyi whiletersine çevirir, tekrarlar ve sonunda diziyi uygun sıraya döndürmek için tersine çevirir.


Ahh. Şimdi bile .drop_while(): (2 işlevleri kullanılıyorsa) tabanlı bir çözümdür kısa olacağınıf=->a{a.drop_while{|i|i<1}.reverse};->a{f[f[a]]}
manatwork

Hamuru. 2 fonksiyonlar, sadece bazı gerek yok evalçirkinlik: ->a{eval ?a+'.drop_while{|i|i<1}.reverse'*2}.
Manatwork

@manatwork <1Yine de neden düşünemediğimden emin değilim . Teşekkürler!
Doorknob

2

Vim 16 Tuş vuruşları

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

Girdi arasındaki kullanıcı tarafından yazılan edilecek ive escve bir tuş olarak sayılmaz. Bu, en az bir lider ve bir de sıfır sıfır olacağını varsayar. Bu geçerli bir varsayım değilse, bu biraz daha uzun versiyonunu kullanabiliriz: (18 Keystrokes)

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

1
Kullanıcının sayıları ( ive <esc>) girmesine izin vermek için kod eklemeniz gerektiğini sanmıyorum . Vim golf oyununda golfçü, halihazırda bir dosyadaki girdiyle, tamponu ve imleci sol üst köşede bulunan girdi ile başlar, ancak kullanıcının kaydetmesi ve çıkması gerekir ( ZZgenellikle en hızlı yoldur). O zaman d[1-9]<enter>$NlDZZ(13 tuşa basma) gibi bir şey yapabilirsiniz . Not N/ nyerine/<up><enter>
daniero

2

ES6, 51 bayt

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

tson sıfır olmayan değerden sonra endekse ayarlanır, ancak fşimdiye kadar yalnızca sıfır göründüğü sürece artırılır.


2

Perl 6 , 23 bayt

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

Kullanımı:

# 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 bayt

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

aDizi nerede ?


4
I think you need to make an anonymous function to take input: a=>a.join(a="")....
andlrc

2
This only handles integers properly when they're a single digit
aross

@dev-null Done.
user2428118

Still returning wrong for multi-digit integers. [14] will return [1, 4].
Mwr247

Actually, I was (and am) still awaiting a reply to this comment. Anyway, I unfortunately don't see a way to do handle multi-digit integers using the same technique I've used for my answer and I don't think I'll be able to beat this answer anyway. I may try when I have the time, though.
user2428118


2

JavaScript (ES6), 34 bytes

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

Input and output are in the form of a space-delimited list, such as "0 4 1 2 0 1 2 4 0".


2

Javascript (ES6) 40 bytes

a=>/^(0,)*(.*?)(,0)*$/.exec(a.join())[2]

2

PHP, 56 54 52 bytes

Uses Windows-1252 encoding

String based solution

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

Run like this:

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

If your terminal is set to UTF-8, this is the same:

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

Tweaks

  • Saved 2 bytes by negating strings and dropping string delimiters
  • Saved 2 bytes by using short print tag

1
Can you please provide an ASCII solution. Nobody can read this!
Titus

1
@Titus Sure. However, plenty of unreadable esolangs out there.... it's not like my answer doesn't feel right at home.
aross

An array as first parameter of join?
Jörg Hülsermann

1
@JörgHülsermann Yup. It's documented the other way around but it accepts both.
aross

You are right I have not realize it
Jörg Hülsermann


1

PowerShell, 49 bytes

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

Takes input $args[0] and -joins them together with commas to form a string. We then use the .Trim() function called twice to remove first the trailing and then the leading zeros and commas. We then -split the string on commas back into an array.


Alternate version, without using conversion
PowerShell, 81 bytes

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

Since PowerShell doesn't have a function to trim arrays, we define a new function f that will do half of this for us. The function takes $a as input, then loops through each item with a foreach loop |%{...}. Each iteration, we check a conditional for $_ -or $b. Since non-zero integers are truthy, but $null is falsey (and $b, being not previously defined, starts as $null), this will only evaluate to $true once we hit our first non-zero element in the array. We then set $b=1 and add the current value $_ onto the pipeline. That will then continue through to the end of the input array, with zeros in the middle and the end getting added onto the output, since we've set $b truthy.

We encapsulate and store the results of the loop all back into $a. Then, we index $a in reverse order (i.e., reversing the array), which is left on the pipeline and thus is the function's return value.

We call the function twice on the $args[0] input to the program in order to "trim" from the front, then the front again (which is the back, since we reversed). The order is preserved since we're reversing twice.

This version plays a little loose with the rules for an input array of all zeros, but since ignoring STDERR is accepted practice, the program will spit out two (verbose) Cannot index into a null array errors to (PowerShell's equivalent of) STDERR and then output nothing.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.