J, 87 79 72 70 67 57 56 caratteri
'( ) 'charsub|.|:(+/\@('('&=-')'&=)(],~' '$~[)"0])1!:1[1
Riceve input dalla tastiera. Esempio:
'( ) '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
Spiegazione:
Questa spiegazione si basa sulla prima versione del mio programma:
|.|:('( ) 'charsub x)((' '$~{.@]),[{~{:@])"1(('('&([:+/=)-')'&([:+/=))\,.i.@#)x=.1!:1[1
x=.1!:1[1
Prendi l'input dalla tastiera e inseriscilo x
per dopo
(('('&([:+/=)-')'&([:+/=))\,.i.@#)
crea un elenco di tutti gli indici nella stringa ( i.@#
) e lo ricama ( ,.
) insieme al risultato del (('('&([:+/=)-')'&([:+/=))\
verbo.
(('('&([:+/=)-')'&([:+/=))\
questo verbo viene applicato a tutti i prefissi della stringa (così via di ingresso hello
che si applicherebbe a h
, he
, hel
, hell
, e hello
. Si tratta di una forchetta , che conta il numero di parentesi aperte ('('&([:+/=)
e quindi sottrae il numero di staffe stretti ')'&([:+/=)
. Questo mi dà la lista di indeci nella stringa e il livello in cui dovrebbe trovarsi il carattere di quell'indice nell'output. Con un input semplice questo mi dà quanto segue:
(('('&([:+/=)-')'&([:+/=))\,.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
questo è un verbo che prende l'elenco che ho appena generato e anche l'output di ('( ) 'charsub x)
(che fa solo una sostituzione di stringa per sostituire tutte le parentesi con spazi in x
). Prende la coda di ogni elemento dell'elenco {:@]
e lo usa come indice nella stringa per ottenere il carattere [{~{:@]
. Quindi lo prefigura ,
con il numero di spazi come indicato dalla testa di ciascun elemento nell'elenco (' '$~{.@])
. Nell'esempio precedente questo mi dà:
('( ) 'charsub x)((' '$~{.@]),[{~{:@])"1(('('&([:+/=)-')'&([:+/=))\,.i.@#)x=.1!:1[1
(one(two(three)))
o
n
e
t
w
o
t
h
r
e
e
Traspongo quindi l'array |:
e lo inverto |.
per ottenere l'output desiderato.
((1 2))))))))))3
deve essere non valido se sono proibite altezze negative.