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 \n
jest 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/t
dział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/t
ma pasujące(
przed nim i każdy(
ma pasującel/t
po 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ę
źródło
S'abc'\n
pushabc
lub'abc'
?Odpowiedzi:
CJam, 63
Wypróbuj online
Wyjaśnienie:
Teraz długi ciąg z różnymi fragmentami kodu. Każda część ma kilka znaków do sprawdzenia, a następnie blok do obsługi każdej z nich oraz domyślny przypadek.
Pierwsza część:
Slt 1:T;L ]',*'[\+']+ ]',*'(\+')+ [
Druga część:
(newline) 0:T; C+
źródło
Perl, 149 bajtów
Mam złe przeczucie, że to kiepska próba, ale oto:
Skrypt musi zostać zapisany w pliku i pobiera dane wejściowe z STDIN.
Wyjaśnienie:
źródło
> <>, 88 bajtów
Zabawa ze skokami! Wykorzystuje fakt, że kody ASCII dla 5 głównych zaangażowanych poleceń, mod 9, to:
Dzięki temu każda operacja może być obsługiwana na osobnej linii, do której nastąpi bezpośrednie przejście. Wykorzystuje również stosy do konstruowania każdego łańcucha i zagnieżdżonej listy / krotki osobno przed zawinięciem ich w wymagane znaki.
źródło
JavaScript (ES6), 199 bajtów
Uruchamia kilka wyrażeń regularnych na wejściu, aby przekształcić go w poprawny kod JS, a następnie analizuje.
Test Snippet
źródło
Julia + ParserCombinator.jl
306240Dzięki najnowszemu zestawowi poprawek nie sądzę, że rozwiązanie z czystą Julią byłoby krótsze.
To było interesujące. Myślę, że kodowany jest dość elokwentny.
a
l
,i
,t
, Is
są w zasadzie cfg zasadyf
nazywana jest funkcją, która łączy wszystko razem.Drop(Equal("'\n"))
jest irytujące - że najlepiej być zapisany jakoE"\n"
aleE
makro łańcuch nie obsługuje sekwencje.|>
s i dodająctuple
dot
regułyźródło