Die rechte Klammer ist eine Art von Code-Klammer, bei der geschweifte Klammern und Semikolons an einem einzelnen Punkt auf der rechten Seite einer Datei ausgerichtet sind.
Im Allgemeinen wird dies aus mehreren Gründen als schlechte Praxis angesehen.
Die Herausforderung
Führen Sie eine mehrzeilige Zeichenfolge durch eine beliebige Methode und konvertieren Sie den Klammerstil in die rechte Klammer.
Für diese Herausforderung benötigen Sie sie nur, um mit Java-Code zu arbeiten. Theoretisch sollte sie jedoch mit jedem Code funktionieren, der geschweifte Klammern und Semikolons verwendet.
Sie müssen alle {};
Zeichen hintereinander mit beliebigem Leerzeichen abrufen. Z.B. }}
, ; }
}\n\t\t}
und richten Sie sie mit Leerzeichen auf der rechten Seite der Datei aus.
beispielsweise:
a {
b;
{c
soll werden
a {
b ;{
c
Oder, abstrakter ausgedrückt, schieben Sie alle Leerzeichen von der linken Seite aller {};
Zeichen nach rechts.
Einrückungen von Linien sollten ansonsten erhalten bleiben. Zeilen, die nach dem Verschieben der {};
Zeichen nur Leerzeichen enthalten, können optional entfernt werden.
Beispielsweise:
a{
b{
c;
}
}
d;
Kann auch werden
a {
b {
c;}}
d ;
oder
a {
b {
c;}}
d ;
Nach rechts verschoben bezieht sich auf alle {};
Zeichen, die an einem Punkt ausgerichtet sind, der nicht kürzer als die längste Linie ist. Jede Menge Platz danach ist akzeptabel.
Das Folgende ist also akzeptabel:
a {
bc;
a {
bc ;
a {
bc ;
etc...
Zeilen in jedem Code können {};
Zeichen zwischen anderen Nicht-Leerzeichen enthalten. Die Behandlung dieses Falls ist nicht erforderlich. Wenn Sie jedoch geneigt sind, sollten Sie sie an Ort und Stelle belassen. Zeilen dürfen auch überhaupt keine {};
Zeichen enthalten , und dies sollte korrekt gehandhabt werden. Wie unten gezeigt.
a {
b ;
c
d }
Da wir nicht möchten, dass Code Review die schrecklichen Dinge sieht, die wir tun, müssen Sie Ihren Code so klein wie möglich machen.
Beispiele / Testfälle
Generisches Java
public class HelloWorld{
public static void main(String[] args){
System.out.println("Hello, World!");
}
}
wird...
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!") ;}}
Das Bild selbst
public class Permuter{
private static void permute(int n, char[] a){
if (n == 0){
System.out.println(String.valueOf(a));
}else{
for (int i=0; i<= n; i++){
permute(n-1, a);
swap(a, n % 2 == 0 ? i : 0, n);
}
}
}
private static void swap(char[] a, int i, int j){
char saved = a[i];
a[i] = a[j];
a[j] = saved;
}
}
wird...
public class Permuter {
private static void permute(int n, char[] a) {
if (n == 0) {
System.out.println(String.valueOf(a)) ;}
else {
for (int i=0; i<= n; i++) {
permute(n-1, a) ;
swap(a, n % 2 == 0 ? i : 0, n) ;}}}
private static void swap(char[] a, int i, int j) {
char saved = a[i] ;
a[i] = a[j] ;
a[j] = saved ;}}
Nicht so perfekt generisches Python
Für den Kontrast
def Main():
print("Hello, World!");
Main();
wird...
def Main():
print("Hello, World!") ;
Main() ;
Anmerkungen
- Es gelten Standard-Regelungslücken
- Standard IO gilt
- Das ist Code-Golf , also gewinnt das kürzeste Programm in Bytes!
- Ich hafte nicht für Schäden, die mit der Programmierung im Stil der rechten Zahnspange zusammenhängen
- Habe Spaß!
Notizen bearbeiten
Ich habe die Herausforderungsdetails umformuliert. Hoffentlich habe ich nicht gegen die Regeln verstoßen. Ich versichere Ihnen, dass es unbeabsichtigt war. Dies sollte eine deutlichere und weniger widersprüchliche Spezifikation sein.
quelle
int a=0;System.out.println(a);
;{}
Zeichen gesammelt, wenn sie in separaten Zeilen sind (es ist nur aus dem Beispiel klar, nicht die Regeln, und in der Tat , wenn eine Zeile besteht\t}
würde die Vertiefung Haltbarmachung nicht bewegt}
bis zum Ende der vorherigen Zeile)Antworten:
V + Bash-Dienstprogramme,
6462616062 ByteDank @DJMcMayhem für die Zusammenstellung der ex-Befehle 1 Byte gespart
^R
ist das Zeichenliteral für<C-r>
(0x12
) und<84>
ist0x84
und<94>
ist0x94
.wc -L
Funktioniert auf den meisten * nix-basierten Systemen, jedoch nicht auf macOS. Für macOS müssen Sie dies tun,gwc -L
nachdem Sie coreutils mit brew erhalten haben, falls Sie dies noch nicht getan haben.Probieren Sie es online! (Java)
Probieren Sie es online! (Python)
Probieren Sie es online! (Wieder Java)
Dadurch werden alle leeren Zeilen beibehalten und Tabulatoren, nur Leerzeichen, werden nicht verarbeitet.
Hexdump:
Erläuterung
Zuerst müssen wir den Cursor irgendwo im Puffer bewegen können, also verwenden wir
und wir verketten dies mit einem anderen ex-Befehl unter Verwendung von
|
Wir müssen die Länge der längsten Zeile in der Eingabe ermitteln. Dies kann mit dem Shell-Befehl erfolgen
wc -L
.Dies überschreibt den aktuellen Puffer (der die Eingabe enthält) mit dem Ergebnis von
wc -L
. Es gibt eine Ausgabe von etwas wie:und die Cursor landen auf dem
4
in42
. Dann kopieren wir diese Nummer mity$
: yank text von der Cursorposition bis zum Zeilenende. Dadurch wird diese Nummer bequem im Register gespeichert0
. Aber dazu später mehr. Die Eingabe wird durch diese Nummeru
ersetzt.Sagen wir nun, die Eingabe sah ungefähr so aus:
Wir müssen die geschweiften Klammern
}
vom Ende des Puffers direkt nach derprintln
Anweisung verschieben.Wenn der reguläre Ausdruck nicht gefunden werden kann, tritt ein Unterbrechungsfehler auf und die durch verursachte Rekursion wird abgebrochen
ò
.Jetzt kommt der Hauptteil dieses Programms, bewegen Sie alle Klammern und Semikolons und richten Sie sie wie in der Frage angegeben aus.
Wieder wird diese Rekursion durch einen Unterbrechungsfehler gestoppt, der verursacht wird, wenn der reguläre Ausdruck nicht im Puffer gefunden werden konnte.
Bearbeitungen
D
stattd$
(ich weiß nicht einmal, warum ich , dass in erster Linie verpasst)[^
(im regulären Ausdruck) auf<84>
\zs
(Komprimieren in<93>
) und Entfernen des$
In behoben$xk$pò
quelle
:se ve=all|%!wc -L
Ruby,
100114108 BytesLiest den Dateinamen als Befehlszeilenargument. Wenn kein Dateiname angegeben wird, wird von STDIN gelesen. Behandelt keine Tabs.
Probieren Sie es online!
quelle
catch
Anweisung und B. ein Semikolon, das in der längsten Zeile des Codes viel zu stark eingerückt war. Ich glaube, ich weiß genau, was ich tun muss, gib mir eine Sekunde. (Außerdem habe ich die Spezifikation aktualisiert, um zu erwähnen, dass sie keine Registerkarten verarbeiten kann und Ihre Datei Registerkarten enthält.)Perl , 90 Bytes
88 Byte Code +
-p0
Flags.Probieren Sie es online!
Kurze Erklärungen:
\@a[y///c]for/.*/g;
Zählt die Länge der längsten Zeile: Für jede Zeile definiert sie das Element am Indexy///c
(dh die Größe der Zeile) des Arrays@a
. Am Ende ist der maximale Index von@a
(dh die Größe von@a
) die Größe der längsten Zeile.s/(.*?)\K[{};]$/$"x(@a-$1=~y%%%c).$&/gme
Platziert die{};
Zeichen am Ende der Zeilen.1while s/ *\n *([{};]+)$/$1/m
make bewirkt, dass die geschweiften Klammern in leeren Zeilen in der darüber liegenden Zeile stehen.Dank an @primo, von dem ich den Anfang meines Codes teilweise "gestohlen" habe , um die Länge der längsten Zeile zu zählen.
quelle
Python 2: 228 Bytes
quelle
;{}
am Ende der vorherigen Zeilen weiterarbeiten müssen.gestapelt , 133 Bytes
Probieren Sie es online! Ich könnte das stark überdenken ... aber was auch immer. Ich werde es mir morgen noch einmal ansehen. Einige nette Tipps:
"!
kann oft anstelle vonmap
ein oder zwei Bytes verwendet werden, je nachdem, ob das nächste Token mit einem Wort beginnt. Sie kann jedoch nur verwendet werden, wenn jedes Atom des Arrays abgebildet werden soll. Es ist ähnlich wie bei einer tiefen Karte.$MAXmap
ist also äquivalent zu$MAX map
, was wiederum äquivalent zu ist[MAX] map
. (Ordnet jedes Array seinem maximalen Element zu.)quelle
JavaScript (ES-Vorschlag),
139121 ByteBenötigt Firefox 48 / Chrome 57 / Opera 44 / Safari 10 / Edge 15 für
padEnd
. Bearbeiten: 18 Bytes dank @ValueInk gespeichert.quelle
s.replace(r,`$1`)
bei der Berechnung der Leitungslänge wirklich ausführen ? Jede Menge an vernünftigem Rechtsabstand sollte ausreichen, daher sollte das Zählen der Zeilenlänge mit den Semikolons und Klammern in Ordnung sein.PHP,
201194185172167 BytesÜbernimmt die Eingabe aus der Datei f; setzt einzeilige Zeilenumbrüche und keine Tabulatoren voraus; Bewahrt Leerzeilen.
+1
An den zweitenstr_pad
Parameter anhängen .0
:Entfernen
""<
und ersetzen""==
durch!
.Nervenzusammenbruch
quelle
{}
Klammern im Regex entkommen müssen?Java 8,
312305 BytesErläuterung:
Probieren Sie es hier aus.
quelle