Moduł piklujący Pythona służy do serializacji, pozwalając zrzucić obiekt w taki sposób, że można go później odtworzyć. W tym celu marynata używa prostego języka opartego na stosie.
Dla uproszczenia będziemy mieli do czynienia z niewielkim podzbiorem tego języka:
( 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
Twoim zadaniem jest wdrożenie tego podzbioru języka. Zauważ, że \njest tu dosłownie nowa linia, a nowe linie są w rzeczywistości ważne dla języka.
Dla tych, którzy znają języki GolfScript lub CJam (i l/tdziałają podobnie [i ]odpowiednio.
Wejście
Dla uproszczenia dane wejściowe zawsze będą prawidłowe. W szczególności możesz przyjąć następujące założenia dotyczące danych wejściowych:
- Ciągi składają się tylko z małych liter i spacji
[a-z ]i zawsze będą używać pojedynczych cudzysłowów. - Nie będzie żadnych obcych znaków, a wszystkie instrukcje będą takie, jak określono powyżej. Na przykład oznacza to, że znaki nowej linii pojawią się zawsze po łańcuchach.
- Każdy
l/tma pasujące(przed nim i każdy(ma pasującel/tpo nim. Będzie też co najmniej jeden(. - Będzie dokładnie jeden
.i zawsze będzie to końcowy charakter.
Możesz pobierać dane z wiersza poleceń, STDIN lub argumentu funkcji. Jeśli chcesz, możesz użyć pojedynczego łańcucha ze znakiem nowej linii zamiast ciągu wielowierszowego, ale proszę podać to w odpowiedzi.
Wynik
Dane wyjściowe powinny być reprezentacją końcowego obiektu, wydrukowane do STDOUT lub zwrócone jako ciąg . Konkretnie:
Ciągi są reprezentowane przez otwieranie i zamykanie pojedynczych cytatów z zawartością pomiędzy nimi, np
S'abc' -> 'abc'. Nie możesz używać podwójnych cudzysłowów dla tego wyzwania, nawet jeśli są one dozwolone w Pythonie.Listy są reprezentowane przez elementy oddzielone przecinkami otoczone
[](np.['a','b','c']), Podczas gdy krotki są reprezentowane przez elementy oddzielone przecinkami otoczone()(np('a','b','c').).- Spacje nie mają znaczenia, np.
('a', 'b', 'c' )Jest w porządku. - Przed nawiasem zamykającym nie możesz mieć przecinka. Zauważ, że celowo różni się to od reguł składni Pythona, aby ułatwić większość języków, a także utrudnić po prostu zbudowanie listy / krotki w Pythonie, a następnie wygenerowanie jej, ze względu na to, w jaki sposób reprezentowana jest krotka jednoelementowa (w tym wyzwanie, którego potrzebujemy,
('a')a nie('a',)).
Przykłady
Powyższy tekst może wydawać się zniechęcający, ale poniższe przykłady powinny uczynić sprawę nieco bardziej zrozumiałą.
(l.
Możliwe wyjście: []
(t.
Możliwe wyjście: ()
(S'hello world'
l.
Możliwe wyjście: ['hello world']
(S'string one'
S'string two'
S'string three'
t.
Możliwe wyjście: ('string one', 'string two', 'string three')
(S'a'
(S'b'
S'c'
lt.
Możliwe wyjście: ('a',['b','c'])
((S'a'
S'b'
(lS'c'
t(S'd'
tl.
Możliwe wyjście: [('a', 'b', [], 'c'), ('d')]
((S'a'
((S'b'
t(S'c'
lS'd'
(((ltlS'e'
S'f'
lS'g'
tl.
Możliwe wyjście: [('a',[('b'),['c'],'d',[([])],'e','f'],'g')]
Zasady
- To jest golf golfowy , więc kod w najmniejszej liczbie bajtów wygrywa.
- Wszelkie funkcje zaprojektowane do pracy z piklami Pythona są niedozwolone.
Uwaga dotycząca bezpieczeństwa: w prawdziwym kodzie usuwaj tylko źródła, którym ufasz, w przeciwnym razie możesz mieć przykrą cos\nsystem\n(S'rm -rf'\ntR.niespodziankę
S'abc'\npushabclub'abc'?