Halten Sie Nonzeros und ihre Nachbarn


26

Entnommen aus dieser Frage bei Stack Overflow. Vielen Dank auch an @miles und @Dada, die Testeingaben vorgeschlagen haben, die einige Eckfälle ansprechen.

Die Herausforderung

Entfernen Sie bei einem Array von Ganzzahlwerten alle Nullen, die nicht von einem Wert ungleich Null flankiert sind.

Entsprechend sollte ein Eintrag beibehalten werden, wenn er nicht Null ist oder wenn er eine Null ist, die einem Wert ungleich Null unmittelbar nahe kommt.

Die Einträge, die beibehalten werden, sollten in der Ausgabe die Reihenfolge beibehalten, die sie in der Eingabe hatten.

Beispiel

Gegeben

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

Die Werte, die entfernt werden sollen, sind mit einem gekennzeichnet x:

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

und so sollte die Ausgabe sein

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

Regeln

Das Eingabearray kann leer sein (und dann sollte auch die Ausgabe leer sein).

Eingabe- und Ausgabeformate sind wie gewohnt flexibel: Array, Liste, Zeichenfolge oder alles, was sinnvoll ist.

Code Golf, am wenigsten am besten.

Testfälle

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

Kann ich _2statt verwenden -2? Nicht wenige Sprachen verwenden dieses Format.
Undichte Nonne

Werden wir -0?
Undichte Nonne

@LeakyNun 1 Ja 2 Nein
Luis Mendo

Werden Zahlen jemals führende Nullen haben? Wie [010 0 0 01 1]?
FryAmTheEggman

@FryAmTheEggman Nope
Luis Mendo

Antworten:


16

JavaScript (ES6), 35 Byte

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

Funktioniert auch mit Floats für zwei zusätzliche Bytes.


10

Python, 50 Bytes

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

Eine rekursive Funktion, die ein Tupel benötigt. Schließt das erste Element ein, wenn zwischen den ersten beiden Elementen ein Wert ungleich Null vorhanden ist, oder den vorherigen Wert, der vom letzten Mal gespeichert wurde. Entfernt dann das erste Element und rekursiert. Das vorherige Element wird in der Singleton-Liste gespeichert p, die automatisch in die Liste packt und als leer beginnt (danke an Dennis für 3 Bytes damit).


55 Bytes:

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

Erzeugt alle Länge-3-Abschnitte der Liste, setzt zuerst Nullen an den Anfang und das Ende und übernimmt die mittleren Elemente derjenigen, die nicht alle Nullen sind.

Ein iterativer Ansatz stellte sich als länger heraus (58 Bytes)

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

Dies funktioniert nicht genau, da b,*lPython 3 benötigt wird, Python 3 jedoch inputeinen String. Die Initialisierung ist auch hässlich. Vielleicht würde ein ähnlicher rekursiver Ansatz funktionieren.

Leider ist die Indizierungsmethode von

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

funktioniert nicht, weil l[-1:2]es -1als Ende der Liste interpretiert wird und nicht als Punkt vor dem Start.


10

Haskell, 55 48 Bytes

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

Anwendungsbeispiel: h [0,0,0,8,0,1,0,0]-> [0,8,0,1,0].

scanrErstellt die Eingabeliste xmit einem zusätzlichen 0am Anfang und Ende neu. In jedem Schritt werden 3 Elemente gemustert und das mittlere beibehalten, wenn mindestens ein Element ungleich Null vorhanden ist.

Vielen Dank an @xnor für 7 Bytes beim Umschalten von zip3auf scanr.


Es wäre schön, dies einfach zu tun h x=[snd t|t<-zip3(0:x)x$tail x++[0],(0,0,0)/=t], aber ich denke, es gibt keinen kurzen Weg, um das zweite Element eines 3-Tupels zu erhalten.
9.

Stellt sich heraus , kürzer , um die Tripel aus einem bekommen scanals ein zip3: h x=[b|a:b:c:_<-scanr(:)[0]$0:x,any(/=0)[a,b,c]].
Xnor

8

Matlab, 29 27 Bytes

