Einführung
Die meisten Code-Golfer hier fügen Erklärungen zu ihren Einsendungen hinzu, so dass es einfacher ist zu verstehen, was los ist. In der Regel werden die Codelines links und die entsprechende Erklärung rechts mit einer Art Trennzeichen angezeigt. Damit es hübsch aussieht, befinden sich die Trennzeichen in derselben Spalte. Auch langer Erklärungstext wird normalerweise in die nächste Zeile umgebrochen, damit die Leser nicht horizontal scrollen müssen, um alles zu lesen.
Wenn Sie diese Erklärung jedoch bearbeiten möchten, weil Sie einige verrückte Golfspiele gemacht haben, verbringen Sie häufig Zeit damit, Ihre Erklärung wieder hübsch zu machen. Da dies eine sehr sich wiederholende Aufgabe ist, möchten Sie ein Programm dafür schreiben.
Die Herausforderung
Geben Sie bei mehreren Codezeilen mit Erklärung und einem Trennzeichen den gut formatierten Code mit Erklärung aus.
Beispiel
Eingang
shM-crz1dc4. "ANDBYOROF # z = Eingabe rz1 # konvertiert die Eingabe in Großbuchstaben CD # Split-Eingabe für Leerzeichen c4. "ANDBYOROF # Erstellt eine Liste der Wörter aus einer gepackten Zeichenfolge, die ignoriert werden soll - # diese Wörter herausfiltern hM # nimm nur den ersten Buchstaben aller Wörter s # füge sie zu einer Zeichenkette zusammen
Ausgabe
shM-crz1dc4. "ANDBYOROF # z = Eingabe rz1 # konvertiert die Eingabe in Großbuchstaben CD # Split-Eingabe für Leerzeichen c4. "ANDBYOROF # Erstelle eine Liste der Wörter aus einer gepackten Zeichenkette, die sein soll # ignoriert - # diese Wörter herausfiltern hM # nimm nur den ersten Buchstaben aller Wörter s # füge sie zu einer Zeichenkette zusammen
Ein Cookie für den ersten, der herausfinden kann, was dieser Code bewirkt.
Der Formatierungsalgorithmus
- Suchen Sie die längste Codezeile (ohne die Erklärung und die Leerzeichen zwischen Code und Trennzeichen).
- Fügen Sie nach dieser Codezeile 5 Leerzeichen ein und fügen Sie das entsprechende Trennzeichen mit Erläuterung hinzu. Dies ist jetzt die Referenzlinie.
- Passen Sie jede zweite Zeile an diese Referenzzeile an, sodass sich die Trennzeichen alle in derselben Spalte befinden.
- Brechen Sie alle Zeilen, die länger als 93 Zeichen sind, wie folgt in eine neue Zeile ein:
- Suchen Sie das letzte Wort, dessen Ende in Spalte 93 oder niedriger steht.
- Nehmen Sie alle Wörter nach diesem und setzen Sie sie mit dem führenden Trennzeichen und dem richtigen Abstand in eine neue Zeile. Das Leerzeichen zwischen diesen beiden Wörtern muss gelöscht werden, sodass die erste Zeile mit einem Wortzeichen endet und die zweite Zeile mit einem nach dem Trennzeichen beginnt.
- Wenn die resultierende Zeile immer noch länger als 93 Zeichen ist, wiederholen Sie dies, bis jede Zeile weniger als 94 Zeichen enthält.
Anmerkungen
- Ein Wort besteht aus Nicht-Leerzeichen. Wörter werden durch ein einzelnes Leerzeichen getrennt.
- Der Zeilenumbruch ist immer möglich. Dies bedeutet, dass kein Wort so lang ist, dass es das Umwickeln unmöglich machen würde.
- Die Eingabe enthält nur druckbares ASCII und keine nachgestellten Leerzeichen
- Das Trennzeichen wird nur einmal pro Zeile angezeigt.
- Während die Erklärung eine unbegrenzte Länge haben kann, können das Trennzeichen und der Code nur eine kombinierte maximale Länge von
93 - 5 = 87
Zeichen haben. Die 5 Zeichen sind die Leerzeichen zwischen Code und Trennzeichen. Code und Trennzeichen bestehen immer aus mindestens einem Zeichen. - Die Eingabe kann Leerzeilen enthalten. Diese enthalten niemals Zeichen (mit Ausnahme von Zeilenumbrüchen, wenn Sie Eingaben als mehrzeilige Zeichenfolge vornehmen). Diese Leerzeilen müssen auch in der Ausgabe vorhanden sein.
- Jede Zeile enthält einen Code, ein Trennzeichen und eine Erklärung. Ausnahmen sind Leerzeilen.
- Sie können die Eingabe in einem angemessenen Format vornehmen, solange sie nicht vorverarbeitet wird. Stellen Sie in Ihrer Antwort klar, welche Sie verwenden.
- Die Ausgabe kann eine mehrzeilige Zeichenfolge oder eine Liste von Zeichenfolgen sein.
Regeln
- Funktion oder Vollprogramm erlaubt.
- Standardregeln für die Eingabe / Ausgabe.
- Es gelten Standardlücken .
- Dies ist Code-Golf , also gewinnt die niedrigste Byte-Anzahl. Tiebreaker ist eine frühere Vorlage.
Testfälle
Das Eingabeformat ist hier eine Liste mit Zeichenfolgen, die die Zeilen darstellen, und eine einzelne Zeichenfolge für das Trennzeichen. Beide sind durch ein Komma getrennt. Die Ausgabe ist eine Liste von Zeichenfolgen.
['shM-crz1dc4. "ANDBYOROF # z = Eingabe', '', 'rz1 # Eingabe in Großbuchstaben konvertieren', 'cd # Eingabe in Leerzeichen aufteilen', 'c4." ANDBYOROF # Erstellt eine Liste der Wörter aus einem gepackten Zeichenkette, die ignoriert werden soll ',' - # filtere diese Wörter heraus ',' hM # nimm nur den ersten Buchstaben aller Wörter ',' s # füge sie zu einer Zeichenkette zusammen '], "#" -> [' shM-crz1dc4 . "ANDBYOROF # z = Eingabe ',' ',' rz1 # Eingabe in Großbuchstaben umwandeln ',' cd # Eingabe in Leerzeichen aufteilen ',' c4." ANDBYOROF # Eine Liste der Wörter aus einer gepackten Zeichenfolge erstellen, die ' , '# ignoriert', '- # filtere diese Wörter heraus ',' hM # nimm nur den ersten Buchstaben aller Wörter ',' s # verbinde sie zu einer Zeichenkette '] ['codecodecode e # Erklärung', 'sdf dsf sdf e # Eine sehr sehr sehr sehr sehr sehr sehr lange lange lange lange lange lange lange lange lange lange lange Erklärung und es wird immer länger', '', 'einige mehr codee # und etwas mehr erklärung '], "e #" -> [' codecodecode e # erklärung ',' sdf dsf sdf e # A Sehr sehr sehr sehr sehr sehr sehr lang lang lang lang lang ',' e # lang lange lange lange lange lange Erklärung und es wird immer länger ',' e # und länger ',' ',' etwas mehr Code e # und etwas mehr Erklärung ']
Viel Spaß beim Codieren!
length of the longest code-line + 5
. Dies gilt auch für Zeilen, die nur eine Erklärung enthalten, weil sie umbrochen wurden.Antworten:
Ruby,
245237220216212209205 BytesAnonyme Funktion. Ziemlich grundlegender Ansatz (maximale Länge finden, 5 addieren, dann Verarbeitung in jeder Zeile durchführen, mit Rekursion, um den Zeilenumbruch zu behandeln) und es könnte einen anderen Ansatz geben, der mehr Bytes spart.
Ich habe die Antwort zuvor gelöscht, die nicht alle Anforderungen erfüllte. Ich wollte keinen halb beantworteten Code als Antwort haben (es wurde auch schlecht bewertet, weil er unvollständig war), aber er sollte jetzt alles tun, was die Frage verlangt.
Änderungsprotokoll:
map
Aufruf an gespeichert und einige unnötigestrip
Funktionen entfernt wurden, basierend auf dem Versprechen, dass die Wörter in der Erklärung immer genau ein Leerzeichen dazwischen haben. Außerdem" "
ist jetzt eine Konstante zugeordnet, da ich sie so oft benutze.map
Aufrufe miteinander, indem die Leistungsfähigkeit von Funktionen höherer Ordnung genutzt wird. Dies bedeutet, dass der erste Kartenaufruf diel
Längenvariable auch dann korrekt festlegt, wenn sie nach der Deklaration der Hilfsfunktion aufgerufen wirds
. -4 Bytes.\n
durch tatsächliche Zeilenumbrüche sowie ein kleiner Trick mitif
über ternären Operatoren (wennjoin
ein Array mitnil
Werten aufgerufen wird , werden sie zu leeren Zeichenfolgen).join
kann anscheinend durch a ersetzt werden*
.quelle
93 - 5 = 87
Zeichen haben. Die 5 Zeichen sind die Leerzeichen zwischen Code und Trennzeichen. Code und Trennzeichen werden immer mindestens ein Zeichen lang sein." Ihr Codeabschnitt ist mit 97 Zeichen weit über dem Limit, sodass das Programm ein undefiniertes Verhalten aufweist.LiveScript,
243236233228219225 BytesSo funktioniert es: Meistens wie der Java-Code. Beginnen Sie mit Aliasing-Länge (LiveScript ermöglicht das Erstellen einer Funktion aus Operatoren mithilfe von Klammern).
.=
ista = a.b
- was wir hier verwenden, um abzubilden.=> blabla ..
ist das Smalltalk-ish-Kaskadenkonstrukt: die linke Seite von=>
ist zugänglich wie..
für den Rest des Blocks; und wird zurückgegeben. Hier ist es das Element, das auf k aufgeteilt ist. Hinweis: Ich verwende die Zeichenfolgeninterpolation, da dies/
nur "Teilen" mit einer Literalzeichenfolge bedeutet.LS erlaubt es uns auch
a-=/regexp/
in diesem Lambda zu verwenden (funktioniert auch mit String-Literalen): Es ist nur Zucker für einen.replace
Anruf.Schließlich ist das
>?=
der kombinatorische>?
-assin-Operator, der den größeren von zwei Operanden zurückgibt.LS hat einen Python / Haskell-Stil für das Verständnis, in dem nichts Besonderes vorkommt, außer die "string * times", um das Leerzeichen lange genug zu wiederholen.
Dies dient zum Verständnis als Thema (siehe Block über Kaskaden weiter oben).
Wir durchlaufen dann jedes Element des Arrays (das, das wir gerade mit dem Verständnis erstellt haben), und wenn eine Zeile größer als 93 Zeichen ist, finden wir den letzten Index von, teilen ihn dort auf und verschieben die getrennte Zeile direkt nach dieser aktuellen Iteration ( ... Damit die nächste Iteration wieder geteilt wird, wenn die Zeile zu groß ist).
Nur letzte , was Phantasie
a[j to]
ist ein Bereich (von j bis zum Ende), aber da es Array Methoden verwendet haben wir es wieder in einen String zu verbinden, die wir überlasten tun Verwendung*
:*''
.Beispiel
Ausgabe:
quelle
Java, 347 + 19 = 366 Bytes
Benötigt
Also die +19 Bytes.
Nimmt das Format auf
f.accept(List<String> code, String seperator)
. Formate vorhanden. Eine Version, die eine neue erstellt und zurückgibtList<String>
, ist zwar einfach zu implementieren, kostet jedoch einige Bytes.Einrückung + Beispielverwendung:
... sollte ich das wohl durchgehen lassen: P
quelle
replace(" *"+s)
es nicht funktioniert,replaceAll(" *"+s)
ich es aber gerne hören würde, kann ich es nicht herausfinden.replace
verwendet Strings, aberreplaceAll
Regexes. </ badguess>PowerShell,
224217235 ByteDie Logik wurde aktualisiert, um die maximale Länge der Codezeichenfolge zu bestimmen. Aktualisiert, um mehrere Trennzeichen zuzulassen, die reguläre Metazeichen enthalten.
Kleine Erklärung
Dies nimmt eine durch Zeilenumbrüche getrennte Zeichenfolge für die Eingabe auf.
Beispielausgabe mit etwas Lorem Ipsum
quelle
MATLAB,
270265262 BytesDas Programm akzeptiert die Eingabe
I
in Form eines Zellenarrays von Zeichenfolgen, wobei jedes Element des Zellenarrays eine separate Zeile der Eingabe ist. Es akzeptiert auch eine zweite Eingabe, die angibt, was das Kommentarzeichen ist (dh#
). Die Funktion gibt eine mehrzeilige Zeichenfolge zurück, die ordnungsgemäß formatiert ist.Kurze Erklärung
Beispiel Eingabe
Beispielausgabe
quelle