Pyramid Scheme là một ngôn ngữ đang được phát triển bởi @ ConorO'Brien . Trong sơ đồ Kim tự tháp, mã mà bạn viết trông như thế này:
^ ^
/ \ /3\
/ \ ---
/ + \
^-------^
/9\ /3\
/123\ ---
-----
Bây giờ, mã đó có hai phẩm chất rõ ràng: khó phân tích và khó viết. Conor đã giải quyết vấn đề thứ nhất, tuy nhiên công việc của bạn là giải quyết vấn đề thứ hai đó.
Đoạn mã trên được trình thông dịch PyramidScheme xử lý thành một chuỗi chuỗi lồng nhau, như sau:
[["+", ["9123", "3"]], "3"]
Nhiệm vụ của bạn là viết một chương trình hoặc hàm, đưa ra một chuỗi các chuỗi lồng nhau, xuất ra hoặc trả về mã PyramidScheme được tạo lại. Bạn có thể cho rằng mảng đầu vào sẽ luôn hợp lệ.
Một hình chóp là một tam giác cân. Phía trên là ^
, các cạnh dốc theo đường chéo với /
và \
, và phía dưới là -
. Hai góc dưới cùng trống hoặc chứa phần bắt đầu của các kim tự tháp khác, là đối số. Phần giữa chứa đầy tên của kim tự tháp, bỏ qua các ngắt dòng.
Dưới đây là cách trình phân tích cú pháp chuyển đổi mã thành định dạng có thể sử dụng. Đầu tiên, nó quét một kim tự tháp cấp cao nhất. Nếu nó không có đối số, nó đại diện cho nó bằng một chuỗi duy nhất và tiếp tục. Mặt khác, nó đại diện là một mảng ["name",[arg1,arg2]]
hoặc ["name",[arg1]]
. Các đối số là các kim tự tháp ở dưới cùng bên trái và dưới cùng bên phải của kim tự tháp, có thể là chuỗi hoặc nhiều mảng được mô tả như trên. Bạn có thể nhận thấy rằng điều này hơi giống với Lisp, trong trường hợp đó bạn cũng có thể nhận thấy cách chơi chữ khủng khiếp đó là tên ngôn ngữ. Sau khi kim tự tháp được thể hiện đầy đủ, trình phân tích cú pháp chuyển sang cái tiếp theo.
Đây là mã golf , mã thắng ngắn nhất!
Các trường hợp kiểm tra: Đây không phải là đầu ra hợp lệ duy nhất, đây là những ví dụ về đầu ra hợp lệ.
[["+", ["9123", "3"]], "3"]
^ ^
/ \ /3\
/ \ ---
/ + \
^-------^
/9\ /3\
/123\ ---
-----
[["out", [["chr", ["72"]], ["chr", ["101"]]]], ["out", [["chr", ["108"]]]], ["out", [["chr", ["108"]]]], ["out", [["chr", ["111"]]]]]
^ ^ ^ ^
/ \ / \ / \ / \
/out\ /out\ /out\ /out\
^-----^ -----^----- -----^
/ \ / \ / \ / \
/chr\ /chr\ /chr\ /chr\
^----- -----^ -----^ ^-----
/ \ / \ / \ / \
/72 \ /101\ /108\ /111\
----- ----- ----- -----
[ ["+", [ ["asdfghjkl"], ["do", [ "1" ]] ]] ]
^
/ \
/ + \
/ \
^-------^
/a\ /d\
/sdf\ /o \
/ghjkl\ ^-----
-------/1\
---
Lưu ý trong trường hợp thử nghiệm thứ hai, out
cả kim tự tháp thứ hai và thứ ba đều có ["chr", ["108"]]
một tham số, được thu gọn thành một ngăn xếp kim tự tháp được chia sẻ bởi hai kim tự tháp cấp cao nhất. Đây là một tối ưu hóa hợp lệ mà mã của bạn có thể hỗ trợ, nhưng nó hoàn toàn không bắt buộc; chấm điểm không dựa trên độ dài của đầu ra của bạn.
Đối với người tò mò, trường hợp đầu tiên hiển thị 9126 3
do in ngầm các kim tự tháp toplevel, trường hợp thứ hai in Hello
và trường hợp cuối cùng là lỗi cú pháp, bao gồm chỉ vì nó có cấu trúc gọn gàng.
Bạn có thể giả định rằng đầu vào chỉ chứa ASCII in được, không bao gồm khoảng trắng, ^
, /
, \
, và -
. Đầu vào sẽ luôn hợp lệ và chứa ít nhất một kim tự tháp. Không có giới hạn về kích thước của mảng hoặc chuỗi đầu vào, tuy nhiên bạn có thể viết mã của mình như thể loại số nguyên mặc định của ngôn ngữ của bạn là chính xác vô hạn và máy tính của bạn có bộ nhớ tùy ý. Nếu lấy đầu vào dưới dạng một chuỗi, bạn có thể sử dụng bất cứ thứ gì hợp lý (dấu phẩy, dấu cách, v.v ... miễn là nó có thể in ascii và không "
hoặc []
) để phân định mảng. Bạn không phải bao gồm các dấu ngoặc bao quanh toàn bộ, và thay vào đó lấy nhiều mảng được phân tách bằng dấu phân cách của bạn.
Đầu ra của bạn không cần phải đánh gôn, bạn có thể chèn thêm không gian hoặc làm cho kim tự tháp của bạn lớn hơn mức cần thiết. Kim tự tháp Toplevel nên ở dòng đầu tiên. Đầu ra phải là một chuỗi có dòng mới hoặc danh sách các chuỗi.
Bất cứ ai không bao gồm một phiên bản của mã của họ mà tối ưu Tất chơi gôn các kim tự tháp có thể nhận được một số đại diện theo hình thức upvotes / bounties (nhưng có lẽ chỉ upvotes).