J, 87 79 72 70 67 57 56 znaków
'( ) 'charsub|.|:(+/\@('('&=-')'&=)(],~' '$~[)"0])1!:1[1
Pobiera dane z klawiatury. Przykład:
'( ) '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
Wyjaśnienie:
To wyjaśnienie oparte jest na pierwszej wersji mojego programu:
|.|:('( ) 'charsub x)((' '$~{.@]),[{~{:@])"1(('('&([:+/=)-')'&([:+/=))\,.i.@#)x=.1!:1[1
x=.1!:1[1
weź dane z klawiatury i włóż je na x
później
(('('&([:+/=)-')'&([:+/=))\,.i.@#)
tworzy listę wszystkich indeków w string ( i.@#
) i scitches ( ,.
) wraz z wynikiem (('('&([:+/=)-')'&([:+/=))\
czasownika.
(('('&([:+/=)-')'&([:+/=))\
Ten czasownik jest stosowana do wszystkich prefiksów napisu (tak na wejściu hello
to dotyczy h
, he
, hel
, hell
, i hello
. Jest to widelec , który zlicza liczbę otwartych nawiasie ('('&([:+/=)
, a następnie odejmuje liczby bliskich nawiasach ')'&([:+/=)
. To daje mi listy indeces do łańcucha i poziom, na którym znak w tym indeksie powinien znajdować się na wyjściu. Po prostym wprowadzeniu daje mi to:
(('('&([:+/=)-')'&([:+/=))\,.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
jest to czasownik, który pobiera listę, którą właśnie wygenerowałem, a także dane wyjściowe ('( ) 'charsub x)
(które zastępuje ciąg znaków, aby zastąpić wszystkie nawiasy spacjami x
). Bierze ogon każdego elementu listy {:@]
i używa go jako indeksu w ciągu, aby uzyskać znak [{~{:@]
. Następnie poprzedza ją ,
liczbą spacji wskazaną przez nagłówek każdego elementu na liście (' '$~{.@])
. W poprzednim przykładzie daje mi to:
('( ) 'charsub x)((' '$~{.@]),[{~{:@])"1(('('&([:+/=)-')'&([:+/=))\,.i.@#)x=.1!:1[1
(one(two(three)))
o
n
e
t
w
o
t
h
r
e
e
Następnie transponuję tablicę |:
i odwracam ją, |.
aby uzyskać pożądany wynik.
((1 2))))))))))3
powinny być niepoprawne, jeśli zabronione są wysokości ujemne.