Модуль соління Python використовується для серіалізації, дозволяючи скинути об'єкт таким чином, щоб він був згодом реконструйований. Для цього підберезник використовує просту мову на основі стека.
Щоб все було просто, ми матимемо справу з невеликим підмножиною цієї мови:
( 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'
?