Модуль 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'
?Ответы:
CJam, 63
Попробуйте онлайн
Объяснение:
Теперь длинная строка с различными кусочками кода. Каждая часть имеет несколько символов для проверки, а затем блок для обработки каждого из них и регистр по умолчанию.
Первая часть:
Slt 1:T;L ]',*'[\+']+ ]',*'(\+')+ [
Вторая часть:
(newline) 0:T; C+
источник
Perl, 149 байт
У меня плохое предчувствие, что это неудачная попытка, но здесь говорится:
Сценарий должен быть сохранен в файл, и он принимает входные данные из STDIN.
Объяснение:
источник
> <>, 88 байт
Веселье с прыжками! Использует тот факт, что коды ASCII для 5 основных команд, мод 9, являются:
Это позволяет обрабатывать каждую операцию в отдельной строке, к которой можно непосредственно перейти. Также использует стек стеков для конструирования каждой строки и вложенного списка / кортежа отдельно перед тем, как заключить их в необходимые символы.
источник
JavaScript (ES6), 199 байт
Выполняет несколько замен регулярных выражений на входе, чтобы превратить его в действительный код JS, а затем анализирует его.
Тестовый фрагмент
источник
Julia + ParserCombinator.jl
306240С моим последним набором ревизий я больше не думаю, что чисто решение Джулии будет короче.
Это было интересно. Я думаю, что код достаточно красноречив.
a
l
,i
,t
, Иs
в основном CFG правилаf
это функция, которая называется это сводит все это вместе.Drop(Equal("'\n"))
раздражает - это было бы идеально быть записана в виде ,E"\n"
ноE
строка макроса не обрабатывает управляющие последовательности.|>
s и добавлениеtuple
дляt
правилаисточник