Ich kann nicht glauben, dass wir das noch nicht haben. Es ist eine der wichtigsten Datenstrukturen in der Programmierung und dennoch einfach genug, um es in einem Code-Golf zu implementieren :
Herausforderung
Ihre Aufgabe ist es, einen Stack zu implementieren, der das Pushen und Poppen von Zahlen ermöglicht, Ihre Implementierung zu testen und die E / A einfach zu halten. Wir verwenden das folgende Setup:
- Die Eingabe ist eine Liste nicht negativer Ganzzahlen
Jede positive ganze Zahl gibt ein und jede ein - das oberste Element wird .push ( n ) 0 pop ()
- Die Ausgabe ist der resultierende Stapel
Beispiel
Zum Beispiel, wenn wir gegeben sind :
Ausgabe wird sein:
Regeln
- Die Eingabe ist eine Liste nicht negativer Ganzzahlen in jedem Standard-E / A-Format
- Sie können eine negative Ganzzahl verwenden, um das Ende eines Datenstroms von Ganzzahlen zu kennzeichnen
- Die Ausgabe ist eine Liste / Matrix / .. des resultierenden Stapels
- Wenn Sie auswählen, wo sich das oberste Element (am Anfang oder am Ende) befindet, muss die Ausgabe nur konsistent sein
- Die Ausgabe ist flexibel (z. B. ganze Zahlen, die durch Zeilenumbrüche getrennt werden, sind in Ordnung). Wichtig ist nur die Reihenfolge
- Sie können eine negative Ganzzahl verwenden, um den Boden des Stapels zu kennzeichnen
- Es ist garantiert, dass es niemals eine wenn der Stapel leer ist
Beispiele
[] -> []
[1] -> [1]
[1,0,2] -> [2]
[4,0,1,12] -> [12,1]
[8,3,1,2,3] -> [3,2,1,3,8]
[1,3,7,0,0,0] -> []
[13,0,13,10,1,0,1005,5,0,0,0] -> [13]
[12,3,0,101,11,1,0,0,14,0,28] -> [28,101,12]
Antworten:
MATL , 6 Bytes
Die Eingabe ist ein Zeilenvektor von Zahlen.
Der letzte Stapel wird verkehrt herum angezeigt, wobei das aktuellste Element unten angezeigt wird.
Probieren Sie es online! Oder überprüfen Sie alle Testfälle .
Erläuterung
quelle
Java (JDK 10) , 42 Byte
Da "[die] Ausgabe flexibel ist [...], kommt es nur auf die Reihenfolge an", wird das Eingabearray in ein abgeschlossenes
0
Array umgewandelt. Beispiel:[1,0,2]
Gibt zurück,[2,0,2]
was als = interpretiert werden soll .[2
,0,2
]
[2]
Probieren Sie es online!
Vorherige Versionen:
Java (JDK 10) , 60 Byte
Probieren Sie es online!
Credits:
Wenn ich das Programm mit Fehlern beenden kann: 55 Bytes
(obwohl alles richtig modifiziert ist)
Probieren Sie es online!
quelle
>0
da am Anfang der Liste niemals eine Null angezeigt wird (dies würde bedeuten, dass sich der Anfang des Stapels auf befand-1
).Sed, 17 Bytes
:;s/[0-9]\+,0//;t
-3 Bytes dank @ OMᗺ, -1 dank @eggyal
Da Sie garantiert nie eine leere Liste öffnen, benötigen Sie nur eine iterierte Finite-State-Maschine. Reguläre Ausdrücke sind ein Werkzeug zum Erstellen von Zustandsautomaten und
sed
können iterieren. Es ist ein Match, das im Himmel gemacht wurde.Übernimmt die Eingabe von stdin wie folgt:
echo '[12,3,0,101,11,1,0,0,14,0,28]' | sed ':;s/[0-9]\+,0,//;t'
Gibt den Stapel in umgekehrter Reihenfolge aus:
[12,101,28]
Könnte um zwei Bytes kleiner sein, wenn meine lokalen, von
sed
Natur aus verstandenen Zeichenklassen dies mögen\d
, aber aus irgendeinem Grund nicht.quelle
g
ist das redundant - Sie sparen 4 Bytes: Probieren Sie es online aus!PowerShell ,
464140 ByteProbieren Sie es online!
Nimmt Eingaben über Splatting entgegen,
$z=@(12,3,0,101,11,1,0,0,14,0,28); .\implement-stack.ps1 @z
die sich in TIO als separate Argumente manifestieren.-5 Bytes dank mazzy.
-1 Byte Swapping
$_
zu1
quelle
$agrs
? :)$args|%{$x,$a=&({$_,$_+$a},{$a})[!$_]};$a
?.\implement-stack.ps1 @z
(nicht$z
), sonst übergeben Sie nur ein Array als erstes / einziges ArgumentC (gcc) ,
62605655 Bytes-2-6 Bytes dank l4m2-1 byte dank ceilingcat .
Verwendet den zulässigen Begriff -1 terminierter Arrays.
f()
ruft sich selbst rekursiv auf, bis er vollständig gewickelt ist, und geht dann die Liste zurück.r
Verfolgt, wie viele Nummern verworfen werden müssen, bevor etwas gedruckt wird. Erhöht sich, wenn das aktuelle Element 0 ist, verringert sich ansonsten. Wenn 0, müssen wir nicht verwerfen und können die Nummer drucken.Probieren Sie es online!
quelle
f(l)int*l;
=>f(int*l)
?r=0
scheint nutzlosHaskell, 28 Bytes
Probieren Sie es online!
quelle
R , 45 Bytes
Probieren Sie es online!
quelle
F
bringt Sie auch auf 48 Bytes, aber das ist sauberer imhoR+pryr
undReduce
Lösung ist 44 BytesPython 2 ,
595751 BytesProbieren Sie es online!
quelle
Gelee , 6 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
[1,3,7,0,0,0]
ZB wird aufgeteilt[[1,3,7],[],[],[]]
, und jeder Schritt der linken Reduzierung erscheint auf dem Element des linken Arrays.Brain-Flak ,
4036 BytesProbieren Sie es online!
Danke an @Nitrodon für -4 Bytes.
Da Brain-Flak bereits Stapel verwendet, ist dies ein gutes Puzzle für Brain-Flak.
quelle
{{}<>{}<>}
kann auf gekürzt werden{{}<>}
.Wolfram Language (Mathematica) , 28 Byte
Probieren Sie es online!
quelle
b
a___
. Man kann das sehen, indem man es versuchtReplaceList[#, {a___, b_, 0, c___} :> {a, c}] &
. Auf eine verwandte Anmerkung,StringReplace
ist eigentlich gierig, so würde diese Einreichung nicht funktionierenStringReplace
(mit Muster wiea___~~b_~~"0"~~c___
)Python 2 , 48 Bytes
Probieren Sie es online!
quelle
2*0**x
wird es immer so sein0
. Mir fehlt offensichtlich etwas.x=0
, in diesem Fall ist es 2.Leerzeichen , 89 Bytes
Buchstaben
S
(Leerzeichen),T
(Tabulator) und (Zeilenvorschub) werdenN
nur als Hervorhebungen hinzugefügt.[..._some_action]
nur als Erklärung hinzugefügt.Trennt die Eingabe-Liste durch ein Zeichen,
-1
um anzuzeigen, dass wir mit den Eingaben fertig sind.Probieren Sie es online aus .
Erklärung im Pseudocode:
quelle
Python 2 ,
60595756 BytesProbieren Sie es online!
Gerettet:
quelle
0
und entfernenin
JavaScript, 40 Bytes
Ausgänge in umgekehrter Reihenfolge.
Probieren Sie es online aus
Dank Herman L 1 Byte gespart .
quelle
a=>a.map(x=>x?o.push(x):o.pop(),o=[])&&o
ist ein Byte kürzer(un)shift
bevor ich die gefleckte Ausgabe rückgängig machen konnte.o
im Rückruf darauf verwiesen wird, nachdem es im zweiten Argument definiert wurde.05AB1E , 9 Bytes
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
9 Bytes Alternative:
Probieren Sie es online aus und überprüfen Sie alle Testfälle .
Erläuterung:
PS: Sollte die Ausgabe umgekehrt worden sein, um mit den Testfällen in der Herausforderungsbeschreibung übereinzustimmen, können wir
R
der zweiten Version (also 10 Bytes ) ein Trailing hinzufügen , wodurch die Liste umgekehrt wird. Probieren Sie es online aus oder überprüfen Sie alle Testfälle .quelle
Retina 0.8.2 , 18 Bytes
Probieren Sie es online! Link enthält Testfälle. Erläuterung:
Präfix ein extra
,
.Verarbeiten Sie alle Pop-Operationen.
Entfernen Sie das,
,
wenn es noch da ist.Das Umkehren der Zahlen würde zusätzliche 8 Bytes kosten:
quelle
<number>, 0
Unterliste durch nichts.Ruby , 36 Bytes
Probieren Sie es online!
Anonymes Lambda. Ausgänge in umgekehrter Reihenfolge.
quelle
Brain-Flak , 36 Bytes
Probieren Sie es online!
quelle
Brain-Flak , 32 Bytes
Probieren Sie es online!
Verwendet
-1
, um das Ende des Arrays zu kennzeichnen (aber jede Zahl wird es wirklich tun).quelle
V , 10 Bytes
Probieren Sie es online!
Erläuterung
Entspricht in Vim 16 Byte
Probieren Sie es online!
Erläuterung
So ziemlich dasselbe, außer ein Makro aufzuzeichnen
q
und es rekursiv aufzurufen:quelle
Java 10,
7572 BytesAusgaben durch Komma getrennt. Der oberste Stapel ist der letzte. Probieren Sie es hier online aus .
Vielen Dank an Olivier Grégoire für das Golfen mit 2 Bytes.
Lesen Sie auch die Java-Antworten von Kevin Cruijssen und Olivier Grégoire . Sie verfolgen stattdessen einen Listen-basierten Ansatz, wobei letzterer die Mine um einiges übertrifft.
Ungolfed:
quelle
Stack
-Objekt. +1 von mir.n->{var s="";for(int i:n)s=(s+","+i).replaceAll(",\\d+,0$","");return s;}
(73 Bytes), setzt aber die,
Vorher-Nummern nicht nachher.n->{var s=""+n;for(int x:n)s=s.replaceFirst("\\d+, 0,? ?","");return s;}
(72 Bytes), verwendet eine Liste anstatt eines Arrays und fummelt an der Ausgabe herum, weil es Dinge wie "[, 2]" zurückgeben kann$
, um ein zusätzliches Byte zu speichern, da jedes, das0
wir hinzufügen, sofort entfernt wird.GolfScript ,
1412 BytesProbieren Sie es online!
quelle
Perl 5
-p
, 17 BytesVielen Dank an @sundar und @DomHastings
Probieren Sie es online!
quelle
> <> 25 Bytes
Probieren Sie es online! (Die Eingabe muss in ASCII geschrieben sein. Andernfalls wird diese verwendet. )
Wie es funktioniert
i:?\~~
prüft auf 0,~~
löscht weiterhin den vorherigen Eintrag. ansonsten gehe runter zu:(0:/:^?
die nach -1 sucht (keine Eingabe mehr), dann zum Löschen von -1 auflädt und die Schleife:!?l:!<oan;
Diese gibt jede Zahl mit einem Zeilenumbruch aus und endet, wenn der Stapel geleert istquelle
Schale , 6 Bytes
Da gibt es noch keine Antwort von Husk und es ist meine Lieblingsgolf-Sprache:
Probieren Sie es online!
Erläuterung
Alternative Lösung, 6 Bytes
Anstatt zu spiegeln, können wir die Liste auch einfach umkehren und dann eine Rechtsfalte verwenden:
Ḟ?:tø↔
quelle
Brainfuck ,
214150 BytesLiest Eingaben als durch Zeilenumbrüche getrennte Zahlen. Dies muss eine einzelne nachgestellte Zeile enthalten. Erwartet auch keine führenden Nullen für jede Zahl. Ausgabe als ähnliche durch Zeilenumbrüche getrennte Liste
Probieren Sie es online!
Erklärung
, die nicht wirklich eine Erklärung ist, sondern eigentlich nur die Version, an der ich mit den Kommentaren und Dingen gearbeitet habe, die für niemanden wirklich nützlich sein können oder auch nichtquelle
Brachylog , 21 Bytes
Probieren Sie es online!
-1 Byte, und was noch wichtiger ist, dies scheint eine viel weniger klobige Methode zu sein.
Alternate 21 byter:
∋0∧ℕ₁;0;P↺c;Qc?∧P,Q↰|
Probieren Sie es online!Älterer Code:
22 Bytes
Probieren Sie es online!
quelle
Warnung: Es folgen viele Zeilen. Du wurdest gewarnt.
CJam , 17 Bytes
Gefährlichster Code
(Angenommen, die Stack-Elemente können nur durch Leerzeichen in der Ausgabe getrennt werden und das Eingabe-Array kann eine beliebige Form haben)
Probieren Sie es online!
Erläuterung
Alternativer Code Nr. 1, 27 Byte
(Angenommen, Stapelelemente müssen in dem in der Frage gezeigten Format ausgegeben werden und das Eingabearray kann in jeder von uns gewünschten Form vorliegen.)
Probieren Sie es online!
Erläuterung
Alternativer Code Nr. 2, 24 Byte
(Angenommen, die Stapelelemente können in der Ausgabe sortiert werden und das Eingabearray muss das in der Frage angegebene genaue Format haben.)
Probieren Sie es online!
Erläuterung
Sicherster Code hierfür, 34 Byte
(Angenommen, Stapelelemente müssen in dem in der Frage angegebenen Format ausgegeben werden und das Eingabearray muss in dem in der Frage angegebenen Format vorliegen.)
Probieren Sie es online!
Erläuterung
Vielen Dank an @Jo King für den Hinweis, dass diejenigen mit der zusammengestellten Ausgabe ungültig sind, da Dinge wie
[12]
und[1,2]
nicht unterscheidbar wären.Dank auch an @Jo King , der eine sehr geeignete Alternative für die gesammelten Ausgaben und das Abschneiden von 9 Bytes bietet!
quelle
[12]
und nicht erkennen können[1,2]
. Die 27-Byte-Version scheint jedoch in Ordnung zu sein, obwohl Sie das Leerzeichen und die Klammern für 18 Byte]S*
(3) verwenden, während Kommas]',*
(4) verwendenRot , 64 Bytes
Probieren Sie es online!
quelle