Das Pickle-Modul von Python wird für die Serialisierung verwendet, sodass ein Objekt so abgelegt werden kann, dass es später rekonstruiert werden kann. Pickle verwendet dazu eine einfache Stack-basierte Sprache.
Um die Dinge einfach zu halten, werden wir uns mit einer kleinen Teilmenge dieser Sprache befassen:
( Push a mark to the stack
S'abc'\n Push a string to the stack (here with contents 'abc')
l Pop everything up to the last mark, wrapping all but the mark in a list
t Pop everything up to the last mark, wrapping all but the mark in a tuple
. Terminate the virtual machine
Ihre Aufgabe ist es, diese Teilmenge der Sprache zu implementieren. Beachten Sie, dass \n
es sich hier um einen wörtlichen Zeilenumbruch handelt und Zeilenumbrüche für die Sprache tatsächlich wichtig sind.
Für diejenigen, die mit GolfScript oder CJam-ähnlichen Sprachen, (
und l/t
funktioniert ähnlich wie [
und ]
jeweils.
Eingang
Zur Vereinfachung ist die Eingabe immer gültig. Insbesondere können Sie Folgendes für die Eingabe annehmen:
- Zeichenfolgen bestehen nur aus Kleinbuchstaben und Leerzeichen
[a-z ]
und verwenden immer einfache Anführungszeichen. - Es werden keine fremden Zeichen angezeigt. Alle Anweisungen sind wie oben angegeben. Dies bedeutet zum Beispiel, dass Zeilenumbrüche immer erst nach Zeichenfolgen auftreten.
- Jeder
l/t
hat ein Matching(
davor und jeder(
hat ein Matchingl/t
danach. Es wird auch mindestens einen geben(
. - Es wird genau einen geben
.
, und es wird immer den endgültigen Charakter geben.
Sie können Eingaben über die Befehlszeile, STDIN oder das Funktionsargument vornehmen. Wenn Sie möchten, können Sie anstelle einer mehrzeiligen Zeichenfolge eine einzelne Zeichenfolge mit Zeilenumbruch verwenden. Geben Sie dies jedoch in Ihrer Antwort an.
Ausgabe
Die Ausgabe sollte eine Darstellung des endgültigen Objekts sein, auf STDOUT gedruckt oder als Zeichenfolge zurückgegeben werden . Speziell:
Zeichenfolgen werden durch Öffnen und Schließen von einfachen Anführungszeichen mit Inhalten dazwischen dargestellt, z
S'abc' -> 'abc'
. Sie dürfen für diese Herausforderung keine doppelten Anführungszeichen verwenden, auch wenn sie in Python zulässig sind.Listen werden durch durch Kommas getrennte Elemente dargestellt, die von
[]
(z. B.['a','b','c']
) umgeben sind, während Tupel durch durch Kommas getrennte Elemente dargestellt werden, die von()
(z('a','b','c')
. B. ) umgeben sind.- Leerzeichen spielen keine Rolle, zB
('a', 'b', 'c' )
ist okay. - Vor der schließenden Klammer darf kein Komma stehen. Beachten Sie, dass dies absichtlich von den Python-Syntaxregeln abweicht, um die Arbeit für die meisten Sprachen zu vereinfachen und es auch schwieriger zu machen, die Liste / das Tupel in Python zu erstellen und dann auszugeben, da das Tupel aus einem Element besteht (aus diesem Grund) Herausforderung brauchen wir
('a')
im Gegensatz zu('a',)
).
Beispiele
Der obige Text mag einschüchternd erscheinen, aber die folgenden Beispiele sollen die Dinge etwas klarer machen.
(l.
Mögliche Ausgabe: []
(t.
Mögliche Ausgabe: ()
(S'hello world'
l.
Mögliche Ausgabe: ['hello world']
(S'string one'
S'string two'
S'string three'
t.
Mögliche Ausgabe: ('string one', 'string two', 'string three')
(S'a'
(S'b'
S'c'
lt.
Mögliche Ausgabe: ('a',['b','c'])
((S'a'
S'b'
(lS'c'
t(S'd'
tl.
Mögliche Ausgabe: [('a', 'b', [], 'c'), ('d')]
((S'a'
((S'b'
t(S'c'
lS'd'
(((ltlS'e'
S'f'
lS'g'
tl.
Mögliche Ausgabe: [('a',[('b'),['c'],'d',[([])],'e','f'],'g')]
Regeln
- Das ist Code-Golf , also gewinnt der Code mit den wenigsten Bytes.
- Alle Funktionen, die für die Verwendung mit Python-Gurken entwickelt wurden, sind nicht zulässig.
Sicherheitshinweis: In echtem Code sollten Sie nur die Auswahl von Quellen entfernen, denen Sie vertrauen. Andernfalls erhalten Sie möglicherweise eine böse cos\nsystem\n(S'rm -rf'\ntR.
Überraschung
quelle
S'abc'\n
schiebenabc
oder'abc'
?Antworten:
CJam, 63
Probieren Sie es online aus
Erläuterung:
Nun die lange Zeichenkette mit verschiedenen Codestücken. Jedes Teil hat ein paar zu überprüfende Zeichen und dann einen Block zum Behandeln jedes einzelnen und den Standardfall.
Erster Teil:
Slt 1:T;L ]',*'[\+']+ ]',*'(\+')+ [
Zweiter Teil:
(newline) 0:T; C+
quelle
Perl, 149 Bytes
Ich habe ein schlechtes Gefühl, dass dies ein schlechter Versuch ist, aber hier geht:
Das Skript muss in einer Datei gespeichert werden und wird von STDIN eingegeben.
Erläuterung:
quelle
> <> 88 Bytes
Spaß mit Sprüngen! Verwendet die Tatsache, dass die ASCII-Codes für die 5 beteiligten Hauptbefehle, Mod 9, sind:
Auf diese Weise kann jede Operation in einer eigenen Zeile ausgeführt werden, zu der direkt gesprungen wird. Verwendet den Stapel von Stapeln auch, um jeden String und jedes verschachtelte List / Tupel separat zu erstellen, bevor sie in die erforderlichen Zeichen eingeschlossen werden.
quelle
JavaScript (ES6), 199 Byte
Führt mehrere reguläre Ausdrücke für die Eingabe aus, um sie in gültigen JS-Code zu verwandeln, und analysiert diesen dann.
Testschnipsel
quelle
Julia + ParserCombinator.jl
306240Mit meinen letzten Überarbeitungen glaube ich nicht mehr, dass eine reine Julia-Lösung kürzer wäre.
Das war interessant. Ich denke, der Code ist ziemlich beredt.
a
l
,i
,t
, Unds
im Grunde CFG Regelnf
ist die Funktion, die es heißt, bringt alles zusammen.Drop(Equal("'\n"))
ist ärgerlich - das wäre idealerweise so geschrieben,E"\n"
aber dasE
String-Makro verarbeitet keine Escape-Sequenzen.|>
s entfernt undtuple
für diet
Regel hinzugefügtquelle