J, 87 79 72 70 67 57 56 caractères
'( ) 'charsub|.|:(+/\@('('&=-')'&=)(],~' '$~[)"0])1!:1[1
Prend l'entrée du clavier. Exemple:
'( ) '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
Explication:
Cette explication est basée sur la première version de mon programme:
|.|:('( ) 'charsub x)((' '$~{.@]),[{~{:@])"1(('('&([:+/=)-')'&([:+/=))\,.i.@#)x=.1!:1[1
x=.1!:1[1prendre l'entrée du clavier et la mettre xpour plus tard
(('('&([:+/=)-')'&([:+/=))\,.i.@#)crée une liste de tous les indéces dans la chaîne ( i.@#) et la coud ( ,.) avec le résultat du (('('&([:+/=)-')'&([:+/=))\verbe.
(('('&([:+/=)-')'&([:+/=))\ce verbe est appliqué à tous les préfixes de la chaîne (donc sur l' entrée hellos'appliquerait à h, he, hel, hellet hello. Il est une fourchette , qui compte le nombre de supports ouverts ('('&([:+/=)et soustrait alors le nombre de crochets proches ')'&([:+/=). Cela me donne la liste d'indéces dans la chaîne et le niveau auquel le caractère à cet index doit être dans la sortie. Sur une entrée simple, cela me donne ce qui suit:
(('('&([:+/=)-')'&([:+/=))\,.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
((' '$~{.@]),[{~{:@])"1c'est un verbe qui prend la liste que je viens de générer et aussi la sortie de ('( ) 'charsub x)(qui fait juste un remplacement de chaîne pour remplacer tous les crochets par des espaces x). Il prend la queue de chaque élément de la liste {:@]et l'utilise comme index dans la chaîne pour obtenir le caractère [{~{:@]. Il le préfixe ensuite ,avec le nombre d'espaces indiqué par le titre de chaque élément de la liste (' '$~{.@]). Dans l'exemple précédent, cela me donne:
('( ) 'charsub x)((' '$~{.@]),[{~{:@])"1(('('&([:+/=)-')'&([:+/=))\,.i.@#)x=.1!:1[1
(one(two(three)))
o
n
e
t
w
o
t
h
r
e
e
Je transpose ensuite le tableau |:et l'inverse |.pour obtenir la sortie souhaitée.
((1 2))))))))))3doit être invalide si les hauteurs négatives sont interdites.