Einführung
Eine Warteschlange ist ein abstrakter Datentyp, bei dem Elemente an der Vorderseite (Warteschlange) hinzugefügt und an der Rückseite (Warteschlange) entfernt werden. Dies wird auch als FIFO-Prinzip (First In First Out) bezeichnet.
Es wird am besten anhand eines Beispiels gezeigt:
Herausforderung
Bei einem nicht leeren Array, das positive Ganzzahlen und Elemente enthält, die eine Warteschlange anzeigen (Entfernen eines Elements), geben Sie die endgültige Liste der Warteschlange aus.
Nehmen wir an, dass X
dies in diesem Beispiel eine Warteschlange bedeutet. Werfen wir einen Blick auf die folgende Liste:
[45, X, X, 37, 20, X, 97, X, 85]
Dies kann in den folgenden Warteschlangen-Pseudocode übersetzt werden:
Queue
Enqueue 45 -> 45
Dequeue ->
Dequeue -> (dequeue on an empty queue is a no-op)
Enqueue 37 -> 37
Enqueue 20 -> 20 37
Dequeue -> 20
Enqueue 97 -> 97 20
Dequeue -> 97
Enqueue 85 -> 85 97
Sie können sehen, dass am Ende das Ergebnis ist [85, 97]
, welches die Ausgabe für diese Sequenz ist.
Testfälle
Beachten Sie, dass Sie ein beliebiges anderes Symbol oder Zeichen auswählen können X
, sofern es sich nicht um eine positive Ganzzahl handelt.
[1, X, 2, X, 3, X] -> []
[1, 2, X] -> [2]
[1, 2, 3] -> [3, 2, 1]
[1, 2, X, X, X, 3] -> [3]
[1, 2, X, 3, X, 4] -> [4, 3]
Das ist Code-Golf , also gewinnt die Einsendung mit der geringsten Anzahl von Bytes!
Antworten:
Gelee , 8 Bytes
Verwendet einen beliebigen falschen Wert ( 0 oder leer, iterabel) zum Löschen.
Probieren Sie es online!
Wie es funktioniert
quelle
Python 2,
565350 BytesProbieren Sie es online!
Dequeue ist
-1
. Dieser Trick ermöglicht ein einfaches pythonisches Durchtrennen der Warteschlange.quelle
Mathematica, 102 Bytes
Auf jeden Fall nicht die kürzeste Lösung, aber ich konnte nicht widerstehen, weil es irgendwie pervers ist.
Nach einigen Hilfsfunktionen definiert dies eine reine Funktion, die eine Zeichenfolge als Eingabe verwendet: In der Zeichenfolge werden Zahlen durch Kommas getrennt (Leerzeichen sind optional). der Dequeue-Charakter ist
"]"
; und die Liste hat keine Begrenzer vorne oder hinten. Beispielsweise würde das erste Beispiel im OP als Zeichenfolge eingegeben"45,],],37,20,],97,],85"
. Die Ausgabe der Funktion ist eine Liste von Zahlen.Die Funktion zählt, wie viele Warteschlangen
"]"
sich in der Eingabezeichenfolge befinden, fügt so viele Kopien"f["
an die Vorderseite der Zeichenfolge an und umgibt dann das Ganze mit"r[...]"
. Im obigen Beispiel ergibt dies"r[f[f[f[f[45,],],37,20,],97,],85]"
: Beachten Sie, dass die Klammern ausgeglichen sind.Dann
ToExpression
interpretiert die resultierende Zeichenfolge als ein Stück Mathematica - Code und führt ihn aus . Die Funktionf
ist so definiert, dass alle Argumente mit Ausnahme des ersten Argumentes beibehalten werden (und nachfolgende Kommas ignoriert werden; dies ist ohnehin erforderlich, um leere Warteschlangen aus der Warteschlange zu entfernen).r
Die resultierende Zahlenfolge wird in eine Liste mit Zahlen in der richtigen Reihenfolge umgewandelt.quelle
b___,
dort stehen? Es funktioniert , aber das Komma wird dadurch rot. (auch, was ist der Unterschied zwischen den Zeilen 2 und 3?)f[a_,b___]:=b
(ohne Komma), während Zeile 3 entsprichtf[a_,b___,Null]:=b
. In beiden Fällenb___
bezieht sich auf eine beliebige Anzahl von Argumenten (einschließlich überhaupt keiner). Zeile 3 ist spezifischer und wird daher bei Bedarf immer vor Zeile 2 verwendet. Die Funktionf
ignoriert also ihr erstes Argument und auch ihr letztes Argument, falls dies der Fall istNull
. Dies war erforderlich, um eine leere Warteschlange zu entleeren. Beachten Sie, dass eine typische Eingabe einen Ausdruck wie ergibtr[f[f[f[5,3,],2,],],11]
, bei dem jedes Komma zuvor]
erneut a bezeichnetNull
.Netzhaut , 30 Bytes
Probieren Sie es online!
Entfernt wiederholt die erste Zahl, auf die (nicht unbedingt sofort) ein
X
zusammen mitX
oder einX
am Anfang der Zeichenfolge folgt . Dann kehrt man die restlichen Zahlen um.quelle
JavaScript,
7063535043 BytesVielen Dank an @Neil, dass er 10 Bytes mit x.map anstelle von Loop und ternärem Ausdruck abgelegt hat
Vielen Dank an @Arnauld für das Golfen mit 3 Bytes
Vielen Dank an @ETHproductions für das Abschlagen von 7 Bytes
Probieren Sie es online!
"Dequeue" kann ein beliebiger nicht numerischer Wert sein, der nicht "true" ist.
quelle
if
Anweisung einen ternärenmap
Ausdruck verwenden, und noch kürzer, wenn Sie anstelle einer Schleife einen Ausdruck verwenden, und noch kürzer, wenn Sie anstelle eines Blocks einen Ausdruck verwenden. Siehe die Tipps .x=>(t=[],x.map(a=>a>0?t.unshift(a):t.pop()),t)
einige Bytes auf derreturn
x=>x.map(a=>a>0?t.unshift(a):t.pop(),t=[])&&t
ist noch kürzer.a?
reicht es einfach , denke ich?)Mathematica,
4645 BytesDank an ngenisis für das Speichern von 1 Byte.
Grundsätzlich das Gleiche wie meine Retina-Antwort unter Verwendung von Pattern Matching. Wir gleichen den ersten wiederholt ab
X
und entfernen ihn zusammen mit der ersten Nummer (falls vorhanden). Nachdem wir fertig sind, kehren wir die Liste um.quelle
Pure Bash, 72
Eingabe als Befehlszeilenparameter.
Probieren Sie es online aus .
quelle
Haskell, 41 Bytes
quelle
x&(y:z)
MATL ,
13 -12 BytesDie Eingabe ist ein Array von Zahlen mit der
0
Bezeichnung "dequeue".Die Ausgabe erfolgt durch Leerzeichen getrennte Zahlen. Ein leeres Ergebnis wird als nichts angezeigt.
Probieren Sie es online! Oder überprüfen Sie alle Testfälle .
Erläuterung
quelle
Haskell,
41-40BytesFunktion ist
foldl(#)[]
(auch in bytecount mit einem Byte Trennung dazwischen enthalten)Probieren Sie es online!
X ist eine beliebige nicht positive ganze Zahl
EDIT: -1 Byte dank nimi
quelle
|l>[]=init l|1>0=l
Julia,
78767357 BytesVielen Dank an Harrison Grodin für einige exzellente Julia Golf Vorschläge. Ersetzt, wenn / else mit ternär und für / end mit Listenverständnis für eine Einsparung von 16 Bytes.
Einige unnötige Leerzeichen wurden entfernt, um 3 Byte zu sparen.
Bevor negative Zahlen oder Nullen erlaubt waren:
Ungolfed:
Ich bin ziemlich neu für Julia; Es könnte einen besseren Weg geben. Verwendet
:X
für X, was in Julia ein Symbol ist. Aktualisiert: Jetzt, da 0 zulässig ist, wird 0 (oder eine beliebige negative Zahl) für X verwendet, wobei zwei Zeichen gespeichert werden. Erneut aktualisiert, um einige Leerzeichen zu entfernen, von denen ich nicht wusste, dass sie nicht benötigt wurden.quelle
05AB1E ,
1211 BytesDank Riley ein Byte gespeichert
Probieren Sie es online!
Erläuterung
Warteschlangen werden durch einen Buchstaben gekennzeichnet .
quelle
GNU Sed, 43
Die Punktzahl enthält +2 für die Verwendung der
-r
und-n
-Flaggen.Probieren Sie es online aus .
Erläuterung
quelle
PHP, 85 Bytes
-8 Bytes
$v
anstelle vonis_int($v)
false, wenn jeder Dequeue-Wert zu false gehörtquelle
Python 3 ,
95 bis94 BytesProbieren Sie es online!
Auch 94 Bytes:
quelle
Perl 5 , 28 + 1 = 29 Bytes
28 Byte Code +
-p
Flag.Probieren Sie es online!
Es wird eine Zeichenfolge (
$\
) als Warteschlange verwendet: Wenn die Eingabe eine Ganzzahl enthält (/\d/?
wir hängen sie am Anfang von$\
($\=$_.$\
) an und entfernen ansonsten die letzte mits/.*\n$//
. Am Ende$\
wird sie implizit gedruckt, dank-p
flag (und unübertroffene}{
).Andere Ansätze:
33 Bytes , wobei ein Array als Warteschlange verwendet wird (dies ist meiner Meinung nach die natürlichste Methode in Perl, aber nicht die kürzeste):
Probieren Sie es online!
52 Bytes mit Regex und
reverse
(es ist genau dasselbe wie Martin Enders Retina-Antwort - danke, dass ich 2 Bytes darauf gespeichert habe). Das Umkehren der Liste erfordert jedoch viele Zeichen, da ich zum Beibehalten der Ganzzahlen die Zeichenfolge in ein Array konvertieren muss, um sie umzukehren, und dann wieder in eine Zeichenfolge, um sie zu drucken. (say for
statt$_=join$",
2 Bytes speichern können, aber es erfordert-E
oder-M5.010
und es ist nicht so interessant).Probieren Sie es online!
quelle
Python 3, 107 Bytes
Dequeuer kann ein beliebiger nicht numerischer Wert sein.
Probieren Sie es online aus
quelle
Batch, 160 Bytes
Das war schwieriger als es sein musste.
Dies bedeutet, dass ich a) einen Marker für das Ende der Warteschlange haben muss, der nicht entfernt wird, und b) die Warteschlange von hinten nach vorne manipulieren muss, damit neue Elemente direkt vor dem Marker für das Ende eingefügt werden, so dass alte Gegenstände von vorne entfernt werden können, was dann bedeutet, dass ich c) die Warteschlange umkehren muss, bevor ich sie drucke.
quelle
PHP, 70 Bytes
quelle
C #, 115 Bytes +33 Bytes für die Verwendung
Anonyme Methode, die eine Liste von Ganzzahlen zurückgibt, nachdem die Ein- und Ausreihvorgänge ausgeführt wurden. Negative Ganzzahlen werden zum Entfernen von Elementen aus der Warteschlange verwendet.
Volles Programm mit ungolfed Methode und Testfällen:
quelle
Scala, 97 Bytes
Nimmt als Eingabe
f
eine Liste mit0
als "dequeue" -Element. Es verwendet die Schwanzrekursion mit einem zweiten Parameter (b
), der als Akkumulator fungiert. Anfangsb
ist das leerSeq
(Nil
).Erklärungen:
Hinweis:
b dropRight 1
wird anstelle vonb.tail
zu vermeiden Ausnahme:tail of empty list
.Testfälle:
f
kann auch mit anderen Typen arbeiten (String
,char
, ..., auch heterogene Liste dieser Arten!):quelle
REXX, 115 Bytes
Nimmt eine durch Leerzeichen getrennte Zeichenfolge und druckt eine durch Leerzeichen getrennte Zeichenfolge
quelle
C ++,
122119 Bytes0 steht für eine Warteschlange.
Probieren Sie es online!
quelle
Schnelle 3, 70 Bytes
Angenommen, wir haben eine Reihe von Ints wie
let x = [1, 2,-1,3,-1,4]
Beachten Sie, dass dies
[].prefix(0)
eine einfache Möglichkeit ist, ein leeres ArraySlice zu erhaltenquelle