Sıfırları ve komşularını sakla


26

Alındığı bu soruya yığın taşması de. Ayrıca bazı köşe kasalarına yönelik test girdileri önerdiği için @miles ve @Dada'ya teşekkür ederiz.

Meydan okuma

Bir tamsayı değerleri dizisi verildiğinde, sıfır olmayan bir değerle çevrili olmayan tüm sıfırları kaldırın.

Eşdeğer olarak, bir giriş sıfır değilse veya sıfır olmayan bir değere hemen yakın bir sıfırsa tutulmalıdır.

Tutulan girişler, girişte sahip oldukları sıraya göre çıkmalıdır.

Örnek

verilmiş

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

kaldırılması gereken değerler şununla işaretlenmiştir x:

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

ve böylece çıktı olmalıdır

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

kurallar

Giriş dizisi boş olabilir (ve ardından çıkış da boş olmalıdır).

Giriş ve çıkış biçimleri her zamanki gibi esnektir: dizi, liste, dize veya makul olan herhangi bir şey.

Kod golf, en azı en iyisi.

Test durumları

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

_2Bunun yerine kullanabilir miyim -2? Oldukça az sayıda dil bu formatı kullanıyor.
Sızdıran Rahibe

Alacak mıyız -0?
Sızdıran Rahibe

@LeakyNun 1 Evet 2 Hayır
Luis Mendo

Rakamların hiç başında sıfır olmaz mı? Gibi [010 0 0 01 1]mi?
FryAmTheEggman

@FryAmTheEggman Hayır
Luis Mendo

Yanıtlar:


16

JavaScript (ES6), 35 bayt

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

İki fazla bayt için de kayan noktalarda çalışır.


10

Python, 50 bayt

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

Bir tuple alan bir özyinelemeli işlev. İlk iki öğenin arasında sıfır olmayan bir değer veya en son saklanan önceki değer arasında ilk öğeyi içerir. Daha sonra, ilk elemanı kaldırır ve özyinelemeler. Önceki öğe, potomatik olarak listelemek üzere paketlenen ve boş olarak başlayan tekton listesinde saklanır (bununla birlikte 3 baytlık Dennis sayesinde).


55 bayt:

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

Listenin tüm uzunluğu-3'lerini oluşturur, önce başlangıç ​​ve bitişe sıfırlar ve sıfır olmayanların elemanlarını alır.

İteratif bir yaklaşım daha uzun sürdü (58 bayt)

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

Bu tam olarak işe yaramıyor çünkü b,*lPython 3 gerekiyor, ancak Python 3 inputbir dize veriyor. İlklendirme de çirkindir. Belki benzer bir özyinelemeli yaklaşım işe yarar.

Ne yazık ki, endeksleme yöntemi

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

çalışmıyor çünkü listenin sonu olarak l[-1:2]yorumlanıyor -1, başlamadan önce bir nokta değil.


10

Haskell, 55 48 bayt

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

Kullanım örneği: h [0,0,0,8,0,1,0,0]-> [0,8,0,1,0].

scanrGiriş listesini başlangıçta ve sonunda xilave 0olarak yeniden oluşturur . Her adımda desen 3 eleman ile eşleşir ve en az bir sıfır olmayan eleman varsa ortada kalır.

Teşekkür geçiş yaparak 7 bayt için @xnor zip3için scanr.


Sadece yapmak güzel olurdu h x=[snd t|t<-zip3(0:x)x$tail x++[0],(0,0,0)/=t], ama sanırım 3 parçanın ikinci elemanını elde etmenin kısa bir yolu yok.
xnor

Kısa çıkıyor bir takım üçe almak için scanbir daha zip3: h x=[b|a:b:c:_<-scanr(:)[0]$0:x,any(/=0)[a,b,c]].
xnor

8

Matlab, 29 27 bayt

Giriş bir 1*nmatristen oluşmalıdır ( n=0mümkün olduğunda). ( 0*0Matrisler için bir hata verecektir .)

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

