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[1
prendre l'entrée du clavier et la mettre x
pour 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 hello
s'appliquerait à h
, he
, hel
, hell
et 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
((' '$~{.@]),[{~{:@])"1
c'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))))))))))3
doit être invalide si les hauteurs négatives sont interdites.