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]
quelle
_2
statt verwenden-2
? Nicht wenige Sprachen verwenden dieses Format.-0
?[010 0 0 01 1]
?Antworten:
JavaScript (ES6), 35 Byte
Funktioniert auch mit Floats für zwei zusätzliche Bytes.
quelle
Python, 50 Bytes
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:
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)
Dies funktioniert nicht genau, da
b,*l
Python 3 benötigt wird, Python 3 jedochinput
einen String. Die Initialisierung ist auch hässlich. Vielleicht würde ein ähnlicher rekursiver Ansatz funktionieren.Leider ist die Indizierungsmethode von
funktioniert nicht, weil
l[-1:2]
es-1
als Ende der Liste interpretiert wird und nicht als Punkt vor dem Start.quelle
Haskell,
5548 BytesAnwendungsbeispiel:
h [0,0,0,8,0,1,0,0]
->[0,8,0,1,0]
.scanr
Erstellt die Eingabelistex
mit einem zusätzlichen0
am 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
zip3
aufscanr
.quelle
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.scan
als einzip3
:h x=[b|a:b:c:_<-scanr(:)[0]$0:x,any(/=0)[a,b,c]]
.Matlab,
2927 BytesDie Eingabe muss aus einer
1*n
Matrix bestehen (won=0
möglich). (Es wird ein Fehler für0*0
Matrizen ausgelöst.)quelle
's'
statt'same'
<- :-D'UniformOutpout'
(verständlicherweise). Aber ich wusste nichts davon~~a
anstelle von verwendena.*a
?logical
Arrays 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.J,
17-14Bytes3 Bytes mit Hilfe von @ gespeichert Zgarb gespeichert.
Verwendung
Erläuterung
Probieren Sie es hier aus.
quelle
0<
anstelle von arbeiten0~:
?MATL , 8 Bytes
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
(oder1
) und Einträge null werden zufalse
(oder0
). 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 logischetrue
Werte ergibt Werte, die beibehalten werden sollten. Indizieren Sie die Eingabe mit diesen Werten, um die gewünschte Ausgabe zu erzielen.quelle
Jolf, 14 Bytes
Jetzt, wo ich darüber nachdenke, ist Jolf Java der Golfsprachen. seufzt Probieren Sie es hier.
Erläuterung
quelle
Python 3, 55 Bytes
quelle
Gelee , 9 Bytes
Probieren Sie es online! oder überprüfen Sie alle Testfälle .
Wie es funktioniert
quelle
Perl, 34 + 1 (
-p
Flag) = 35 BytesBenötigt -p zum Ausführen. Nimmt eine Liste mit Zahlen als Eingabe. Zum Beispiel :
quelle
5
wenn ich eingebe50 0
.Haskell, 48 Bytes
Betrachtet das vorherige Element
p
, das erste Elementh
und das Element danach (falls vorhanden) und stellt dem ersten Element ein Element voran, das nicht Null isth
.Die Bedingung
any(/=0)$p:h:take 1t
ist langwierig, insbesondere dietake 1t
. Ich werde nach einer Möglichkeit suchen, es zu verkürzen, vielleicht durch Mustervergleich.quelle
Retina ,
423533 Bytes7 Bytes dank Martin Ender.
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.
quelle
Mathematica, 43 Bytes
quelle
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.Probiere es auf ideone aus .
quelle
f(int*p,int*n)
spart ein Byte. Oders
als 3. Parameter definieren (das wird nicht übergeben. Es ist irgendwie OK).Brachylog ,
4438 BytesProbieren Sie es online!
Diese Sprache ist gut, um Dinge zu beweisen, was wir verwenden werden.
Prädikat 0 (Hauptprädikat)
Prädikat 1 (Hilfsprädikat)
quelle
Matlab mit Bildverarbeitungs-Toolbox, 27 Byte
Dies ist eine anonyme Funktion.
Beispiel Verwendung:
quelle
imerode
, aber meine Versionen waren immer länger als meine aktuelle, nette Arbeit =)Bash + GNU-Utils, 25
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.
quelle
Cheddar , 78 Bytes
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]
.quelle
.reduce((+))
->.sum
APL, 14 Bytes
Prüfung:
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.quelle
Ruby 2.x, 63 Bytes
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.
quelle
Brain-Flak 142 Bytes
Probieren Sie es online!
Erläuterung
quelle