Mô-đun dưa chua của Python được sử dụng để tuần tự hóa, cho phép người ta kết xuất một đối tượng theo cách mà sau đó nó có thể được xây dựng lại. Đối với điều này, dưa chua sử dụng một ngôn ngữ dựa trên ngăn xếp đơn giản.
Để đơn giản, chúng ta sẽ xử lý một tập hợp nhỏ của ngôn ngữ này:
( 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
Nhiệm vụ của bạn là thực hiện tập hợp con này của ngôn ngữ. Lưu ý rằng đó \n
là một dòng mới theo nghĩa đen ở đây và dòng mới thực sự quan trọng đối với ngôn ngữ.
Đối với những người quen thuộc với các ngôn ngữ giống GolfScript hoặc CJam, (
và l/t
hoạt động tương tự [
và ]
tương ứng.
Đầu vào
Để giữ cho mọi thứ đơn giản, đầu vào sẽ luôn luôn hợp lệ. Cụ thể, bạn có thể giả sử như sau về đầu vào:
- Chuỗi sẽ chỉ bao gồm các chữ cái thường và dấu cách
[a-z ]
và sẽ luôn sử dụng các dấu ngoặc đơn. - Sẽ không có ký tự không liên quan, với tất cả các hướng dẫn được chỉ định ở trên. Ví dụ, điều này có nghĩa là các dòng mới sẽ chỉ xảy ra sau chuỗi.
- Mỗi cái
l/t
có một cái khớp(
trước nó và cái nào(
cũng có cái khớpl/t
sau nó. Cũng sẽ có ít nhất một(
. - Sẽ có chính xác một
.
, và nó sẽ luôn là nhân vật cuối cùng.
Bạn có thể nhận đầu vào thông qua dòng lệnh, STDIN hoặc đối số hàm. Bạn có thể sử dụng một chuỗi thoát dòng mới thay vì chuỗi đa dòng nếu bạn muốn, nhưng vui lòng chỉ định điều này trong câu trả lời của bạn.
Đầu ra
Đầu ra phải là một đại diện của đối tượng cuối cùng, được in thành STDOUT hoặc được trả về dưới dạng chuỗi . Đặc biệt:
Chuỗi được thể hiện bằng cách mở và đóng dấu ngoặc đơn với nội dung ở giữa, ví dụ
S'abc' -> 'abc'
. Bạn không được sử dụng dấu ngoặc kép cho thử thách này, mặc dù chúng được cho phép trong Python.Danh sách được biểu thị bằng các phần tử được phân tách bằng dấu phẩy được bao quanh bởi
[]
(ví dụ['a','b','c']
), trong khi các bộ dữ liệu được lặp lại bởi các phần tử được phân tách bằng dấu phẩy được bao quanh bởi()
(ví dụ('a','b','c')
).- Không gian không quan trọng, ví dụ
('a', 'b', 'c' )
là ổn. - Bạn không thể có dấu phẩy trước dấu ngoặc đóng. Lưu ý rằng điều này có chủ ý khác với quy tắc cú pháp của Python để làm cho mọi thứ dễ dàng hơn đối với hầu hết các ngôn ngữ và cũng khiến cho việc xây dựng danh sách / tuple trong Python trở nên khó khăn hơn, do cách trình bày bộ phần tử đơn lẻ (đối với điều này thách thức, chúng ta cần
('a')
trái ngược với('a',)
).
Ví dụ
Các văn bản trên có vẻ khó xử, nhưng các ví dụ sau đây sẽ làm cho mọi thứ rõ ràng hơn một chút.
(l.
Sản lượng có thể: []
(t.
Sản lượng có thể: ()
(S'hello world'
l.
Sản lượng có thể: ['hello world']
(S'string one'
S'string two'
S'string three'
t.
Sản lượng có thể: ('string one', 'string two', 'string three')
(S'a'
(S'b'
S'c'
lt.
Sản lượng có thể: ('a',['b','c'])
((S'a'
S'b'
(lS'c'
t(S'd'
tl.
Sản lượng có thể: [('a', 'b', [], 'c'), ('d')]
((S'a'
((S'b'
t(S'c'
lS'd'
(((ltlS'e'
S'f'
lS'g'
tl.
Sản lượng có thể: [('a',[('b'),['c'],'d',[([])],'e','f'],'g')]
Quy tắc
- Đây là mã golf , vì vậy mã trong ít byte nhất sẽ thắng.
- Bất kỳ chức năng nào được thiết kế để hoạt động với dưa chua Python đều không được phép.
Lưu ý bảo mật: Trong mã thực, chỉ rút ra khỏi các nguồn bạn tin tưởng, nếu không bạn có thể nhận được một cos\nsystem\n(S'rm -rf'\ntR.
bất ngờ khó chịu
S'abc'\n
đẩyabc
hay'abc'
không?