El módulo pickle de Python se utiliza para la serialización, lo que permite volcar un objeto de tal manera que luego pueda reconstruirse. Para esto, pickle usa un lenguaje simple basado en la pila.
Para simplificar las cosas, trataremos con un pequeño subconjunto de este lenguaje:
( 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
Su tarea es implementar este subconjunto del lenguaje. Tenga en cuenta que aquí \n
hay una nueva línea literal, y las nuevas líneas son realmente importantes para el idioma.
Para aquellos familiarizados con los lenguajes similares a GolfScript o CJam, (
y l/t
funcionan de manera similar a [
y ]
respectivamente.
Entrada
Para mantener las cosas simples, la entrada siempre será válida. En particular, puede asumir lo siguiente sobre la entrada:
- Las cadenas solo consistirán en letras minúsculas y espacios
[a-z ]
, y siempre usarán comillas simples. - No habrá caracteres extraños, con todas las instrucciones como se especificó anteriormente. Por ejemplo, esto significa que las nuevas líneas solo ocurrirán después de las cadenas.
- Todos
l/t
tienen una coincidencia(
antes y todos(
tienen una coincidencial/t
después. También habrá al menos uno(
. - Habrá exactamente uno
.
, y siempre será el personaje final.
Puede tomar la entrada a través de la línea de comando, STDIN o argumento de función. Si lo desea, puede usar una sola cadena de escape de nueva línea en lugar de una cadena multilínea, pero especifique esto en su respuesta.
Salida
El resultado debe ser una representación del objeto final, impreso en STDOUT o devuelto como una cadena . Específicamente:
Las cadenas se representan abriendo y cerrando comillas simples con contenido intermedio, por ejemplo
S'abc' -> 'abc'
. No puede usar comillas dobles para este desafío, aunque estén permitidas en Python.Las listas están representadas por elementos separados por comas rodeados por
[]
( por ejemplo['a','b','c']
), mientras que las tuplas están representadas por elementos separados por comas rodeados por()
( por ejemplo('a','b','c')
).- Los espacios no importan, por ejemplo,
('a', 'b', 'c' )
está bien. - No puede tener una coma antes del corchete de cierre. Tenga en cuenta que esto es intencionalmente diferente de las reglas de sintaxis de Python para facilitar las cosas para la mayoría de los lenguajes, y también para dificultar simplemente construir la lista / tupla en Python y luego generarla, debido a cómo se representa la tupla de un solo elemento (para esto desafío, necesitamos
('a')
en lugar de('a',)
).
Ejemplos
El texto anterior puede parecer desalentador, pero los siguientes ejemplos deberían aclarar un poco las cosas.
(l.
Salida posible: []
(t.
Salida posible: ()
(S'hello world'
l.
Salida posible: ['hello world']
(S'string one'
S'string two'
S'string three'
t.
Salida posible: ('string one', 'string two', 'string three')
(S'a'
(S'b'
S'c'
lt.
Salida posible: ('a',['b','c'])
((S'a'
S'b'
(lS'c'
t(S'd'
tl.
Salida posible: [('a', 'b', [], 'c'), ('d')]
((S'a'
((S'b'
t(S'c'
lS'd'
(((ltlS'e'
S'f'
lS'g'
tl.
Salida posible: [('a',[('b'),['c'],'d',[([])],'e','f'],'g')]
Reglas
- Este es el código de golf , por lo que gana el código en la menor cantidad de bytes.
- No se permite ninguna funcionalidad diseñada para trabajar con pepinillos en Python.
Nota de seguridad: en el código real, solo desconéctelo de las fuentes en las que confía, de lo contrario, podría recibir una desagradable cos\nsystem\n(S'rm -rf'\ntR.
sorpresa
fuente
S'abc'\n
Empujaabc
o'abc'
?Respuestas:
CJam, 63
Pruébalo en línea
Explicación:
Ahora la larga cadena con varias piezas de código. Cada parte tiene algunos caracteres para verificar y luego un bloque para manejar cada uno, y el caso predeterminado.
Primera parte:
Slt 1:T;L ]',*'[\+']+ ]',*'(\+')+ [
Segunda parte:
(newline) 0:T; C+
fuente
Perl, 149 bytes
Tengo el mal presentimiento de que este es un intento pobre, pero aquí va:
La secuencia de comandos debe guardarse en un archivo y toma la entrada de STDIN.
Explicación:
fuente
> <>, 88 bytes
Diversión con saltos! Utiliza el hecho de que los códigos ASCII para los 5 comandos principales involucrados, mod 9, son:
Esto permite que cada operación se maneje en su propia línea, a la que se saltará directamente. También usa la pila de pilas para construir cada cadena y lista / tupla anidada por separado antes de envolverlas en los caracteres requeridos.
fuente
JavaScript (ES6), 199 bytes
Ejecuta varios reemplazos de expresiones regulares en la entrada para convertirlo en un código JS válido, luego lo analiza.
Fragmento de prueba
fuente
Julia + ParserCombinator.jl
306240Con mi último conjunto de revisiones, ya no creo que una solución pura de Julia sea más corta.
Eso fue interesante. Creo que el código es bastante elocuente.
a
l
,i
,t
, Ys
son, básicamente, CFG reglasf
es la función que se llama, lo reúne todo.Drop(Equal("'\n"))
es molesto: idealmente se escribiría como,E"\n"
pero laE
macro de cadena no maneja secuencias de escape.|>
sy agregatuple
para lat
reglafuente