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[1
lấy đầu vào từ bàn phím và đặt nó vào x
sau
(('('&([:+/=)-')'&([:+/=))\,.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 hello
nó 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))))))))))3
không hợp lệ nếu độ cao âm bị cấm.