Evrişim başarının anahtarıdır.


's'yerine 'same'<- :-D
Luis Mendo

Bu hile, defalarca yerleşiktir =)
Ağustos'ta kusurludur

Bu numarayı, golf oynamayan sorular için bile, bayrakla 'UniformOutpout'(anlaşılır şekilde) gördüm . Ama bunun hakkında hiçbir şey bilmiyordum
Luis Mendo

1
Eğer kullanabilir misiniz ~~ayerine a.*a?
feersum

2
@feersum Matlab maalesef logicaldizileri sarsmayı reddediyor . Bu, genellikle Matlab'da yazılı olmayan yerleşikler için bir sorundur . Aksi taktirde mantıksal diziler çok sayılara benzer davranırlar. Octave düşüncesinde işe yarayabilir, ancak şu anda yüklü değil.
kusur

6

J, 17 14 bayt

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

@ Zgarb yardımı ile 3 bayt kaydedildi .

kullanım

   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

açıklama

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

Burada dene.


0<Yerine işe yarar mıydı 0~:?
Zgarb

@Zgarb 3 boyutundaki ekler işlendikten sonra pozitif veya negatif olabilir.
mil,

Ah, negatif değerleri unuttum.
Zgarb

6

MATL , 8 bayt

tg3:Z+g)

Çıktı, boşluklarla ayrılmış sayıları olan bir dizedir. Çıktıdaki boş bir dizi hiçbir şey olarak gösterilmez (yeni satır bile değil).

Çevrimiçi deneyin! Veya tüm test durumlarını doğrulayın .

açıklama

Kod girişi mantıksal türe dönüştürür, yani sıfır olmayan girişler true(veya 1) ve sıfır girişler false(veya 0) olur. Bu daha sonra çekirdeğe bürünür [1 2 3]. Sıfır olmayan bir değer, o konumda ve komşu konumda sıfır olmayan bir sonuç verir. Mantıksal dönüştürme, truetutulması gereken değerleri verir , böylece girdiyi istenen çıktıyı indeksleyerek indeksler.

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

Jolf, 14 bayt

Şimdi düşünüyorum da, Jolf golf dillerinin Java'sı. iç görüyor Burada deneyin.

ψxd||H.nwS.nhS

açıklama

ψxd||H.nwS.nhS
ψxd             filter input over this function
   ||           or with three args
     H           the element
      .nwS       the previous element
          .nhS   or the next element

5

Python 3, 55 bayt

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

1
Vay. Bundan önce @xnor cevabı görüp görmediğinizi bilmiyorum, ancak tek farkın lambda ismi olmasıyla aynı kodunuz var. Eğer onun kodunu kullandıysan, ona kredi ver, eğer değilse, ne çılgın bir tesadüf!
Theo

Kimsenin koduna bakmadı.
RootTwo,

3
@ T.Lukin Aslında aynı kodun gelmesi nadir değildir. Bu kod tarihine kadar gizlenir Anarşi Golf, üzerinde gerçekleşmesi görebilirsiniz ve birden fazla kişi aynı gibi çözüm üzerinde yakınsama bu bir .
Xnor

4

Jöle , 9 bayt

0,0jo3\Tị

Çevrimiçi deneyin! veya tüm test durumlarını doğrulayın .

Nasıl çalışır

0,0jo3\Tị  Main link. Argument: A (array)

0,0        Yield [0, 0].
   j       Join, separating with A. This prepends and appends a 0 to A.
    o3\    Reduce each group of three adjacent integers by logical OR.
       T   Truth; get the indices of all truthy results.
        ị  At-index; retrieve the elements of A at those indices.

4

Perl, 34 + 1 ( -pbayrak) = 35 bayt

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

Çalıştırmak için -p bayrağı gerekir. Balina olarak sayılar listesini alır. Örneğin :

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

Ben olsun 5ben girişi eğer 50 0.
feersum 09:16 '

@feersum düzeltildi, teşekkürler
Dada

4

