J, 87 79 72 70 67 57 56 ký tự
'( ) 'charsub|.|:(+/\@('('&=-')'&=)(],~' '$~[)"0])1!:1[1
Lấy đầu vào từ bàn phím. Thí dụ:
'( ) 'charsub|.|:(+/\@('('&=-')'&=)(],~' '$~[)"0])1!:1[1
((1 2)(3 (4 5) moo)) (i (lik(cherries)e (woohoo)))
4 5 cherries woohoo
1 2 3 moo lik e
i
Giải trình:
Giải thích này dựa trên phiên bản đầu tiên của chương trình của tôi:
|.|:('( ) 'charsub x)((' '$~{.@]),[{~{:@])"1(('('&([:+/=)-')'&([:+/=))\,.i.@#)x=.1!:1[1
x=.1!:1[1lấy đầu vào từ bàn phím và đặt nó vào xsau
(('('&([:+/=)-')'&([:+/=))\,.i.@#)tạo một danh sách tất cả các phân vào chuỗi ( i.@#) và khâu ( ,.) nó cùng với kết quả của (('('&([:+/=)-')'&([:+/=))\động từ.
(('('&([:+/=)-')'&([:+/=))\động từ này được áp dụng cho tất cả các tiền tố của chuỗi (để trên đầu vào hellonó sẽ áp dụng cho h, he, hel, hell, và hello. Nó là một ngã ba , mà đếm số dấu ngoặc mở ('('&([:+/=)và sau đó trừ đi số lượng khung gần ')'&([:+/=). Điều này cho phép tôi danh sách của các phân vào chuỗi và mức ký tự ở chỉ mục đó sẽ ở đầu ra. Trên đầu vào đơn giản, điều này cho tôi như sau:
(('('&([:+/=)-')'&([:+/=))\,.i.@#)x=.1!:1[1
(one(two(three)))
1 0
1 1
1 2
1 3
2 4
2 5
2 6
2 7
3 8
3 9
3 10
3 11
3 12
3 13
2 14
1 15
0 16
((' '$~{.@]),[{~{:@])"1đây là một động từ lấy danh sách tôi vừa tạo và cũng là đầu ra của ('( ) 'charsub x)(chỉ thực hiện thay thế chuỗi để thay thế tất cả các dấu ngoặc có khoảng trắng trong x). Nó lấy đuôi của từng mục trong danh sách {:@]và sử dụng nó làm chỉ mục vào chuỗi để lấy ký tự [{~{:@]. Sau đó, nó đặt tiền tố ,với số lượng khoảng trắng được chỉ định bởi phần đầu của mỗi mục trong danh sách (' '$~{.@]). Trong ví dụ trước, điều này mang lại cho tôi:
('( ) 'charsub x)((' '$~{.@]),[{~{:@])"1(('('&([:+/=)-')'&([:+/=))\,.i.@#)x=.1!:1[1
(one(two(three)))
o
n
e
t
w
o
t
h
r
e
e
Sau đó tôi chuyển mảng |:và đảo ngược nó |.để có được đầu ra mong muốn.
((1 2))))))))))3không hợp lệ nếu độ cao âm bị cấm.