Die Eingabe muss aus einer 1*nMatrix bestehen (wo n=0möglich). (Es wird ein Fehler für 0*0Matrizen ausgelöst.)

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

Faltung ist der Schlüssel zum Erfolg.


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

Dieser Trick funktioniert oft mit Builtins =)
Fehler

Ich habe diesen Trick auch bei Fragen ohne Golfspiel mit der Flagge gesehen 'UniformOutpout'(verständlicherweise). Aber ich wusste nichts davon
Luis Mendo

1
Könnten Sie ~~aanstelle von verwenden a.*a?
Feersum

2
@feersum Matlab lehnt es leider ab, logicalArrays zusammenzufassen. Dies ist häufig ein Problem für integrierte Funktionen, die nicht in Matlab selbst geschrieben sind. Ansonsten verhalten sich logische Arrays ähnlich wie numerische. Es könnte in Octave-Gedanken funktionieren, aber ich habe es im Moment nicht installiert.
Fehler

6

J, 17-14 Bytes

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

3 Bytes mit Hilfe von @ gespeichert Zgarb gespeichert.

Verwendung

   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

Erläuterung

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

Probieren Sie es hier aus.


Würde 0<anstelle von arbeiten 0~:?
Zgarb

@Zgarb Die Infixe der Größe 3 können nach der Verarbeitung entweder positiv oder negativ sein.
Meilen

Ah, ich habe die negativen Werte vergessen.
Zgarb

6

MATL , 8 Bytes

tg3:Z+g)

Die Ausgabe ist eine Zeichenfolge mit durch Leerzeichen getrennten Zahlen. Ein leeres Array am Ausgang wird als nichts angezeigt (nicht einmal eine neue Zeile).

Probieren Sie es online! Oder überprüfen Sie alle Testfälle .

Erläuterung

Der Code wandelt die Eingabe in einen logischen Typ um, dh Einträge ungleich Null werden zu true(oder 1) und Einträge null werden zu false(oder 0). Dies wird dann mit dem Kernel zusammengeführt [1 2 3]. Ein Wert ungleich Null führt zu einem Ergebnis ungleich Null an dieser Position und an den benachbarten Positionen. Die Konvertierung in logische trueWerte ergibt Werte, die beibehalten werden sollten. Indizieren Sie die Eingabe mit diesen Werten, um die gewünschte Ausgabe zu erzielen.

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 Bytes

Jetzt, wo ich darüber nachdenke, ist Jolf Java der Golfsprachen. seufzt Probieren Sie es hier.

ψxd||H.nwS.nhS

Erläuterung

ψ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 Bytes

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

1
Wow. Ich weiß nicht, ob Sie zuvor eine Antwort von @xnor gesehen haben, aber Sie haben genau den gleichen Code, mit dem einzigen Unterschied, dass der Name des Lambda ist. Wenn Sie seinen Code verwendet haben, geben Sie ihm Kredit, wenn nicht, was für ein verrückter Zufall!
Theo

Ich habe niemanden Code angesehen.
RootTwo

3
@ T.Lukin Es ist eigentlich nicht ungewöhnlich, sich den gleichen Code auszudenken. Sie können dies auf Anarchy Golf beobachten, wo der Code bis zum Ablauf der Frist verborgen ist und mehrere Personen sich auf dieselbe Lösung wie diese einigen .
8.

4

Gelee , 9 Bytes

0,0jo3\Tị

Probieren Sie es online! oder überprüfen Sie alle Testfälle .

Wie es funktioniert

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 ( -pFlag) = 35 Bytes

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

Benötigt -p zum Ausführen. Nimmt eine Liste mit Zahlen als Eingabe. Zum Beispiel :

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

Ich bekomme, 5wenn ich eingebe 50 0.
Feersum

@feersum behoben, danke
Dada

4

Haskell, 48 Bytes

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

Betrachtet das vorherige Element p, das erste Element hund das Element danach (falls vorhanden) und stellt dem ersten Element ein Element voran, das nicht Null ist h.

Die Bedingung any(/=0)$p:h:take 1t ist langwierig, insbesondere die take 1t. Ich werde nach einer Möglichkeit suchen, es zu verkürzen, vielleicht durch Mustervergleich.


