J, 87 79 72 70 67 57 56 Zeichen
'( ) 'charsub|.|:(+/\@('('&=-')'&=)(],~' '$~[)"0])1!:1[1
Übernimmt Eingaben von der Tastatur. Beispiel:
'( ) '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
Erläuterung:
Diese Erklärung basiert auf der ersten Version meines Programms:
|.|:('( ) 'charsub x)((' '$~{.@]),[{~{:@])"1(('('&([:+/=)-')'&([:+/=))\,.i.@#)x=.1!:1[1
x=.1!:1[1
Eingaben von der Tastatur nehmen und x
für später speichern
(('('&([:+/=)-')'&([:+/=))\,.i.@#)
Erstellt eine Liste aller Indices in der Zeichenfolge ( i.@#
) und setzt ,.
sie zusammen mit dem Ergebnis des (('('&([:+/=)-')'&([:+/=))\
Verbs zusammen ( ) .
(('('&([:+/=)-')'&([:+/=))\
Dieses Verb wird auf alle Präfixe der Zeichenfolge angewendet (so bei Eingabe hello
wäre es gelten h
, he
, hel
, hell
, und hello
. Es ist eine Gabel , die die Anzahl der offenen Klammern zählt ('('&([:+/=)
und subtrahiert dann die Anzahl der Klammer zu ')'&([:+/=)
. Das gibt mir die Liste von Indices in die Zeichenfolge und die Ebene, auf der sich das Zeichen an diesem Index in der Ausgabe befinden soll. Bei einfacher Eingabe ergibt sich Folgendes:
(('('&([:+/=)-')'&([:+/=))\,.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
Dies ist ein Verb, das die Liste, die ich gerade erstellt habe, und auch die Ausgabe von aufnimmt ('( ) 'charsub x)
(wobei nur ein String ersetzt wird, um alle Klammern durch Leerzeichen in zu ersetzen x
). Es nimmt das Ende jedes Elements der Liste {:@]
und verwendet es als Index in der Zeichenfolge, um das Zeichen abzurufen [{~{:@]
. Dann wird ihm ,
die Anzahl der Leerzeichen vorangestellt, die durch den Kopf jedes Elements in der Liste angegeben sind (' '$~{.@])
. Auf dem vorherigen Beispiel gibt mir das:
('( ) 'charsub x)((' '$~{.@]),[{~{:@])"1(('('&([:+/=)-')'&([:+/=))\,.i.@#)x=.1!:1[1
(one(two(three)))
o
n
e
t
w
o
t
h
r
e
e
Ich transponiere dann das Array |:
und kehre es |.
um, um die gewünschte Ausgabe zu erhalten.
((1 2))))))))))3
ungültig sein, wenn negative Höhen verboten sind.