Rozważ niepusty ciąg poprawnie zrównoważonych nawiasów:
(()(()())()((())))(())
Możemy sobie wyobrazić, że każda para nawiasów reprezentuje pierścień w zwiniętej konstrukcji teleskopowej . Rozszerzmy więc teleskop:
( )( )
()( )()( ) ()
()() ( )
()
Innym sposobem na to jest to, że nawiasy na głębokości n są przenoszone do linii n , przy jednoczesnym zachowaniu ich pozycji poziomej.
Twoim zadaniem jest wziąć taki ciąg zrównoważonych nawiasów i stworzyć rozszerzoną wersję.
Możesz napisać program lub funkcję, pobierając dane wejściowe przez STDIN (lub najbliższy odpowiednik), argument wiersza poleceń lub parametr funkcji i generując dane wyjściowe przez STDOUT (lub najbliższy odpowiednik), wartość zwracaną lub parametr funkcji (wyjściowej).
Możesz założyć, że łańcuch wejściowy jest prawidłowy, tzn. Składa się tylko z nawiasów, które są odpowiednio zrównoważone.
Możesz drukować końcowe spacje w każdej linii, ale nie więcej spacji wiodących niż to konieczne. Łącznie wiersze nie mogą być dłuższe niż dwukrotność długości ciągu wejściowego. Możesz opcjonalnie wydrukować jedną końcową linię nowego wiersza.
Przykłady
Oprócz powyższego przykładu, oto jeszcze kilka przypadków testowych (wejście i wyjście są oddzielone pustą linią).
()
()
(((())))
( )
( )
( )
()
()(())((()))(())()
()( )( )( )()
() ( ) ()
()
((()())()(()(())()))
( )
( )()( )
()() ()( )()
()
Powiązane wyzwania:
- Ciągi topograficzne , które proszą cię o stworzenie tego, co jest zasadniczo uzupełnieniem wyników w tym wyzwaniu.
- Code Explanation Formatter , szerokie uogólnienie pomysłów w tym wyzwaniu, opublikowane niedawno przez PhiNotPi. (W rzeczywistości oryginalny opis PhiNotPi jego pomysłu był tym, co zainspirowało to wyzwanie).
Liderów
Huh, to miało dość duży udział, więc oto fragment kodu, który generuje zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.
Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:
# Language Name, N bytes
gdzie N
jest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:
# Ruby, <s>104</s> <s>101</s> 96 bytes
function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){$.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:true,success:function(e){answers.push.apply(answers,e.items);if(e.has_more)getAnswers();else process()}})}function shouldHaveHeading(e){var t=false;var n=e.body_markdown.split("\n");try{t|=/^#/.test(e.body_markdown);t|=["-","="].indexOf(n[1][0])>-1;t&=LANGUAGE_REG.test(e.body_markdown)}catch(r){}return t}function shouldHaveScore(e){var t=false;try{t|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(n){}return t}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading);answers.sort(function(e,t){var n=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0],r=+(t.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0];return n-r});var e={};var t=0,c=0,p=-1;answers.forEach(function(n){var r=n.body_markdown.split("\n")[0];var i=$("#answer-template").html();var s=r.match(NUMBER_REG)[0];var o=(r.match(SIZE_REG)||[0])[0];var u=r.match(LANGUAGE_REG)[1];var a=getAuthorName(n);t++;c=p==o?c:t;i=i.replace("{{PLACE}}",c+".").replace("{{NAME}}",a).replace("{{LANGUAGE}}",u).replace("{{SIZE}}",o).replace("{{LINK}}",n.share_link);i=$(i);p=o;$("#answers").append(i);e[u]=e[u]||{lang:u,user:a,size:o,link:n.share_link}});var n=[];for(var r in e)if(e.hasOwnProperty(r))n.push(e[r]);n.sort(function(e,t){if(e.lang>t.lang)return 1;if(e.lang<t.lang)return-1;return 0});for(var i=0;i<n.length;++i){var s=$("#language-template").html();var r=n[i];s=s.replace("{{LANGUAGE}}",r.lang).replace("{{NAME}}",r.user).replace("{{SIZE}}",r.size).replace("{{LINK}}",r.link);s=$(s);$("#languages").append(s)}}var QUESTION_ID=49042;var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/;var NUMBER_REG=/\d+/;var LANGUAGE_REG=/^#*\s*([^,]+)/
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src=https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js></script><link rel=stylesheet type=text/css href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"><div id=answer-list><h2>Leaderboard</h2><table class=answer-list><thead><tr><td></td><td>Author<td>Language<td>Size<tbody id=answers></table></div><div id=language-list><h2>Winners by Language</h2><table class=language-list><thead><tr><td>Language<td>User<td>Score<tbody id=languages></table></div><table style=display:none><tbody id=answer-template><tr><td>{{PLACE}}</td><td>{{NAME}}<td>{{LANGUAGE}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table><table style=display:none><tbody id=language-template><tr><td>{{LANGUAGE}}<td>{{NAME}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table>
Odpowiedzi:
CJam,
171615 bajtówPowyższe jest odwracalnym zrzutem xxd, ponieważ kod źródłowy zawiera niedrukowalne znaki VT (0x0b) i CSI (0x9b).
Podobnie jak ta odpowiedź , wykorzystuje sekwencje specjalne ANSI , ale używa także pionowych tabulatorów i drukuje znaki sterujące bezpośrednio, aby uniknąć używania printf .
Wymaga to obsługi terminalu tekstowego wideo, który obejmuje większość emulatorów terminali innych niż Windows.
Testowe uruchomienie
Musimy ustawić zmienną powłoki LANG i kodowanie emulatora terminala na ISO 8859-1. Ten pierwszy osiąga się przez wykonanie
Ponadto przed wykonaniem rzeczywistego kodu wyłączymy monit i wyczyścimy ekran.
Dzięki temu dane wyjściowe są wyświetlane poprawnie.
Aby przywrócić LANG i monit, wykonaj następujące czynności:
Jak to działa
Po każdym wstawiamy pionową zakładkę ( aby przesunąć kursor w dół i sekwencję bajtów 9b 41 (
"\x9bA"
) przed każdą ), aby przesunąć kursor w górę.źródło
kod maszynowy x86,
3934333029 bajtówMontaż x86 dla DOS, z kilkoma sztuczkami:
Ograniczenia :
cls
przed uruchomieniem jest niemal obowiązkowe;bh=0
a flaga kierunku wyczyść na początku, oba nieudokumentowane; OTOH,bx
jest wyraźnie ustawiony na zero we wszystkich wariantach DOS, które widziałem (DosBox, MS-DOS 2, FreeDOS) i wszędzie, gdzie testowałem, flagi były już OK.źródło
cld
?add
/sub
.lop
naloop
?nasm
rozróżnia międzyloop
etykietą aloop
instrukcją montażu, więc piszę tak,lop
jak wszyscy inni.J,
3228 bajtówTo było zabawne.
Wyjaśnienie
Oto jak działa to rozwiązanie, w tym wyjaśnienie, w jaki sposób zostało ono zagrane w golfa.
źródło
:')
C, 150 bajtów
To była szalona zabawa w golfa. Nadal nie jestem przekonany, że z tym skończyłem.
Definiujemy pojedynczą funkcję,
f
która pobiera ciąg jako dane wejściowe i wyjściowe na standardowe wyjście.Przejdźmy przez kod, linia po linii:
Odpowiem na wszelkie pytania!
Wypróbuj program testowy online !
źródło
f
,m
nie zresetuje się do 0. To liczy się jako „niszczenie środowiska”, tutaj zakazane .Retina + Bash, 27 bajtów (14 + 10 + 3 = 27)
Wykorzystuje to ucieczkę ANSI:
Odpowiednik
sed -e "s/(/(\\\e[B/g;s/)/\\\e[A)/g"
.\e[B
Kod Escape powoduje przesunięcie kursora na dół jeden rząd, i\e[A
środki przesunąć kursor o jeden wiersz, więc roztwór ten po prostu wkłada te kody przed i po początku i na końcu każdego pod-nawiasach. Dane wejściowe są przekazywane przez STDIN.Będziesz musiał to nazwać,
printf $(Retina ...)
aby poprawnie wyświetlić dane wyjściowe.Wynik
źródło
printf
, byłoby świetnie. W przeciwnym razie myślę, że dodanie| printf
do liczby bajtów byłoby sprawiedliwe .printf $()
lubprintf $(Retina )
.\e
plusprintf
? Możesz po prostu umieścić znaki kontrolne we wzorze zastępczym.TI-BASIC,
69 60 5655 bajtówDotyczy to rodziny kalkulatorów TI-83 + / 84 +, chociaż zostało napisane w 84+ C Silver Edition.
Program wyświetla się jako większy na podstawie obliczeń VAT + informacje o rozmiarze. Ponadto jest tu ponad 56 znaków; powodem jest 56 bajtów, ponieważ wszystkie polecenia zawierające więcej niż jeden znak są skompresowane do tokenów o rozmiarze jednego lub dwóch bajtów.
Ogolono kolejny bajt dzięki Thomas-kwa ! (także od niego był skok z 60 na 56.)
źródło
cos(piAns
sztuczki, aby zapisać kolejny bajt.Python 2, 115 bajtów
Wywołaj jak
f("((()())()(()(())()))")
, a wyjście jest do STDOUT.Wyjaśnienie
Zaczynamy od
n = 0
. Dla każdego znaku w linii wejściowej:(
, dodamyn
spacje, a następnie zwiększamyn
)
, zmniejszamy,n
a następnie dodajemyn
spacjeWynik jest następnie spakowany i wydrukowany. Zauważ, że
zip
zamki błyskawiczne Pythona pasują do długości najkrótszego elementu, npZwykle używa się
itertools.zip_longest
(izip_longest
), jeśli chcemyzip
uzupełnić długość najdłuższego elementu.Ale w Pythonie 2 to zachowanie można symulować, odwzorowując
None
:Python 3, 115 bajtów
Bez zamka błyskawicznego, wystarczy odpowiednie wypełnienie
ljust
. Ten wydaje się mieć pewien potencjał golfowy.źródło
R,
151127 znakówZ wcięciami i znakami nowej linii:
Stosowanie:
Odczytuje ciąg jako stdin, dzieli go jako wektor pojedynczych znaków, oblicza skumulowaną sumę
(
i)
odejmuje pierwsze z drugim (z opóźnieniem), obliczając w ten sposób „poziom” każdego nawiasu. Następnie drukuje na standardowe wyjście, dla każdego poziomu, albo w nawiasach, albo spacją.Dzięki @MickyT za pomoc w znacznym skróceniu!
źródło
for(i in n)cat(ifelse(D[i]-j," ",S[i]));cat("\n")
zX=S;X[which(D!=j)]=' ';cat(X,sep='',fill=T)
. Ton
nie jest tak naprawdę wymagane, ale trzeba by trochę zmienić część sumy.D=c(C(S=="("),0)-c(0,C(S==")"));
obniżając go do 135.which
nie jest tu tak naprawdę konieczne (D!=j
ponieważ jest już wektorem wartości logicznych umożliwiających indeksowanie). Nie wiedziałem, że argumentyfill
zacat
, to sprytne sztuczki! Dzięki, że skróciłem go o zdumiewające 24 znaki !!C,
58 53 52 5149 bajtówWykorzystuje sekwencje specjalne ANSI do przesunięcia pozycji kursora.
Jeśli nie używasz gcc lub innego kompilatora, który obsługuje
\e
, możesz go zastąpić\x1B
w sumie 2 dodatkowymi bajtami.\e[A
przesuwa kursor o jeden wiersz w górę i\e[B
przesuwa kursor o jeden wiersz w dół. Nie trzeba używać,\e[B
aby przejść w dół o jeden wiersz, ponieważ jest o dwa bajty krótszy, aby użyć znaku tabulacji pionowej ASCII0xB
lub\v
.Zakłada się, że łańcuch wejściowy składa się tylko z (zrównoważonych) nawiasów, więc sprawdzenie parzystości znaku za pomocą
&1
, wystarcza do rozróżnienia między(
i)
.źródło
Pip, 53 bajty
Pip jest językiem golfa mojego wynalazku. Pierwsza wersja została opublikowana w sobotę, więc mogę ją oficjalnie wypróbować! Poniższe rozwiązanie nie jest zbyt konkurencyjne ze względu na języki gry w golfa, ale częściowo dlatego, że nie wdrożyłem jeszcze takich rzeczy jak zip i max.
Oczekuje ciąg nawiasów jako argument wiersza polecenia.
Wersja „bez golfa”:
Wyjaśnienie:
W przeciwieństwie do większości języków golfowych, Pip jest niezbędny dla operatorów infix, więc składnia jest nieco bliższa C i jej pochodnym. Pożycza również pomysły z programowania funkcjonalnego i tablicowego. Zobacz repozytorium w celu uzyskania dalszej dokumentacji.
Najpierw program generuje listę głębokości (zapisując ją
z
) poprzez mapowanie funkcji na łańcuch wejściowya
. Zmienna globalnav
śledzi bieżący poziom. (Zmiennea-g
w Pip są zmiennymi lokalnymi dla funkcji, aleh-z
są globalne.v
Jest przydatne, ponieważ jest wstępnie zainicjalizowane na -1.)Następnie używamy
W
pętli kreskowej do generowania i drukowania każdej linii, aż wygenerowana linia będzie się składać ze wszystkich spacji.v
jest teraz używany do kolumn ii
wierszy.{z@++v=i?as}
Funkcja, wielokrotnie mapowane do oryginalnego wejściowego łańcucha, testy czy bieżąca liniai
pasuje do linii prądu nawias ma być włączony (zapisane naz
liście). Jeśli tak, użyj nawiasu (a
); jeśli nie, użyjs
(zainicjalizowany do spacji). Rezultatem końcowym jest to, że do każdej iteracjio
zostaje przypisana lista znaków równoważna do następnego wiersza wyniku.Aby sprawdzić, czy powinniśmy kontynuować zapętlanie, sprawdzamy, czy
o
ze wszystkimi spacjamiRM
d jest puste. Jeśli nie, wydrukuj go (który domyślnie konkatenuje wszystko razem jak w CJam), zresetuj numer kolumny na -1 i zwiększ numer wiersza.(Ciekawostka: na początku miałem 51-bajtowe rozwiązanie ... które nie działało, ponieważ wykryło błąd w tłumaczu.)
źródło
Pyth, 31 bajtów
Wypróbuj online.
-/<zk\(/<zhk\)
: Znajduje odpowiedni poziom dla aktualnej pozycji postaci.?YqN-/<zk\(/<zhk\)d
: Spacja, jeśli odpowiedni poziom nie jest bieżącym poziomem, w przeciwnym razie obecny znak.Js.e?YqN-/<zk\(/<zhk\)dz
: Wygeneruj ciąg, zapisz go wJ
.I-JdJ
: JeśliJ
to nie wszystkie spacje, wydrukuj je.Vz
:z
Czasy pętli .źródło
GNU Bash + coreutils + tiret, 135
Wejście / wyjście przez STDIN / STDOUT:
indent
wykonuje większość ciężkiego podnoszenia, ale musi pracować z aparatami ortodontycznymi zamiast parens. Reszta to modyfikacja tej odpowiedzi w celu transponowania wynikuindent
.źródło
Python 2, 92
Drukuje linia po linii. Dla danego numeru wiersza
i
(a właściwie jego negacji) przechodzi przez ciąg wejściowys
i tworzy nowy ciąg,z
który zawiera tylko znakis
głębokościi
. Odbywa się to poprzez zwiększanie lub zmniejszanie wi
celu śledzenia bieżącej głębokości oraz dodawanie bieżących znaków, gdyi
jest0
dostosowany do typu paren, lub w inny sposób dodawanie spacji.Następnie drukuje i przechodzi do następnego,
i
chyba że bieżąca linia zawiera wszystkie spacje. Zauważ, że ponieważ pareny są zrównoważone,i
pętla po jest taka sama jak na początku.Python 3 byłby taki sam, gdyby nie znak dla
print(z)
.źródło
oszukiwanie :(
Retina + TeX, N bajtówoszukiwanie :(Działa to tylko wtedy, gdy renderujesz (?) Dane wyjściowe za pomocą MathJax lub innego TeXa, który jest obecnie wyłączony dla tego SE :(
Każda linia powinna znajdować się w innym pliku, ale możesz to przetestować za pomocą
Retina -e "\(" -e "({" -e "\)" -e "})" -e "\{\(" -e "_{("
(lub równoważnego polecenia sedsed -e "s/(/({/g;s/)/})/g;s/{(/_{(/g"
). Dane wejściowe są przekazywane przez STDIN.Działa to poprzez umieszczenie zawartości każdej pary nawiasów w nawiasach klamrowych, a następnie indeksowanie wszystkich elementów w nich zawartych.
Wynik
źródło
In total the lines must not be longer than twice the length of the input string
. Zmiana linii 2 na(\,{
i linii 4 na}\,)
oznacza, że dane wyjściowe pasują do tego (chociaż głębokość pionowa jest nadal nieprawidłowa: ()Java,
232226224222 bajtówWersja golfowa:
Długa wersja:
Łańcuch wejściowy jest najpierw analizowany, szukając „(” i „)”, aby dodać / odjąć licznik i zapisać jego wartość, określając, jak daleko nawiasy powinny się znaleźć w tablicy, a także śledzić, jak głęboko schodzi. Następnie tablica jest analizowana; nawiasy z mniejszymi wartościami są drukowane jako pierwsze i będą kontynuować drukowanie linia po linii, aż do osiągnięcia maksimum.
Prawdopodobnie później znajdę sposoby na grę w golfa.
źródło
Javascript / ES6, 97 znaków
Stosowanie
Wyjaśnienie
źródło
n<m?console.log(o):0
możesz użyć,n<m&&console.log(o)
który oszczędza 1 bajt.CJam,
43 4136 bajtówNie za bardzo w golfa (tak myślę), ale oto moja pierwsza próba:
Jak to działa
Używam bardzo poręczny, że
)
i(
w CJam znaczy zwiększania i zmniejszania odpowiednio. Dlatego po prostu oceniam nawiasy, aby uzyskać głębokość.Wypróbuj online tutaj
źródło
Oktawa, 85 znaków
Jest to optymalizacja naiwnego podejścia, co w rzeczywistości jest całkiem naturalne dla Matlaba i Octave:
Tabela
t
może nawet jeszcze nie istnieć, a my możemy od razu przypisać dowolny element, i przekształca się w najmniejszy wymiar wymagany do istnienia tego elementu, co jest dość wygodne.źródło
Perl,
918988848079 bajtówźródło
Haskell, 154 bajty
ten sam pomysł jak inne rozwiązanie Haskell, ale nieco krótszy. - Stosowanie:
źródło
J, 46
Nie tak świetne jak inne „języki gry w golfa”, ale w mojej obronie: J jest okropny ze strunami.
Pobiera ciąg jako dane wejściowe dla funkcji. Jest też prawdopodobnie lepszy sposób na zrobienie tego w J.
Stosowanie:
źródło
Ruby,
119115114Wyjaśnienie:
źródło
Java,
233214 bajtówZębaty:
Wydaje mi się, że ostatnią pętlę można skrócić, ale pozostawię to jako ćwiczenie dla czytelnika. ;-)
Stara, 233 bajty odpowiedź:
Zębaty:
źródło
for(x=0;x<l*l;x++)System.out.print((x%l==0?"\n":"")+m[x]);
dofor(x=0;x<l*l;)System.out.print((x%l==0?"\n":"")+m[x++]);
do -1 bajt. Możesz także zaoszczędzić 2 bajty, usuwając jep=x=0
i po prostu używajint p=0,x=0,
przy inicjalizacji pól. W sumie staje się 211 bajtów .C #, 195 bajtów
Najpierw spróbuj golfa - krzycz, jeśli zrobiłem coś złego.
Alternatywna wersja C # wykorzystująca SetCursorPosition i pracująca od lewej do prawej, przyjmująca dane wejściowe jako argument linii poleceń.
Pomyślałem, że fajnie byłoby dopasować pozycję zapisu na podstawie otwartych / zamkniętych paren, a nie pełnych linii. Zamknij paren przesuwa pozycję w górę przed napisaniem; open paren przesuwa go w dół po napisaniu. Działanie SetCursorPosition oszczędza pięć bajtów. Przeniesienie kursora do następnego wiersza po wyjściu zająłoby trochę więcej.
źródło
Partia,
356335 bajtówWiem, że istnieje już rozwiązanie Batch dla tego wyzwania, ale jest ono znacznie bardziej rozbudowane i wydaje się, że przyjmuje inne podejście. Co najważniejsze, drugie rozwiązanie wsadowe zawiera co najmniej jedno polecenie programu PowerShell; to rozwiązanie nie.
Znak
U+0008
kropki () jest umieszczony w przedostatniej linii po kropce (linia 12, kolumna 57). Nie jest to widoczne w zamieszczonym tutaj kodzie, ale jest uwzględnione w liczbie bajtów.źródło
Partia, 424 bajty
Bez golfa:
Przykład:
źródło
C
118117 bajtówKolejna odpowiedź w C, ale moja jest krótsza.
Wersja bez golfa:
I to działa!
źródło
putchar(c-d?32:*p)
jest o jedną postać krótsze niżputchar(c==d?*p:32)
.Haskell, 227 bajtów
źródło
n#[]
Zamiastm n []
.Perl, 76 bajtów
Nie
use strict
tutaj :)źródło
Lex, 94 bajty
Zależy od kodów konsoli Linux. Za pomocą gcc możesz wyciąć cztery bajty, zastępując oba wystąpienia
\33
rzeczywistym znakiem ucieczki.Aby skompilować i uruchomić:
źródło