Le module pickle de Python est utilisé pour la sérialisation, ce qui permet de vider un objet d'une manière telle qu'il puisse être reconstruit plus tard. Pour cela, pickle utilise un langage simple basé sur la pile.
Pour simplifier les choses, nous traiterons d'un petit sous-ensemble de ce langage:
( 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
Votre tâche consiste à implémenter ce sous-ensemble de la langue. Notez qu'il \n
s'agit ici d'une nouvelle ligne littérale, et les nouvelles lignes sont en fait importantes pour la langue.
Pour ceux qui sont familiers avec les langages GolfScript ou CJam (
et qui l/t
fonctionnent de manière similaire [
et ]
respective.
Contribution
Pour simplifier les choses, l'entrée sera toujours valide. En particulier, vous pouvez supposer ce qui suit à propos de l'entrée:
- Les chaînes ne seront composées que de lettres minuscules et d'espaces
[a-z ]
et utiliseront toujours des guillemets simples. - Il n'y aura pas de caractères étrangers, toutes les instructions étant celles spécifiées ci-dessus. Par exemple, cela signifie que les sauts de ligne ne se produiront qu'après les chaînes.
- Chacun
l/t
a une correspondance(
avant et chaque(
a une correspondancel/t
après. Il y en aura également au moins un(
. - Il y en aura exactement un
.
et ce sera toujours le dernier caractère.
Vous pouvez saisir des informations via la ligne de commande, STDIN ou l'argument de fonction. Vous pouvez utiliser une seule chaîne d'échappement de nouvelle ligne au lieu d'une chaîne multiligne si vous le souhaitez, mais veuillez le préciser dans votre réponse.
Production
La sortie doit être une représentation de l'objet final, imprimée sur STDOUT ou retournée sous forme de chaîne . Plus précisément:
Les chaînes sont représentées par l'ouverture et la fermeture de guillemets simples avec du contenu entre les deux, par exemple
S'abc' -> 'abc'
. Vous ne pouvez pas utiliser de guillemets doubles pour ce défi, même s'ils sont autorisés en Python.Les listes sont représentées par des éléments séparés par des virgules entourés par
[]
( par exemple['a','b','c']
), tandis que les tuples sont représentés par des éléments séparés par des virgules entourés par()
( par exemple('a','b','c')
).- Les espaces n'ont pas d'importance, par exemple,
('a', 'b', 'c' )
ça va. - Vous ne pouvez pas avoir de virgule avant le crochet de fermeture. Notez que ceci est intentionnellement différent des règles de syntaxe Python pour rendre les choses plus faciles pour la plupart des langues, et aussi pour rendre plus difficile la construction simple de la liste / du tuple en Python, puis sa sortie, en raison de la façon dont le tuple à élément unique est représenté (pour cela défi, nous avons besoin
('a')
par opposition à('a',)
).
Exemples
Le texte ci-dessus peut sembler intimidant, mais les exemples suivants devraient rendre les choses un peu plus claires.
(l.
Sortie possible: []
(t.
Sortie possible: ()
(S'hello world'
l.
Sortie possible: ['hello world']
(S'string one'
S'string two'
S'string three'
t.
Sortie possible: ('string one', 'string two', 'string three')
(S'a'
(S'b'
S'c'
lt.
Sortie possible: ('a',['b','c'])
((S'a'
S'b'
(lS'c'
t(S'd'
tl.
Sortie possible: [('a', 'b', [], 'c'), ('d')]
((S'a'
((S'b'
t(S'c'
lS'd'
(((ltlS'e'
S'f'
lS'g'
tl.
Sortie possible: [('a',[('b'),['c'],'d',[([])],'e','f'],'g')]
Règles
- C'est du code-golf , donc le code dans le moins d'octets gagne.
- Toute fonctionnalité conçue pour fonctionner avec des cornichons Python n'est pas autorisée.
Note de sécurité: en vrai code, ne décochez que les sources de confiance, sinon vous pourriez avoir une mauvaise cos\nsystem\n(S'rm -rf'\ntR.
surprise
la source
S'abc'\n
pousserabc
ou'abc'
?Réponses:
CJam, 63
Essayez-le en ligne
Explication:
Maintenant, la longue chaîne avec divers morceaux de code. Chaque partie a quelques caractères à vérifier puis un bloc pour la gestion de chacun et le cas par défaut.
Première partie:
Slt 1:T;L ]',*'[\+']+ ]',*'(\+')+ [
Deuxième partie:
(newline) 0:T; C+
la source
Perl, 149 octets
J'ai le mauvais pressentiment que c'est une mauvaise tentative, mais voici:
Le script doit être enregistré dans un fichier et il prend l'entrée de STDIN.
Explication:
la source
> <>, 88 octets
Amusez-vous avec des sauts! Utilise le fait que les codes ASCII pour les 5 principales commandes impliquées, mod 9, sont:
Cela permet à chaque opération d'être gérée sur sa propre ligne, qui sera directement sautée. Utilise également la pile de piles pour construire séparément chaque chaîne et liste / tuple imbriqué avant de les encapsuler dans les caractères requis.
la source
JavaScript (ES6), 199 octets
Exécute plusieurs remplacements d'expressions régulières sur l'entrée pour la transformer en code JS valide, puis analyse cela.
Extrait de test
la source
Julia + ParserCombinator.jl
306240Avec ma dernière série de révisions, je ne pense plus qu'une solution pure julia serait plus courte.
C'était intéressant. Je pense que le codé est assez éloquent.
a
l
,i
,t
Ets
sont essentiellement CFG règlesf
est la fonction qui est appelée, elle rassemble tout cela.Drop(Equal("'\n"))
est ennuyeux - qui serait idéalement écrit ,E"\n"
mais laE
macro chaîne ne gère pas des séquences d'échappement.|>
s et d'ajoutertuple
pour lat
règlela source