Модуль Python Pickle используется для сериализации, позволяя создать объект таким образом, чтобы впоследствии его можно было восстановить. Для этого pickle использует простой язык на основе стека.
Для простоты мы будем иметь дело с небольшим подмножеством этого языка:
( 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
Ваша задача - реализовать это подмножество языка. Обратите внимание, что \n
здесь буквальный перевод строки, и переводы строки действительно важны для языка.
Для тех, кто знаком с GolfScript или CJam-подобными языками, (
и l/t
работает аналогично [
и ]
соответственно.
вход
Для простоты ввод всегда будет действительным. В частности, вы можете предположить следующее относительно ввода:
- Строки будут состоять только из строчных букв и пробелов
[a-z ]
и всегда будут использовать одинарные кавычки. - Не будет никаких посторонних символов, все инструкции будут такими, как указано выше. Например, это означает, что переводы строк будут происходить только после строк.
- У каждого
l/t
есть соответствие(
перед ним, и у каждого(
есть соответствиеl/t
после него. Там также будет хотя бы один(
. - Там будет ровно один
.
, и он всегда будет последним персонажем.
Вы можете получить ввод через командную строку, STDIN или аргумент функции. Вы можете использовать одну строку с новой строкой вместо многострочной, если хотите, но укажите это в своем ответе.
Выход
Выходными данными должно быть представление конечного объекта, напечатанное в STDOUT или возвращенное в виде строки . В частности:
Строки представлены открытием и закрытием одинарных кавычек с содержимым между ними, например
S'abc' -> 'abc'
. Вы не можете использовать двойные кавычки для этой задачи, даже если они разрешены в Python.Списки представлены разделенными запятыми элементами, окруженными
[]
(например['a','b','c']
), в то время как кортежи представлены разделенными запятыми элементами, окруженными()
(например,('a','b','c')
).- Пробелы не имеют значения, например,
('a', 'b', 'c' )
все в порядке. - Вы не можете иметь запятую перед закрывающей скобкой. Обратите внимание, что это намеренно отличается от правил синтаксиса Python для упрощения работы большинства языков, а также для усложнения простого создания списка / кортежа в Python и его вывода из-за того, как представлен одноэлементный кортеж (для этого вызов, нам нужно
('a')
в отличие от('a',)
).
Примеры
Приведенный выше текст может показаться пугающим, но следующие примеры должны прояснить ситуацию.
(l.
Возможный вывод: []
(t.
Возможный вывод: ()
(S'hello world'
l.
Возможный вывод: ['hello world']
(S'string one'
S'string two'
S'string three'
t.
Возможный вывод: ('string one', 'string two', 'string three')
(S'a'
(S'b'
S'c'
lt.
Возможный вывод: ('a',['b','c'])
((S'a'
S'b'
(lS'c'
t(S'd'
tl.
Возможный вывод: [('a', 'b', [], 'c'), ('d')]
((S'a'
((S'b'
t(S'c'
lS'd'
(((ltlS'e'
S'f'
lS'g'
tl.
Возможный вывод: [('a',[('b'),['c'],'d',[([])],'e','f'],'g')]
правила
- Это код-гольф , поэтому выигрывает код в наименьшем количестве байтов.
- Любая функциональность, предназначенная для работы с солями Python, не допускается.
Примечание по безопасности: в реальном коде извлекайте информацию только из источников, которым вы доверяете, иначе вы можете получить неприятный cos\nsystem\n(S'rm -rf'\ntR.
сюрприз
S'abc'\n
толкатьabc
или'abc'
?