4

Retina , 42 35 33 Bytes

7 Bytes dank Martin Ender.

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

 +

^ | $

Die letzte Zeile ist notwendig.

Überprüfen Sie alle Testfälle auf einmal.(Leicht modifiziert, um alle Testfälle gleichzeitig auszuführen.)

Sieht aus wie die perfekte Sprache, um dies zu tun ... wurde immer noch von den meisten Antworten besiegt.


Ich würde einfach die Klammern aus dem I / O-Format streichen.
Martin Ender

3

Mathematica, 43 Bytes

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

3

C 96 Bytes

Rufen Sie f()mit einem Zeiger auf die Liste der Ganzzahlen und einem Zeiger auf die Größe der Liste auf. Liste und Größe werden direkt geändert.

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

Probiere es auf ideone aus .


Der K & R-Parameterstil ist oft kürzer, aber nicht hier - f(int*p,int*n)spart ein Byte. Oder sals 3. Parameter definieren (das wird nicht übergeben. Es ist irgendwie OK).
Ugoren

3

Brachylog , 44 38 Bytes

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

Probieren Sie es online!

Diese Sprache ist gut, um Dinge zu beweisen, was wir verwenden werden.

Prädikat 0 (Hauptprädikat)

,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

Prädikat 1 (Hilfsprädikat)

~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 mit Bildverarbeitungs-Toolbox, 27 Byte

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

Dies ist eine anonyme Funktion.

Beispiel Verwendung:

>> @(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
Ich habe auch darüber nachgedacht imerode, aber meine Versionen waren immer länger als meine aktuelle, nette Arbeit =)
fehlerhaft

2

Bash + GNU-Utils, 25

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

Akzeptiert Eingaben als durch Zeilenumbrüche getrennte Liste.

Ideone - mit Testtreibercode, der hinzugefügt wurde, um alle Testfälle zusammen auszuführen, indem in / aus durch Leerzeichen und Zeilenvorschub getrennt konvertiert wird.


2

Cheddar , 78 Bytes

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

Testsuite.

Cheddar hat keinen Filter, daher wird gefiltert, indem die gewünschten Elemente umgebrochen und die nicht gewünschten Elemente in leere Arrays umgewandelt und anschließend alles verkettet werden.

Zum Beispiel [0,0,0,8,0,1,0,0]wird [[],[],[0],[8],[0],[1],[0],[]], und dann wäre das verkettete Array [0,8,0,1,0].


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

@ Downgoat Wann hast du das behoben?
Undichte Nonne

Oh, tut mir leid, egal. Ich dachte du summierst das Array. nicht die Arrays
beitreten

1

APL, 14 Bytes

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

Prüfung:

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

Erläuterung:

  • 0,⍵,0: Fügen Sie am Anfang und am Ende von ⍵ eine Null hinzu
  • ×3∨/: Ermitteln Sie das Vorzeichen der GCD für jede Gruppe von drei benachbarten Zahlen (dies ist 0, wenn sie alle Null und ansonsten 1 sind).
  • ⍵/⍨: Wählen Sie alle Elemente aus ⍵ aus, für die das Ergebnis 1 war.

1

Ruby 2.x, 63 Bytes

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

Kredit, wo es fällig ist, ist dies im Wesentlichen eine Portierung von Neils überlegener ES6-Antwort.

Es ist auch meine erste Übermittlung von PCGs. Yay.


1

Brain-Flak 142 Bytes

Probieren Sie es online!

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

Erläuterung

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

Der Link ist leer. Sie können Code einfügen und eingeben, drücken Sie "Speichern" und verwenden Sie den resultierenden Link
Luis Mendo

@ LuisMendo Leider kann ich tryitonline nicht verwenden, daher habe ich nur auf die URL verlinkt.
Weizen-Assistent

Warum kannst du nicht auf tryitonline zugreifen?
DJMcMayhem

@DJMcMayhem Ich hatte kein Javascript in meinem Browser. <s> Ich werde es jetzt beheben. </ s> Ich sehe, dass Sie das bereits getan haben, danke.
Weizen-Zauberer
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.