Die Klammern auf meiner Tastatur sind alle abgenutzt, und ich möchte vermeiden, sie so oft wie möglich zu verwenden. Ihre Herausforderung besteht darin, eine Zeile mit Klammern auszugleichen, indem Sie sie vor und nach jeder Zeile einfügen.
Dies ist vergleichbar mit den automatischen Klammern und dem Schließen von Zeichenfolgen von TI-Basic Output(1, 1, "Hello, World!
. Es speichert auch wertvolle Bytes aus einem Programm!
Beispiel Eingabe:
This line has no parentheses
alert(Math.max(1, 2
1+1)*2).toString()
function() { alert('Hello, World!'); })(
Beispiel (mögliche) Ausgabe:
This line has no parentheses
alert(Math.max(1, 2))
((1+1)*2).toString()
(function() { alert('Hello, World!'); })()
Spezifikation:
Für jede Eingabezeile
Fügen Sie am Anfang so viele offene Klammern hinzu, und schließen Sie die Klammern am Ende der Zeile, wie erforderlich, um die Klammern in der Zeile auszugleichen
Die Definition von "Gleichgewicht" ist:
Gleiche Menge
(
und)
in der LeitungFür jede Teilzeichenfolge, die am Anfang der Zeichenfolge beginnt, darf diese Teilzeichenfolge nicht mehr schließende Klammern als öffnende Klammern enthalten
- Zum Beispiel
(foo))(bar
ist nicht ausgeglichen, weil(foo))
es mehr schließende Klammern als öffnende Klammern gibt
- Zum Beispiel
Sie können zusätzliche unnötige Klammern hinzufügen, wenn Sie möchten, wenn dies Ihren Code verkürzt
Sie müssen sich keine Gedanken über String-Literale oder ähnliches machen, vorausgesetzt, alle Klammern müssen ausgeglichen werden
Geben Sie jede Zeile mit ausgeglichenen Klammern aus
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes!
quelle
()
Pars, oder tun andere Klammern{}
,[]
,<>
, etc. müssen auch in Betracht gezogen werden?(
und)
.Antworten:
GolfScript, 23 Bytes
Die Lücke, die ich ausnütze, ist die Entscheidung, dass:
Grundsätzlich zählt dieser Code für jede Zeile die Anzahl der Zeichen in der Zeile, die keine öffnenden Klammern sind, und stellt der Zeile viele zusätzliche öffnende Klammern voran. Das Gleiche gilt dann für das Schließen von Klammern. Dies ist unglaublich ineffizient, stellt jedoch sicher, dass alle Klammern in der Ausgabezeile ausgeglichen sind.
Zum Beispiel bei der Eingabe:
Dieses Programm gibt aus:
Ps. Sie können diesen Code auch online testen .
quelle
Perl, 32 = 31 + 1 oder 73 = 72 + 1 (minimierte Klammern)
32 = 31 + 1: mit zusätzlichen unnötigen Klammern
Bearbeitungen:
y///
.$a
entfernt.Es wird mit dem Laufzeitschalter
-p
(+1 Byte) verwendet.Testdatei
input.txt
:Befehlszeile:
oder
Ergebnis:
Ungolfed:
Der Algorithmus ist einfach, fügen Sie einfach das Gegenstück für jede gefundene Klammer hinzu.
73 = 72 + 1: Hinzufügen einer Mindestanzahl von Klammern
Dieses Skript fügt nur die Mindestanzahl von Klammern hinzu, um eine ausgeglichene Ausgabe zu erhalten.
Es wird mit dem Laufzeitschalter
-p
(+1 Byte) verwendet.Ergebnis:
Ungolfed:
81 = 80 + 1: Hinzufügen einer Mindestanzahl von Klammern
Dies ist eine ältere Methode zum Hinzufügen der Mindestanzahl von Klammern für eine ausgeglichene Ausgabe.
Es verwendet Perl 5.14 (wegen des zerstörungsfreien Substitutionsmodifikators) und den Laufzeitschalter
-p
(+1 Byte).Ergebnis:
Ungolfed:
quelle
'('x/\)/g
immer gleich '(' ...y///
stattm//g
zum Zählen der Klammern.Python
2.73:626058 BytesNicht super golfen, aber du weißt schon. Ich könnte in der Lage sein, mehr Bytes herauszuquetschen, wenn ich es wirklich versuche.
Gibt für jede Zeile
(
* die Nummer)
in der Zeile, dann die Zeile und)
* die Nummer(
in der Zeile aus. Wenn ich die Regeln richtig verstehe, wird dies immer eine gültige Ausgabe liefern.Verlässt das Programm, indem ich eine Ausnahme auslöse, die auf meine Eingabe zurückzuführen ist. (Eingaben sind immer ein schwieriger Teil dieser Probleme.) Wenn dies nicht akzeptabel ist, kostet es mich ein paar Bytes, sie zu beheben, obwohl ich noch nicht sicher bin, wie viele.
Beispielausgabe:
quelle
python2 balanced_parenthesis.py < input.txt 2>/dev/null
Ruft die Ausgabe ab, die ich geschrieben habe, aber wenn Sie eine mehrzeilige Eingabe wünschen, während Sie sie interaktiv ausführen, kostet mich das ein paar Bytes. Gib mir eine Sekunde, ich werde etwas herausfinden ...while 1:s=raw_input();c=s.count;print'('*c(')')+s+')'*c('(')
c=s.count
. Ich dachte , Sie zu tun hattec=s
,s.c()
. Vielen Dank!Pure Bash, 72 Bytes
Verwendet den gleichen Algorithmus wie die Antwort von @ undergroundmonorail:
Ausgabe:
quelle