J, 87 79 72 70 67 57 56 символов
'( ) 'charsub|.|:(+/\@('('&=-')'&=)(],~' '$~[)"0])1!:1[1
Берет ввод с клавиатуры. Пример:
'( ) '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
Объяснение:
Это объяснение основано на первой версии моей программы:
|.|:('( ) 'charsub x)((' '$~{.@]),[{~{:@])"1(('('&([:+/=)-')'&([:+/=))\,.i.@#)x=.1!:1[1
x=.1!:1[1
взять ввод с клавиатуры и положить его на x
потом
(('('&([:+/=)-')'&([:+/=))\,.i.@#)
создает список всех индексов в string ( i.@#
) и stitches ( ,.
) вместе с результатом (('('&([:+/=)-')'&([:+/=))\
глагола.
(('('&([:+/=)-')'&([:+/=))\
этот глагол применяется ко всем префиксам строки (так на входе hello
было бы применить к h
, he
, hel
, hell
, и hello
. Он представляет собой вилку , которая подсчитывает количество открытых скобок , ('('&([:+/=)
а затем вычитает число близких скобок ')'&([:+/=)
. Это дает мне список of Indends в строку и уровень, на котором должен находиться символ с этим индексом в выходных данных. При простом вводе это дает мне следующее:
(('('&([:+/=)-')'&([:+/=))\,.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
это глагол, который берет список, который я только что сгенерировал, а также вывод ('( ) 'charsub x)
(который просто заменяет строку, заменяя все скобки пробелами внутри x
). Он берет хвост каждого элемента списка {:@]
и использует его как индекс в строке, чтобы получить символ [{~{:@]
. Затем к нему добавляется ,
число пробелов, указанное в заголовке каждого элемента в списке (' '$~{.@])
. На предыдущем примере это дает мне:
('( ) 'charsub x)((' '$~{.@]),[{~{:@])"1(('('&([:+/=)-')'&([:+/=))\,.i.@#)x=.1!:1[1
(one(two(three)))
o
n
e
t
w
o
t
h
r
e
e
Затем я переставляю массив |:
и обращаюсь к нему, |.
чтобы получить желаемый результат.
((1 2))))))))))3
должен быть недействительным, если запрещены отрицательные высоты.