Hintergrund
(Basierend auf einer wahren, herzzerreißenden Geschichte)
In meiner Zeit habe ich oft mit Lisp und ähnlichen Sprachen gespielt. Ich habe mit ihnen geschrieben, sie ausgeführt, sie interpretiert, sie entworfen und Maschinen dazu gebracht, für mich mit ihnen zu schreiben.
Leider neigen einige Texteditoren ( Husten XCode Husten ) dazu, meine schönen Tabulatoren und Leerzeichen zu entfernen, wenn Code kopiert und eingefügt wird.
(A
(B
(C)
(D))
(E))
(Wo ABCDE
sind beliebige Funktionen)
EINIGE Texteditoren metzeln diesen schönen Code zu folgendem Zweck:
(A
(B
(C)
(D))
(E))
Was für ein Chaos! Das ist nicht lesbar!
Hilf mir hier raus?
Die Herausforderung
Ihr Ziel bei dieser Herausforderung ist es, eine Reihe von Funktionen, die durch Zeilenumbrüche voneinander getrennt sind, in einem unten beschriebenen Format zu verwenden und eine schönere Anordnung zu erhalten, die Lesbarkeit und Eleganz hervorhebt.
Die Eingabe
Wir definieren eine Funktion F
von Arity- N
Argumenten als ein Konstrukt ähnlich dem Folgenden:
(F (G1 ...) (G2 ...) (G3 ...) ... (GN ...))
Wo G1, G2, ..., GN
sind alle Funktionen an und für sich? Eine arity 0
Funktion A
ist einfach (A)
, während eine arity 2
Funktion B
von der Form(B (...) (...))
Ihr Code sollte als eine Reihe von Funktionen mit einer einzelnen Zeile vor der führenden Klammer jeder Funktion eingegeben werden (mit Ausnahme der ersten Funktion). Das obige Beispiel ist eine gültige Eingabe.
Sie können annehmen:
- Die Klammern sind ausgeglichen.
- Eine Funktion muss niemals mehr als 250 Mal eingerückt werden.
- JEDE Funktion ist in Klammern gesetzt:
()
- Der Name einer Funktion enthält nur druckbare ASCII-Zeichen.
- Der Name einer Funktion enthält niemals Klammern oder Leerzeichen.
- Bei der Eingabe gibt es optional einen nachgestellten Zeilenumbruch.
Die Ausgabe
Ihr Code sollte den gleichen Satz von Funktionen ausgeben , wobei die einzigen vorgenommenen Änderungen das Hinzufügen von Leerzeichen oder Tabulatoren vor den führenden Klammern von Funktionen sind. Die Ausgabe sollte den folgenden Regeln entsprechen:
- Die erste angegebene Funktion (und spätere Funktionen der obersten Ebene) sollten keine vorangestellten Leerzeichen enthalten
- Ein Argument für die horizontale Position einer Funktion ist genau eine Registerkarte rechts von der horizontalen Position dieser Funktion.
- Ein Tab ist implementierungsdefiniert, muss jedoch mindestens 3 Leerzeichen enthalten.
- Optional können Sie maximal zwei Leerzeichen nach jeder Zeile drucken.
Regeln
- Das ist Code-Golf: Der kürzeste Code gewinnt!
- Standard-Regelungslücken sind nicht zulässig.
Beispiele
Eingang:
(A
(B
(C)
(D))
(E))
Ausgabe:
(A
(B
(C)
(D))
(E))
Eingang:
(!@#$%^&*
(asdfghjklm
(this_string_is_particularly_long
(...))
(123456789)))
(THIS_IS_TOP_LEVEL_AGAIN
(HERE'S_AN_ARGUMENT))
Ausgabe:
(!@#$%^&*
(asdfghjklm
(this_string_is_particularly_long
(...))
(123456789)))
(THIS_IS_TOP_LEVEL_AGAIN
(HERE'S_AN_ARGUMENT))
Eingang:
(-:0
(*:0
(%:0
(Arg:6)
(Write:0
(Read:0
(Arg:30))
(Write:0
(Const:-6)
(Arg:10))))
(%:0
(Const:9)
(/:0
(Const:-13)
(%:0
(Arg:14)
(Arg:0)))))
(WriteArg:22
(-:0
(Const:45)
(?:0
(Arg:3)
(Arg:22)
(Arg:0)))))
Ausgabe:
(-:0
(*:0
(%:0
(Arg:6)
(Write:0
(Read:0
(Arg:30))
(Write:0
(Const:-6)
(Arg:10))))
(%:0
(Const:9)
(/:0
(Const:-13)
(%:0
(Arg:14)
(Arg:0)))))
(WriteArg:22
(-:0
(Const:45)
(?:0
(Arg:3)
(Arg:22)
(Arg:0)))))
quelle
()
?Antworten:
Pyth,
24201918 BytesInkrementiert einen Zähler für jede Zeile, zählt die Gesamtzahl der bisherigen schließenden Klammern und subtrahiert ihn vom Zähler. Dann rücken wir durch
counter
Tabulatoren ein.quelle
*4
ist eine hartkodierte und überflüssige Präferenz.FN.z+*ZC9N~Z-1/N\)
Mit dieser Option können Sie die Einzugsbreite Ihres Editors verwenden und ein Byte speichern.\<tab>
oderC9
.Common Lisp -
486414 Bytes (Rube Goldberg-Version)Ansatz
Anstatt wie alle anderen zu tun und Klammern von Hand zu zählen, rufen wir den Lisp-Leser auf und tun es die richtige Weise :-)
(
, die sich von)
oder Leerzeichen als Strings.read
auf, um aktuelle Listen zu erstellen.p
jede dieser Listen auf, die sie mit dem gewünschten Format rekursiv in die Standardausgabe schreiben. Insbesondere werden Zeichenfolgen ohne Anführungszeichen gedruckt.Infolge dieses Ansatzes:
Beispiel
Lesen aus einer Datei mit diesem Wrapper:
Hier ist das Ergebnis:
(Tabs werden hier anscheinend in Leerzeichen umgewandelt)
Hübsch gedruckt (Golfversion)
Im Gegensatz zur sichereren Originalversion erwarten wir, dass Eingaben gültig sind.
quelle
Retina ,
8983 BytesWobei
<tab>
für ein tatsächliches Tabulatorzeichen (0x09) und<empty>
für eine leere Zeile steht. Nachdem Sie diese Ersetzungen vorgenommen haben, können Sie den obigen Code mit dem Befehl ausführen-s
Flag . Ich zähle dieses Flag jedoch nicht, da Sie auch jede Zeile in eine eigene Quelldatei einfügen können. In diesem Fall werden die 7 Zeilen für die zusätzlichen Quelldateien durch 7 Strafbytes ersetzt.Dies ist ein vollständiges Programm, das Eingaben in STDIN vornimmt und das Ergebnis in STDOUT ausgibt.
Erläuterung
Jedes Zeilenpaar definiert eine reguläre Ersetzung. Die Grundidee besteht darin, die Bilanzgruppen von .NET zu verwenden, um die aktuelle Tiefe bis zu einer bestimmten Zahl zu zählen
(
, und dann so viele Registerkarten davor einzufügen(
.Zuerst bereiten wir die Eingabe vor. Wir können eine bedingte Anzahl von Tabs nicht wirklich zurückschreiben, wenn wir sie nicht irgendwo in der Eingabezeichenfolge finden, um sie zu erfassen. Also beginnen wir mit dem Duplizieren der gesamten Eingabe, getrennt durch einen Tabulator. Beachten Sie, dass mit "
s`
Just" der Modifikator "Single Line" (oder "Dot-All") aktiviert wird, wodurch sichergestellt wird, dass.
auch Zeilenumbrüche berücksichtigt werden.Jetzt verwandeln wir jedes Zeichen nach diesem Tab auch in einen Tab. Dadurch erhalten wir eine ausreichende Anzahl von Tabulatoren am Ende der Zeichenfolge, ohne die ursprüngliche Zeichenfolge bisher zu ändern.
Das ist das Fleisch der Lösung. Die
m
unds
aktivieren den Mehrzeilenmodus (damit^
der Zeilenanfang übereinstimmt) und den Einzeilenmodus. Das+
weist Retina an, diese Ersetzung so lange zu wiederholen, bis sich die Ausgabe nicht mehr ändert (in diesem Fall bedeutet dies, dass das Muster nicht mehr mit der Zeichenfolge übereinstimmt).Das Muster selbst stimmt mit einem Präfix der Eingabe bis zu einem nicht verarbeiteten überein
(
(d. H. Einem(
, das keine Registerkarten vor sich hat, aber sollte). Gleichzeitig wird die Tiefe des Präfixes mit Ausgleichsgruppen so festgelegt, dass die Höhe des Stapels2
der aktuellen Tiefe und damit der Anzahl der anzuhängenden Registerkarten entspricht. Das ist dieser Teil:Es entspricht entweder a
(
, indem es auf den2
Stapel geschoben wird, oder es entspricht a)
, indem das letzte Capturing aus dem entfernt wird2
Stapel, oder es passt zu etwas anderem und lässt den Stapel unberührt. Da die Klammern garantiert ausgeglichen sind, brauchen wir uns keine Gedanken darüber zu machen, ob wir versuchen, von einem leeren Stapel zu springen.Nachdem wir die Zeichenfolge wie
(
folgt durchgearbeitet haben und eine unverarbeitete gefunden haben , bei der wir anhalten können, springt der Lookahead zum Ende der Zeichenfolge und fängt die Tabs in Gruppen ein,3
während wir vom2
Stapel springen, bis sie leer sind:Durch die Verwendung von a
+
in there stellen wir sicher, dass das Muster nur dann mit etwas übereinstimmt, wenn mindestens ein Tabulator in die Übereinstimmung eingefügt werden soll. Dadurch wird eine Endlosschleife vermieden, wenn mehrere Funktionen auf Stammebene vorhanden sind.Zuletzt werden die Hilfslaschen am Ende der Zeichenfolge entfernt, um das Ergebnis zu bereinigen.
quelle
C:
95 bis94 ZeichenEs ist noch nicht sehr gut gespielt, und ich bin mir nicht sicher, ob Tabs akzeptabel sind, was ich hier benutze.
Ungolfed:
Bearbeiten: Es wurde so eingestellt, dass es bei EOF beendet wird.
quelle
if(c<11)
anstelle von verwendenif(c==10)
?Julia,
10399979488 BytesDies definiert eine unbenannte Funktion, die eine Zeichenfolge akzeptiert und die eingerückte Version ausgibt. Um es zu nennen, geben Sie ihm einen Namen, z
f=p->...
. Beachten Sie, dass die Eingabe eine gültige Julia-Zeichenfolge sein muss, sodass Dollarzeichen ($
) maskiert werden müssen.Ungolfed + Erklärung:
Wenn Sie beispielsweise vorgeben, dass jeder Satz von vier Leerzeichen vorhanden ist, handelt es sich um eine Registerkarte:
Anregungen sind mehr als willkommen!
quelle
Haskell,
8381Eine sehr punktefreie Lösung.
quelle
h=
.Perl, 41
40
Zeichen+1
für-p
.Laufen mit:
quelle
Python 2 -
8878 BytesZiemlich einfache (und nicht sehr kurze) Lösung:
quelle
'\t'
anstelle von' '
ein Byte verwenden und speichern; 2) keine Notwendigkeit zuweiseninput.split()
zu einer Variablen, da sie nur einmal (gleich für verwendet wirdc
, sowied
--just bewegen , um dieprint
Aussage); 3) Operator-Rangfolge bedeutet, dassl*c
keine runden Klammern erforderlich sind. Es sieht auch so aus, als würde esf
für nichts gebraucht - ist das ein Relikt einer früheren Version?raw_input
stattdessen verwendeninput
(und die Klammern danach nicht vergessen!).CJam, 20 Bytes
Versuchen Sie es online in dem CJam Dolmetscher .
Wie es funktioniert
quelle