Haskell, 48 bayt

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

Önceki elemana bakar p, ilk elemana hve sonra gelen elemana (eğer varsa) ve eğer sıfır ise, ilk elemana hazırlık yapar h.

Durum any(/=0)$p:h:take 1tuzun, özellikle de take 1t. Belki de desen eşleştirerek kısaltmanın bir yolunu arayacağım.



3

Mathematica, 43 bayt

ArrayFilter[If[#.#>0,#[[2]],Nothing]&,#,1]&

3

C, 96 bayt

f()Tamsayı listesine bir işaretçi ve listenin boyutuna bir işaretçi ile arayın . Liste ve boyut yerinde değiştirilir.

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 üzerinde deneyin .


K&R parametre stili genellikle daha kısa, ancak burada değil - f(int*p,int*n)bir bayt kazandırır. Veya s3. bir parametre olarak tanımlayın (bu geçilmedi. 'Tamamdır').
ugoren

3

Brachylog , 44 38 bayt

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

Çevrimiçi deneyin!

Bu dil, kullanacağımız şeyleri kanıtlamak kadar iyidir.

Tahmini 0 (ana tahmini)

,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

Tahmini 1 (yardımcı yüklem)

~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

Görüntü İşleme Araç Kutulu Matlab, 27 bayt

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

Bu anonim bir işlevdir.

Örnek kullanım:

>> @(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
Ben de düşündüm imerode, ama sürümlerim şu anki sürümden daha uzun sürdü, iyi iş =)
kusur

2

Bash + GNU yardımcı programları, 25

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

Girdiyi yeni satır ayrılmış bir liste olarak kabul eder.

İdeone - Tüm test pencerelerini boşlukla ayrılmış ve yeni satırla ayrılmış olarak dönüştürerek birlikte test etmek için test sürücüsü kodu eklendi.


2

Çedar , 78 bayt

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

Test odası.

Cheddar'da filtre yoktur, bu nedenle filtreleme, istediğimiz öğeleri sarmak ve istemediğimiz öğeleri boş dizilere dönüştürmek ve ardından her şeyi birleştirmek yoluyla yapılır.

Örneğin, [0,0,0,8,0,1,0,0]olur [[],[],[0],[8],[0],[1],[0],[]]ve sonra birleştirilen dizi olur [0,8,0,1,0].


.reduce((+))->.sum
Downgoat

@Downgoat Bunu ne zaman düzelttiniz?
Sızdıran Rahibe

Ah, üzgünüm boşver. Diziyi topladığını sanıyordum. dizilere
katılmıyor

1

APL, 14 bayt

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

Ölçek:

      {⍵/⍨×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

Açıklama:

  • 0,⍵,0: ⍵ başına ve sonuna sıfır ekleyin.
  • ×3∨/: Üç komşu sayıdaki her grubun GCD'sinin işaretini bulun (eğer hepsi sıfır ve eğer 1 ise, bu 0 olacaktır).
  • ⍵/⍨: sonucun 1 olduğu tüm maddeleri all arasından seç.

1

Yakut 2.x, 63 bayt

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

Neden olduğu kredisi, bu aslında Neil'in üstün ES6 cevabının limanı.

Aynı zamanda benim ilk pcg gönderim. yuppi.


1

Brain-Flak 142 bayt

Çevrimiçi deneyin!

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

açıklama

(<()>)                    #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

Bağlantı boş. Kodları ve girişleri yapıştırabilir, "kaydet" e basabilir ve çıkan bağlantıyı kullanabilirsiniz
Luis Mendo

@LuisMendo Ne yazık ki tryitonline kullanamıyorum bu yüzden sadece url ile bağlantı kurdum.
Buğday Sihirbazı,

Neden tryitonline erişemiyorsun?
DJMcMayhem

@DJMcMayhem Tarayıcımda javascript yoktu. <s> Şimdi düzelteceğim. </s> Gördüğüm kadarıyla zaten teşekkür ederim.
Buğday Sihirbazı,
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.