Betrachten Sie eine nicht leere Zeichenfolge mit korrekt ausgeglichenen Klammern:
(()(()())()((())))(())
Wir können uns vorstellen, dass jedes Klammernpaar einen Ring in einer zusammengeklappten Teleskopkonstruktion darstellt . Verlängern wir also das Teleskop:
( )( )
()( )()( ) ()
()() ( )
()
Eine andere Betrachtungsweise ist, dass die Klammern in der Tiefe n auf die Linie n verschoben werden , während ihre horizontale Position beibehalten wird.
Ihre Aufgabe ist es, eine solche Folge ausgewogener Klammern zu verwenden und die erweiterte Version zu erstellen.
Sie können ein Programm oder eine Funktion schreiben, indem Sie Eingaben über STDIN (oder das nächste Äquivalent), ein Befehlszeilenargument oder einen Funktionsparameter vornehmen und Ausgaben über STDOUT (oder das nächste Äquivalent), einen Rückgabewert oder einen Funktionsparameter (out) erzeugen.
Sie können davon ausgehen, dass die Eingabezeichenfolge gültig ist, dh nur aus Klammern besteht, die korrekt ausgeglichen sind.
Sie dürfen in jeder Zeile nachgestellte Leerzeichen drucken, jedoch nicht mehr führende Leerzeichen als erforderlich. Insgesamt dürfen die Zeilen nicht länger als die doppelte Länge der Eingabezeichenfolge sein. Sie können optional eine einzelne nachgestellte Zeile drucken.
Beispiele
Neben dem obigen Beispiel gibt es hier noch einige Testfälle (Ein- und Ausgabe sind durch eine Leerzeile getrennt).
()
()
(((())))
( )
( )
( )
()
()(())((()))(())()
()( )( )( )()
() ( ) ()
()
((()())()(()(())()))
( )
( )()( )
()() ()( )()
()
Verwandte Herausforderungen:
- Topographic Strings , bei dem Sie gefragt werden, was im Wesentlichen die Ergänzung der Ausgabe in dieser Herausforderung ist.
- Code Explanation Formatter , eine breite Verallgemeinerung der Ideen in dieser Herausforderung, wurde kürzlich von PhiNotPi veröffentlicht. (Tatsächlich hat PhiNotPis ursprüngliche Beschreibung seiner Idee diese Herausforderung inspiriert.)
Bestenlisten
Huh, das hat eine Menge Beteiligung gebracht, also hier ein Stack-Snippet, um sowohl eine reguläre Rangliste als auch eine Übersicht der Gewinner nach Sprache zu generieren.
Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:
# Language Name, N bytes
Wo N
ist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:
# 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>
Antworten:
CJam,
171615 BytesDas obige ist ein reversibler xxd-Speicherauszug, da der Quellcode die nicht druckbaren Zeichen VT (0x0b) und CSI (0x9b) enthält.
Wie in dieser Antwort werden ANSI-Escape-Sequenzen verwendet , es werden jedoch auch vertikale Tabulatoren verwendet und die Steuerzeichen werden direkt gedruckt, um die Verwendung von printf zu vermeiden .
Dies erfordert ein unterstützendes Videotext-Terminal, das die meisten Nicht-Windows-Terminalemulatoren enthält.
Testlauf
Wir müssen die Shell-Variable LANG und die Codierung des Terminal-Emulators auf ISO 8859-1 setzen. Ersteres wird durch Ausführung erreicht
Bevor wir den eigentlichen Code ausführen, deaktivieren wir die Eingabeaufforderung und löschen den Bildschirm.
Dadurch wird sichergestellt, dass die Ausgabe korrekt angezeigt wird.
Führen Sie Folgendes aus, um LANG und die Eingabeaufforderung wiederherzustellen :
Wie es funktioniert
Wir fügen nach jedem einen vertikalen Tabulator ein ( um den Cursor nach unten zu bewegen, und die Bytesequenz 9b 41 (
"\x9bA"
) vor jedem ) , um den Cursor nach oben zu bewegen.quelle
x86-Maschinencode,
3934333029 Bytesx86-Assembly für DOS mit einigen Tricks:
Einschränkungen :
cls
vorheriges Laufen ist fast obligatorisch;bh=0
und das Richtungsflag wird beim Start gelöscht, beide undokumentiert; OTOHbx
wird in allen DOS-Varianten, die ich gesehen habe (DosBox, MS-DOS 2, FreeDOS), explizit auf Null gesetzt, und überall, wo ich die Flags getestet habe, waren sie bereits in Ordnung.quelle
cld
?add
/ zu tötensub
.lop
zuloop
?nasm
zwischen derloop
Bezeichnung undloop
der Montageanleitung einelop
eindeutige Trennung besteht. Deshalb schreibe ich wie alle anderen auch.J
3228 BytesDies war ein Spaß.
Erläuterung
So funktioniert diese Lösung, einschließlich einer Erläuterung, wie Golf gespielt wurde.
quelle
:')
C 150 Bytes
Das war ein verrückter Spaß beim Golfspielen. Ich bin immer noch nicht davon überzeugt, dass ich damit fertig bin.
Wir definieren eine einzelne Funktion,
f
die den String als Ein- und Ausgang für stdout verwendet.Lassen Sie uns den Code Zeile für Zeile durchgehen:
Ich werde alle Ihre Fragen beantworten!
Probieren Sie ein Testprogramm online aus !
quelle
f
,m
nicht auf 0 zurückgesetzt. Dies gilt als "Brechen Ihrer Umgebung", hier verboten .Retina + Bash, 27 Bytes (14 + 10 + 3 = 27)
Dies nutzt ANSI-Escapes:
Entspricht
sed -e "s/(/(\\\e[B/g;s/)/\\\e[A)/g"
. Der\e[B
Escape-Code bedeutet, dass der Cursor eine Zeile nach unten und der\e[A
Cursor eine Zeile nach oben bewegt wird. Bei dieser Lösung werden diese Codes einfach nach und vor dem Anfang und dem Ende jedes geschachtelten Klammerpaars eingefügt. Die Eingabe erfolgt über STDIN.Sie müssen es als aufrufen
printf $(Retina ...)
, um die Ausgabe korrekt zu sehen.Ausgabe
quelle
printf
, wäre das großartig. Ansonsten halte ich es nur für fair, die Byteanzahl| printf
zu erhöhen.printf $()
oder seinprintf $(Retina )
.\e
plusprintf
? Sie können die Steuerzeichen einfach in das Ersetzungsmuster einfügen.TI-BASIC,
69 60 5655 BytesDies ist für die TI-83 + / 84 + -Rechnerfamilie, obwohl sie auf einer 84+ C Silver Edition geschrieben wurde.
Das Programm wird bei Berechnung als größer angezeigt, da Mehrwertsteuer und Größenangaben enthalten sind. Außerdem gibt es hier mehr als 56 Zeichen. Der Grund dafür ist, dass alle Befehle, die mehr als ein Zeichen enthalten, auf Tokens mit einer Größe von ein oder zwei Bytes komprimiert werden.
Dank thomas-kwa ein weiteres byte abgeschnitten ! (Auch von ihm war der Sprung von 60 auf 56.)
quelle
cos(piAns
Trick verwenden, um ein weiteres Byte zu speichern.Python 2, 115 Bytes
Call like
f("((()())()(()(())()))")
, und die Ausgabe erfolgt nach STDOUT.Erläuterung
Wir beginnen mit
n = 0
. Für jedes Zeichen in der Eingabezeile:(
, werdenn
Leerzeichen vorangestellt und dann inkrementiertn
)
, dekrementieren wir Leerzeichenn
und stellen sie vorann
Das Ergebnis wird dann gezippt und gedruckt. Beachten Sie, dass Pythons
zip
Reißverschlüsse der Länge des kürzesten Elements entsprechen, zNormalerweise würde man
itertools.zip_longest
(izip_longest
) verwenden, wenn manzip
auf die Länge des längsten Elements auffüllen möchte .In Python 2 kann dieses Verhalten jedoch durch Zuordnen simuliert werden
None
:Python 3, 115 Bytes
Kein Reißverschluss, nur passendes Auffüllen
ljust
. Dieser scheint ein gewisses Golfpotential zu haben.quelle
R,
151127 ZeichenMit Einrückungen und Zeilenumbrüchen:
Verwendungszweck:
Es liest die Zeichenkette als stdin, teilt sie als Vektor aus einzelnen Zeichen auf, berechnet die kumulative Summe von
(
und)
subtrahiert die erstere mit der letzteren (mit einer Verzögerung), wodurch das "Niveau" jeder Klammer berechnet wird. Anschließend werden für jede Ebene entweder die entsprechenden Klammern oder ein Leerzeichen auf stdout gedruckt.Vielen Dank an @MickyT, der mir dabei geholfen hat, es erheblich zu verkürzen!
quelle
for(i in n)cat(ifelse(D[i]-j," ",S[i]));cat("\n")
mitX=S;X[which(D!=j)]=' ';cat(X,sep='',fill=T)
. Dannn
ist das nicht wirklich erforderlich, aber Sie müssten den Cumsum-Teil ein bisschen ändern.D=c(C(S=="("),0)-c(0,C(S==")"));
which
ist hier allerdings nicht wirklich notwendig (daD!=j
es sich bereits um einen Vektor von Booleschen Elementen handelt, die eine Indizierung ermöglichen). Ich wusste kein Argumentfill
dafürcat
, das ist ein toller Trick! Vielen Dank, dass ich es um erstaunliche 24 Zeichen verkürzen musste !!C,
58 53 52 5149 BytesVerwendet ANSI-Escape-Sequenzen, um die Cursorposition zu verschieben.
Wenn Sie gcc oder einen anderen unterstützten Compiler nicht verwenden
\e
, können Sie ihn durch\x1B
insgesamt 2 zusätzliche Bytes ersetzen .\e[A
Bewegt den Cursor eine Zeile nach oben und\e[B
den Cursor eine Zeile nach unten. Es ist nicht erforderlich,\e[B
eine Zeile nach unten zu verschieben, da es zwei Bytes kürzer ist, um das vertikale ASCII-Tabulatorzeichen0xB
oder zu verwenden\v
.Von der Frage wird angenommen, dass die Eingabezeichenfolge nur aus (ausgeglichenen) Klammern besteht. Daher reicht es aus, die Parität des Zeichens mit zu überprüfen
&1
, um zwischen(
und zu unterscheiden)
.quelle
Pip, 53 Bytes
Pip ist eine Code-Golf-Sprache meiner Erfindung. Die erste Version wurde am Samstag veröffentlicht, also kann ich es offiziell ausprobieren! Die folgende Lösung ist in Bezug auf Golfsprachen nicht besonders wettbewerbsfähig, aber das liegt zum Teil daran, dass ich Dinge wie zip und max noch nicht implementiert habe.
Erwartet die Zeichenfolge in Klammern als Befehlszeilenargument.
"Ungolfed" Version:
Erläuterung:
Im Gegensatz zu den meisten Golfsprachen ist Pip bei Infix-Operatoren unerlässlich, sodass die Syntax etwas näher an C und seinen Derivaten liegt. Außerdem werden Ideen aus der funktionalen und Array-basierten Programmierung übernommen. Weitere Dokumentation finden Sie im Repository.
Das Programm generiert zunächst eine Liste von Tiefen (in der es gespeichert ist
z
), indem eine Funktion der Eingabezeichenfolge zugeordnet wirda
. Die globale Variablev
verfolgt die aktuelle Ebene. (Variablena-g
in Pip sind funktionslokale Variablen, aberh-z
global.v
Ist praktisch, weil sie auf -1 vorinitialisiert sind.)Als nächstes verwenden wir eine
W
Hile-Schleife, um jede Zeile zu erzeugen und zu drucken, bis die erzeugte Zeile aus allen Leerzeichen bestehen würde.v
wird jetzt für Spalten undi
für Zeilen verwendet. Die{z@++v=i?as}
Funktion, die wiederholt der ursprünglichen Eingabezeichenfolge zugeordnet wird, prüft, ob die aktuelle Zeilei
mit der Zeile übereinstimmt, in der sich die aktuelle Klammer befinden soll (wie in derz
Liste gespeichert ). Verwenden Sie in diesem Fall die Klammer (a
). Wenn nicht, verwenden Sies
(für Leerzeichen vorinitialisiert). Das Endergebnis ist, dass bei jeder Iterationo
eine Liste von Zeichen zugewiesen wird, die der nächsten Zeile der Ausgabe entspricht.Um zu testen, ob wir die Schleife fortsetzen sollen, prüfen wir, ob
o
bei allen LeerzeichenRM
'd' leer ist. Wenn nicht, drucken Sie es aus (das verkettet standardmäßig alles wie in CJam), setzen Sie die Spaltennummer auf -1 zurück und erhöhen Sie die Zeilennummer.(Witzige Tatsache: Ich hatte zuerst eine 51-Byte-Lösung ... die nicht funktionierte, weil sie einen Fehler im Interpreter aufwies.)
quelle
Pyth, 31 Bytes
Probieren Sie es online aus.
-/<zk\(/<zhk\)
: Findet die passende Stufe für die aktuelle Zeichenposition.?YqN-/<zk\(/<zhk\)d
: Ein Leerzeichen, wenn die entsprechende Ebene nicht der aktuellen Ebene entspricht, andernfalls das aktuelle Zeichen.Js.e?YqN-/<zk\(/<zhk\)dz
: Generiere den String und speichere ihn inJ
.I-JdJ
: WennJ
nicht alle Leerzeichen vorhanden sind, drucken Sie es aus.Vz
: Loop-z
Zeiten.quelle
GNU Bash + coreutils + indent, 135
Ein- / Ausgabe über STDIN / STDOUT:
indent
erledigt das meiste schwere Heben, muss aber mit Zahnspangen anstelle von Parens arbeiten. Der Rest ist die Änderung dieser Antwort , um die Ausgabe von zu transponierenindent
.quelle
Python 2, 92
Druckt zeilenweise. Durchläuft für eine bestimmte Zeilennummer
i
(eigentlich deren Negation) die Eingabezeichenfolges
und erstellt eine neue Zeichenfolgez
, die nur die Zeichen ders
Tiefe enthälti
. Dies erfolgt durch Inkrementieren oder Dekrementiereni
, um die aktuelle Tiefe zu verfolgen, und Hinzufügen der aktuellen Zeichen, wenn dies für den Parentyp angepassti
ist0
, und andernfalls Hinzufügen eines Leerzeichens.Anschließend wird gedruckt und mit der nächsten
i
Zeile fortgefahren, es sei denn, in der aktuellen Zeile waren alle Leerzeichen. Da die Parens ausgeglichen sind, ist deri
After-Loop derselbe wie zu Beginn.Python 3 wäre bis auf ein Zeichen für dasselbe
print(z)
.quelle
Betrug :(
Retina + TeX, N BytesBetrug :(Dies funktioniert nur, wenn Sie die Ausgabe mit MathJax oder einem anderen TeX rendern (?), Das derzeit für diese SE deaktiviert ist :(
Jede Zeile sollte sich in einer anderen Datei befinden, aber Sie können sie mit
Retina -e "\(" -e "({" -e "\)" -e "})" -e "\{\(" -e "_{("
(oder dem entsprechenden sed-Befehlsed -e "s/(/({/g;s/)/})/g;s/{(/_{(/g"
) testen . Die Eingabe erfolgt über STDIN.Dies funktioniert, indem der Inhalt jedes Klammerpaares in geschweifte Klammern eingeschlossen und anschließend alle darin enthaltenen Elemente subskribiert werden.
Ausgabe
quelle
In total the lines must not be longer than twice the length of the input string
. Wenn Sie Zeile 2 auf(\,{
und Zeile 4 auf}\,)
Java,
232226224222 BytesGolf Version:
Lange Version:
Die Eingabezeichenfolge wird zuerst analysiert und sucht nach "(" und ")", um einen Zähler zu addieren / subtrahieren und seinen Wert zu speichern, um zu bestimmen, wie weit die Klammern in einem Array reichen sollen, und um zu verfolgen, wie tief der tiefste Wert ist. Dann wird das Array analysiert; Die Klammern mit niedrigeren Werten werden zuerst gedruckt und werden zeilenweise weiter gedruckt, bis das Maximum erreicht ist.
Ich werde wahrscheinlich später weitere Möglichkeiten finden, um Golf zu spielen.
quelle
Javascript / ES6, 97 Zeichen
Verwendungszweck
Erläuterung
quelle
n<m?console.log(o):0
können Sie verwenden,n<m&&console.log(o)
was 1 Byte spart.CJam,
43 4136 BytesIch denke, nicht zu golfen, aber hier ist mein erster Versuch:
Wie es funktioniert
Ich benutze die sehr praktische Tatsache, dass
)
und(
in CJam Inkrementieren bzw. Dekrementieren bedeuten. Daher bewerte ich einfach die Klammern, um die Tiefe zu erhalten.Probieren Sie es hier online aus
quelle
Oktave, 85 Zeichen
Es ist eine Optimierung des naiven Ansatzes, was für Matlab und Octave eigentlich ganz selbstverständlich ist:
Die Tabelle ist
t
möglicherweise noch nicht vorhanden, und wir können sie jedem Element sofort zuweisen. Sie wird in die kleinste Dimension umgeformt, die für die Existenz dieses Elements erforderlich ist, was sehr praktisch ist.quelle
Perl,
918988848079 Bytesquelle
Haskell, 154 Bytes
gleiche Idee wie die andere Haskell-Lösung, jedoch etwas kürzer. - Verwendungszweck:
quelle
J, 46
Nicht so gut wie die anderen "Golfsprachen", aber zu meiner Verteidigung: J ist schrecklich mit Streichern.
Nimmt den String als Eingabe für eine Funktion. Es gibt wahrscheinlich auch einen besseren Weg, dies in J zu tun.
Verwendungszweck:
quelle
Ruby,
119,115,114Erläuterung:
quelle
Java,
233214 BytesEingerückt:
Ich denke, die letzte Schleife könnte verkürzt werden, aber ich überlasse sie dem Leser als Übung. ;-)
Alt, 233 Bytes Antwort:
Eingerückt:
quelle
for(x=0;x<l*l;x++)System.out.print((x%l==0?"\n":"")+m[x]);
auf geändert werdenfor(x=0;x<l*l;)System.out.print((x%l==0?"\n":"")+m[x++]);
. Sie können auch 2 weitere Bytes einsparen, indem Sie diese entfernenp=x=0
undint p=0,x=0,
stattdessen bei der Initialisierung der Felder verwenden. Insgesamt werden es 211 Bytes .C # 195 Bytes
Versuchen Sie es zuerst mit Golf - schreien Sie, wenn ich etwas falsch gemacht habe.
Alternative C # -Version mit SetCursorPosition und Verwendung der Eingabe von links nach rechts als Befehlszeilenargument.
Ich dachte, es würde Spaß machen, die Schreibposition basierend auf dem Open / Close-Paren und nicht den vollständigen Zeilen anzupassen. Close Paren verschiebt die Position vor dem Schreiben nach oben. open paren verschiebt es nach dem Schreiben nach unten. Durch die Aktion SetCursorPosition werden fünf Bytes gespart. Das Bewegen des Cursors in die nächste Zeile nach der Ausgabe würde einiges mehr kosten.
quelle
Batch,
356335 BytesIch weiß, dass es für diese Herausforderung bereits eine Batch-Lösung gibt, aber diese ist deutlich umfangreicher und scheint einen anderen Ansatz zu verfolgen. Am wichtigsten ist, dass die andere Batch-Lösung mindestens einen Powershell-Befehl enthält. Diese Lösung tut es nicht.
In
U+0008
der vorletzten Zeile nach dem Punkt (Zeile 12, Spalte 57) befindet sich ein Backspace-Zeichen ( ). Dies ist im hier veröffentlichten Code nicht sichtbar, ist jedoch in der Byteanzahl enthalten.quelle
Batch, 424 Bytes
Nicht golfen:
Beispiel:
quelle
C
118117 BytesEine andere Antwort in C, aber meine ist kürzer.
Ungolfed-Version:
Und es funktioniert!
quelle
putchar(c-d?32:*p)
ein Zeichen kürzer alsputchar(c==d?*p:32)
.Haskell, 227 Bytes
quelle
n#[]
stattm n []
.Perl, 76 Bytes
Nein
use strict
hier :)quelle
Lex, 94 Bytes
Hängt von den Linux-Konsolencodes ab. Mit gcc können Sie vier Bytes ausschneiden, indem Sie beide Instanzen von
\33
durch ein tatsächliches Escape-Zeichen ersetzen .Kompilieren und ausführen:
quelle