Oto kilka przykładowych danych wejściowych, dzięki czemu mogę wyjaśnić, na czym polega problem:
((1 2)(3 (4 5) moo)) (i (lik(cherries)e (woohoo)))
Pomyśl o tym wierszu tekstu jako mapie topograficznej niektórych gór. Każdy zestaw nawiasów ilustruje jedną jednostkę wysokości.
Jeśli „zobaczymy” to z boku, aby zobaczyć góry pionowo, zobaczymy:
4 5 cherries woohoo
1 2 3 moo lik e
i
Biorąc pod uwagę jedną z tych map topograficznych, wypisz mapę, ale w skali pionowej, podobnie jak powyżej. Oddziel poszczególne elementy na mapie liczbą znaków do następnego elementu. Na przykład są 4 spacje na wyjściu między moo
i i
. Podobnie, na wejściu między moo
i znajdują się 4 znaki i
.
Wygrywa kod, który robi to w najmniejszej liczbie znaków.
code-golf
string
balanced-string
beary605
źródło
źródło
((1 2))))))))))3
powinny być niepoprawne, jeśli zabronione są wysokości ujemne.Odpowiedzi:
J,
87797270675756 znakówPobiera dane z klawiatury. Przykład:
Wyjaśnienie:
To wyjaśnienie oparte jest na pierwszej wersji mojego programu:
x=.1!:1[1
weź dane z klawiatury i włóż je nax
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ściuhello
to dotyczyh
,he
,hel
,hell
, ihello
. 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:((' '$~{.@]),[{~{:@])"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 spacjamix
). 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:Następnie transponuję tablicę
|:
i odwracam ją,|.
aby uzyskać pożądany wynik.źródło
GolfScript
69Demo online tutaj .
Wyjaśnienie:
źródło
APL (59)
Założyłem, że „baza” również musi być użyteczna. (tzn.
(a(b))c(d)
jest ważny). Jeśli nie jest to konieczne, można zapisać dwa znaki.Wyjaśnienie:
T←⍞
: zapisz wiersz wprowadzania w T'()'∘=¨T
: dla każdego znaku w T sprawdź, czy jest to nawias otwierający czy zamykający. To daje listę list boolean.1 ¯1∘ר
: pomnóż drugi element na każdej z tych list przez -1 (więc nawias otwierający to 1, zamykający to -1, a każdy inny znak to 0).+/¨
: weź sumę każdej wewnętrznej listy. Mamy teraz wartość dla każdej postaci.P←
: przechowywać w P.R←1++\P
: weź bieżącą sumę P, podając wysokość każdej postaci. Dodaj po jednym do każdego znaku, aby znaki poza nawiasami znajdowały się w pierwszym wierszu.(⍴T)∘⍴¨⍳⌈/R
: dla każdej możliwej wartości y utwórz listę o długości T, składającą się tylko z tej wartości. (tj. 1111 ..., 2222 .... itd.)R∘=¨
: dla każdego elementu na tej liście sprawdź, czy jest on równy R. (Dla każdego poziomu mamy teraz listę zer i jedynek odpowiadających temu, czy postać powinna pojawiać się na tym poziomie).⍵×P=0
: dla każdej z tych list ustaw ją na zero, jeśli P nie jest zero w tym miejscu. Pozbywa się to znaków o niezerowej delcie y, dzięki czemu pozbywamy się nawiasów.⊃,/T\¨⍨
: dla każdej głębokości wybierz z T znaki, które powinny się pojawić.⊖↑
: utwórz matrycę i umieść ją prawą stroną do góry.źródło
Tcl, 50
Niby oszukiwanie, ale cóż ...
Używam sekwencji ucieczki ascii, aby uzyskać różnicę linii,
^[[A
oznacza przesunięcie kursora o 1 linię w górę,^[[B
przesunięcie kursora o 1 linię w dół.źródło
APL, 41 znaków / bajtów *
Testowane na Dyalog, z a
⎕IO←1
i⎕ML←3
środowiskiem . Jest to funkcja, która pobiera wymagane dane wejściowe i zwraca dane wyjściowe. Biorąc pod uwagę treść pytania, uważam, że jest to do przyjęcia. Jeśli tak nie jest, oto wersja, która czyta ze standardowego wejścia i zapisuje na standardowe wyjście, dla 4 znaków więcej:Objaśnienie :
Przykłady:
*: APL można zapisać w różnych starszych, jednobajtowych zestawach znaków, które odwzorowują symbole APL na górne 128 bajtów. Dlatego do celów gry w golfa program, który używa tylko znaków ASCII i symboli APL, może być oceniany jako znaki = bajty.
źródło
⍨
symbolu. To wygląda jak kombinacja znaków¨
i~
?~
i¨
, chociaż jest to inna postać od obu. To operator o nazwie Commute . W swojej formie diadycznej to trzepie argumenty funkcji diadycznej to zastosowanie do:(5-2)=(2-⍨5)
. Jako operator monadycznej okazuje się dwójkowym funkcję w monadycznego, powielanie odpowiedniego argumentu(2*2)=(*⍨2)
. Najczęściej służy do pisania nieprzerwanego strumienia funkcji od prawej do lewej, bez konieczności umieszczania nawiasów wokół dużych wyrażeń i przeskakiwania wokół nich. W golfa jest to przydatne, ponieważ3*⍨1-2
jest o jeden char mniej niż(1-2)*3
:-)~
w J wtedy.J, 56 znaków
Kolejny 56-znakowy rozwiązanie J ... liczę głębokość tłumacząc
(
się ⁻1,)
do 1 i wszystkie inne znaki na 0, a następnie biorąc działa sumę to:[: +/\ 1 _1 0 {~ '()'&i.
. Reszta jest w dużej mierze podobna do rozwiązania @ Gareth.źródło
Python, 161 znaków
źródło
Python, 130
źródło
Rubinowy 1.9 (129)
Czyta ze standardowego.
źródło
//
do''
której zlicza postać taka sama i pozwala uniknąć błędów w wyróżnienia.C, 132 znaki
W opisie nie określono, ile danych wejściowych musi zaakceptować przesłanie, aby zostać zaakceptowanym, więc zdecydowałem się na limity, które były najbardziej zgodne z moimi potrzebami golfowymi (wciąż pracując z jednym podanym przykładem). Pozwólcie, że skorzystam z okazji, aby przypomnieć ludziom, że często dobrym pomysłem jest określenie minimów maksymalnych w opisach wyzwań.
W kodzie są dwie główne pętle. Pierwsza pętla farmuje wszystkie znaki niepozostawiające nawiasów w odpowiednim wierszu danych wyjściowych, a druga drukuje każdą linię.
źródło
C, 149 znaków
uruchom z cytowanym arg, np. „((1 2) (3 (4 5) moo)) (i (lik (wiśnie) e (woohoo)))”
źródło
Oktawa, 128
Bardzo podobny do mojej ostatniej odpowiedzi ...
Test
Wkład:
"((1 2)(3 (4 5) moo)) (i (lik(cherries)e (woohoo)))"
Wydajność:
źródło
C #, 229 bajtów
Jeśli nie ma żadnych ograniczeń dotyczących wiodącej przestrzeni pionowej, możesz użyć tego (wcięcie dla przejrzystości.) Inicjuje kursor w dół o jedną linię dla każdego
(
znalezionego przed drukowaniem, a następnie przesuwa kursor w górę i w dół podczas odczytywania nawiasów.źródło
PowerShell ,
120119 bajtówWypróbuj online!
Efekty uboczne: Znaki
&
i'
zmiany wysokości jak(
i)
, ale wyświetla. Porównaj wyniki dla:Mniej golfa:
źródło
VB.net (dla S&G)
Nie najładniejszy kod.
źródło