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)))))
()
?