Modul acar Python digunakan untuk serialisasi, yang memungkinkan seseorang untuk membuang objek sedemikian rupa sehingga dapat kemudian direkonstruksi. Untuk ini, acar menggunakan bahasa berbasis stack sederhana.
Untuk mempermudah, kami akan menangani sebagian kecil dari bahasa ini:
( 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
Tugas Anda adalah mengimplementasikan subset bahasa ini. Perhatikan bahwa \n
ini adalah baris baru literal di sini, dan baris baru sebenarnya penting untuk bahasa tersebut.
Bagi mereka yang terbiasa dengan GolfScript atau bahasa seperti CJam, (
dan l/t
beroperasi mirip dengan masing [
- ]
masing.
Memasukkan
Agar semuanya sederhana, input akan selalu valid. Secara khusus, Anda dapat mengasumsikan berikut tentang input:
- String hanya akan terdiri dari huruf kecil dan spasi
[a-z ]
, dan akan selalu menggunakan tanda kutip tunggal. - Tidak akan ada karakter asing, dengan semua instruksi seperti yang ditentukan di atas. Misalnya, ini berarti bahwa baris baru hanya akan pernah muncul setelah string.
- Setiap orang
l/t
memiliki pencocokan(
sebelum dan setiap(
pencocokanl/t
setelahnya. Setidaknya akan ada satu(
. - Akan ada persis satu
.
, dan itu akan selalu menjadi karakter terakhir.
Anda dapat mengambil input melalui baris perintah, STDIN atau argumen fungsi. Anda dapat menggunakan string yang diloloskan baris baru alih-alih string multiline jika diinginkan, tetapi harap tentukan ini dalam jawaban Anda.
Keluaran
Output harus berupa representasi dari objek akhir, dicetak ke STDOUT atau dikembalikan sebagai string . Secara khusus:
String direpresentasikan dengan membuka dan menutup tanda kutip tunggal dengan konten di antaranya, mis
S'abc' -> 'abc'
. Anda tidak boleh menggunakan tanda kutip ganda untuk tantangan ini, meskipun mereka diizinkan dalam Python.Daftar diwakili oleh elemen yang dipisahkan koma yang dikelilingi oleh
[]
(misalnya['a','b','c']
), sedangkan tupel diwakili oleh elemen yang dipisahkan koma yang dikelilingi oleh()
(misalnya('a','b','c')
).- Spasi tidak penting, mis
('a', 'b', 'c' )
. Tidak apa-apa. - Anda tidak dapat memiliki koma sebelum braket penutup. Perhatikan bahwa ini sengaja berbeda dari aturan sintaksis Python untuk membuat segalanya lebih mudah bagi sebagian besar bahasa, dan juga untuk membuatnya lebih sulit untuk hanya membangun daftar / tuple dengan Python kemudian mengeluarkannya, karena bagaimana tupel elemen tunggal direpresentasikan (untuk ini tantangan, kita perlu
('a')
sebagai lawan('a',)
).
Contohnya
Teks di atas mungkin tampak menakutkan, tetapi contoh-contoh berikut seharusnya membuat segalanya lebih jelas.
(l.
Output yang mungkin: []
(t.
Output yang mungkin: ()
(S'hello world'
l.
Output yang mungkin: ['hello world']
(S'string one'
S'string two'
S'string three'
t.
Output yang mungkin: ('string one', 'string two', 'string three')
(S'a'
(S'b'
S'c'
lt.
Output yang mungkin: ('a',['b','c'])
((S'a'
S'b'
(lS'c'
t(S'd'
tl.
Output yang mungkin: [('a', 'b', [], 'c'), ('d')]
((S'a'
((S'b'
t(S'c'
lS'd'
(((ltlS'e'
S'f'
lS'g'
tl.
Output yang mungkin: [('a',[('b'),['c'],'d',[([])],'e','f'],'g')]
Aturan
- Ini adalah kode-golf , jadi kode dalam byte paling sedikit menang.
- Fungsionalitas apa pun yang dirancang untuk bekerja dengan acar Python tidak diizinkan.
Catatan keamanan: Dalam kode sungguhan, hanya lepaskan dari sumber yang Anda percayai, atau Anda akan mendapat cos\nsystem\n(S'rm -rf'\ntR.
kejutan yang tidak menyenangkan
sumber
S'abc'\n
mendorongabc
atau'abc'
?Jawaban:
CJam, 63
Cobalah online
Penjelasan:
Sekarang string panjang dengan berbagai potongan kode. Setiap bagian memiliki beberapa karakter untuk diperiksa dan kemudian blok untuk menangani masing-masing, dan kasus default.
Bagian pertama:
Slt 1:T;L ]',*'[\+']+ ]',*'(\+')+ [
Bagian kedua:
(newline) 0:T; C+
sumber
Perl, 149 byte
Saya mempunyai firasat buruk bahwa ini adalah upaya yang buruk, tetapi begini:
Script harus disimpan dalam file dan dibutuhkan input dari STDIN.
Penjelasan:
sumber
> <>, 88 byte
Bersenang-senang dengan lompatan! Menggunakan fakta bahwa kode ASCII untuk 5 perintah utama yang terlibat, mod 9, adalah:
Ini memungkinkan setiap operasi ditangani pada jalurnya sendiri, yang akan dilompati secara langsung. Juga menggunakan tumpukan tumpukan untuk membangun setiap string dan membuat daftar / tuple secara terpisah sebelum membungkusnya dengan karakter yang diperlukan.
sumber
JavaScript (ES6), 199 byte
Menjalankan beberapa regex menggantikan input untuk mengubahnya menjadi kode JS yang valid, lalu mem-parsing itu.
Cuplikan Tes
sumber
Julia + ParserCombinator.jl
306240Dengan set revisi terbaru saya, saya tidak lagi berpikir solusi julia murni akan lebih pendek.
Itu menarik. Saya pikir kode ini cukup fasih.
a
l
,i
,t
, Dans
pada dasarnya CFG aturanf
adalah fungsi yang disebut menyatukan semuanya.Drop(Equal("'\n"))
menjengkelkan - yang akan idealnya ditulis sebagaiE"\n"
tetapiE
makro string tidak menangani escape sequence.|>
s dan menambahkantuple
untukt
aturansumber