Lý lịch
(Dựa trên một câu chuyện đau lòng có thật)
Vào thời của tôi, tôi thường chơi với Lisp và các ngôn ngữ tương tự thường xuyên. Tôi đã viết thư cho họ, điều hành họ, giải thích họ, thiết kế chúng và chế tạo máy viết cho họ ... Và nếu có một điều khiến tôi phiền lòng, thì đó là Lisp không tuân thủ phong cách định dạng cụ thể của tôi.
Thật không may, một số trình soạn thảo văn bản ( ho XCode ho ) có xu hướng loại bỏ các tab và khoảng trắng đẹp của tôi bất cứ khi nào mã được sao chép và dán ... Hãy sử dụng cú pháp giống Lisp đẹp mắt này:
(A
(B
(C)
(D))
(E))
(Trường hợp ABCDE
các hàm tùy ý)
MỘT SỐ trình soạn thảo văn bản bán mã đáng yêu này đến cuối:
(A
(B
(C)
(D))
(E))
Thật là một mớ hỗn độn! Điều đó không thể đọc được!
Giúp tôi ra, đây?
Các thách thức
Mục tiêu của bạn trong thử thách này là lấy một loạt các chức năng được phân tách bằng các dòng mới trong một định dạng được mô tả dưới đây và trả về một sự sắp xếp đẹp hơn làm nổi bật tính dễ đọc và sang trọng.
Đầu vào
Chúng tôi định nghĩa một hàm F
của các N
đối số arity là một cấu trúc tương tự như sau:
(F (G1 ...) (G2 ...) (G3 ...) ... (GN ...))
nơi G1, G2, ..., GN
đều là chức năng trong và của chính họ. 0
Hàm arity A
chỉ đơn giản (A)
, trong khi 2
hàm arity B
có dạng(B (...) (...))
Mã của bạn nên lấy đầu vào là một chuỗi các hàm với một dòng mới trước mỗi dấu ngoặc đơn hàng đầu của hàm (ngoại trừ hàm đầu tiên). Ví dụ trên là đầu vào hợp lệ.
Bạn có thể giả sử:
- Các dấu ngoặc đơn được cân bằng.
- Một chức năng sẽ không bao giờ phải được thụt lề quá 250 lần.
- MỌI chức năng được bao quanh bởi dấu ngoặc đơn:
()
- Tên của hàm sẽ chỉ chứa các ký tự ASCII có thể in được.
- Tên của hàm sẽ không bao giờ chứa dấu ngoặc đơn hoặc dấu cách.
- Có một dòng mới tùy chọn trên đầu vào.
Đầu ra
Mã của bạn sẽ xuất ra cùng một bộ hàm, trong đó những thay đổi duy nhất được thực hiện là bổ sung khoảng trắng hoặc tab trước dấu ngoặc đơn hàng đầu của hàm. Đầu ra phải tuân thủ các quy tắc sau:
- Hàm đầu tiên (và các hàm cấp cao nhất sau này) được cung cấp không có khoảng trắng trước
- Đối số cho vị trí nằm ngang của hàm là chính xác một tab ở bên phải vị trí ngang của hàm đó.
- Một tab được xác định theo thực hiện, nhưng phải có ít nhất 3 khoảng trắng.
- Bạn có thể tùy ý in tối đa hai khoảng trắng sau mỗi dòng.
Quy tắc
- Đây là code-golf: mã ngắn nhất sẽ thắng!
- Lỗ hổng tiêu chuẩn không được phép.
Ví dụ
Đầu vào:
(A
(B
(C)
(D))
(E))
Đầu ra:
(A
(B
(C)
(D))
(E))
Đầu vào:
(!@#$%^&*
(asdfghjklm
(this_string_is_particularly_long
(...))
(123456789)))
(THIS_IS_TOP_LEVEL_AGAIN
(HERE'S_AN_ARGUMENT))
Đầu ra:
(!@#$%^&*
(asdfghjklm
(this_string_is_particularly_long
(...))
(123456789)))
(THIS_IS_TOP_LEVEL_AGAIN
(HERE'S_AN_ARGUMENT))
Đầu vào:
(-:0
(*:0
(%:0
(Arg:6)
(Write:0
(Read:0
(Arg:30))
(Write:0
(Const:-6)
(Arg:10))))
(%:0
(Const:9)
(/:0
(Const:-13)
(%:0
(Arg:14)
(Arg:0)))))
(WriteArg:22
(-:0
(Const:45)
(?:0
(Arg:3)
(Arg:22)
(Arg:0)))))
Đầu ra:
(-:0
(*:0
(%:0
(Arg:6)
(Write:0
(Read:0
(Arg:30))
(Write:0
(Const:-6)
(Arg:10))))
(%:0
(Const:9)
(/:0
(Const:-13)
(%:0
(Arg:14)
(Arg:0)))))
(WriteArg:22
(-:0
(Const:45)
(?:0
(Arg:3)
(Arg:22)
(Arg:0)))))
()
sao?