Erfolgreiche Code-Golf-Einsendungen sind von Natur aus überall mit verrückten Symbolen gefüllt. Um ihre Einsendung verständlicher zu machen, geben viele Code-Golfer eine Erklärung ihres Codes an. In ihrer Erklärung wird die Codezeile in ein vertikal aufgelöstes Diagramm umgewandelt.
Zum Beispiel, wenn dies mein Code wäre:
1_'[3:~2@+]`
Eines der vielen möglichen Diagramme, die ich erstellen könnte, sieht folgendermaßen aus:
1
_'
[ ]
[3: ]
[ ~ ]
[ 2@ ]
[ +]
`
Das Ziel
In dieser Herausforderung schreiben Sie ein Tool zur automatischen Formatierung von Erklärungen, das eine Codezeile verwendet und ein Diagramm erstellt, zu dem leicht erklärender Text hinzugefügt werden kann.
Um dies zu einer nützlicheren Herausforderung zu machen , kann der Benutzer den Inhalt jeder Zeile angeben, indem er eine Formatierungszeichenfolge bereitstellt. Die Formatierungszeichenfolge ist eine zweite Zeile, die nur Buchstaben enthält A-Za-z
und dieselbe Länge wie das Programm hat. Die Buchstaben geben die Reihenfolge an, in der die Zeichen des Programms in der Erläuterung gedruckt werden sollen.
Hier ist ein Beispiel für E / A ohne eckige Formatierung :
123423
AabcBC
1
2
3
2
3
4
Klammern
Wenn mehr als ein Zeichen im Programm dieselbe Prioritätsstufe hat, fungiert dieser Zeichensatz als ein einzelner Codeblock (wenn sie eine Gruppe bilden) oder als ein Satz von Klammern (wenn sie dazwischen andere Zeichen enthalten). Die allgemeinen Regeln sind einfach:
Zeichen werden in einer Zeile des Diagramms erst angezeigt, wenn alle anderen Zeichen mit höherer Priorität bereits in den darüber liegenden Zeilen des Diagramms angezeigt wurden.
Zeichen gleicher Priorität werden immer in die gleichen Zeilen gedruckt. Wenn ein bestimmtes Zeichen in einer Zeile erscheint, erscheinen alle anderen Zeichen gleicher Priorität in der Zeile.
In jeder Zeile wird weiterhin eine Reihe von Zeichen mit gleicher Priorität angezeigt, bis alle anderen von ihr eingeschlossenen Zeichen mindestens einmal vorgekommen sind. Dies ermöglicht "klammerartige" Konstruktionen. Wenn
bceab
es sich um die Prioritäten handelt,b
erscheinen die Zeichen in der zweiten Zeile (sie haben die zweithöchste Priorität) und werden so lange angezeigt, bis allecea
Zeichen erschienen sind. Wenn die Prioritätszeichenfolge "" istabcadeafga
, werden allebcdefg
als darin enthalten betrachtet, und alle 4a
Sekunden werden weiterhin angezeigt, bis die Zeichenfolge ""g
angezeigt wurde.
Weitere Formatierungsanforderungen
Alle Ausgabezeilen sollten gleich lang sein (die Länge der Eingabezeilen) und bei Bedarf mit Leerzeichen aufgefüllt werden. Die Eingabeprogrammzeile kann Leerzeichen enthalten, diese Leerzeichen erhalten jedoch auch einen Prioritätsbuchstaben. Nachgestellte Zeilenumbrüche bei der Ausgabe / Eingabe sind optional.
Wertung
Das ist Codegolf, die wenigsten Bytes gewinnen.
Beispiele
Hier ist ein kommentiertes Beispiel für einen Code mit komplexerer Formatierung.
1_'[3:~2@+]`
abbcddeffgch
1 #highest priority is denoted by the lowercase letter a
_' #priority b
[ ] #all characters with priority c
[3: ] #priority d, but priority c still printed because it encloses more
[ ~ ] #priority e
[ 2@ ] #priority f
[ +] #priority g, last line of c because all enclosed characters have appeared
` #priority h
Ein Beispiel in Perl:
$_=<>;s/[^aeiou\W]/$&o$&/gi;print
aaaaaabbccccccccccbdddddbbbbeeeee
$_=<>;
s/ / /gi;
s/[^aeiou\W]/ /gi;
s/ /$&o$&/gi;
print
Hier einige Beispiele in CJam mit freundlicher Genehmigung von Martin Büttner:
l~2*{_2%{3*)}{2/}?_p_(}g;
aabbcdddefffeeggeehhiiccj
l~
2*
{ }g
{_2% }g
{ { }{ }? }g
{ {3*)}{ }? }g
{ { }{2/}? }g
{ _p }g
{ _(}g
;
q{_eu'[,66>"EIOU"-#)g{'o1$}*}/
abcccddddddeeeeeeefgghiijjhhbb
q
{ }/
{_eu }/
{ '[,66> }/
{ "EIOU"- }/
{ # }/
{ )g }/
{ { }*}/
{ {'o }*}/
{ { 1$}*}/
Hier ist ein verrücktes Beispiel, um sich mit dir herumzuschlagen:
1_'[3:~2@+]`
azTABACBDCAT
[ : ]
[3: 2 ]
[3:~2 +]
[ :~ @+]
' `
1
_
Hier ist ein expliziteres Beispiel dafür, was passiert, wenn sich Klammern überlappen abab
. (Normalerweise ist dies nicht die Art und Weise, wie Sie Ihre Erklärung formatieren würden.)
aabbccddaaeebb
aabbccddaaeebb
aa aa
aabb aa bb
aabbcc aa bb
aabb ddaa bb
bb eebb #"aa" no longer appears because all of "bbccdd" have already appeared.
quelle
oNo
kann durchn
in TIO ersetzt werden .CJam, 48 Bytes
Erläuterung
quelle
IDL 8,4,
316318304 BytesNeue Version, immer noch zu lang, aber kürzer! Und im wahren Sinne von IDL vollständig vektorisiert, was bedeutet (da es keine for-Schleife gibt), dass ich es jetzt als eine Zeile ausführen und auf sich selbst ausführen kann, sobald ich meine Version vollständig auf 8.4 aktualisiert habe. Das wird später bearbeitet.
Einzeilige Version:
Mit Zeilenumbrüchen (gleiche Anzahl von Bytes, Subbing \ n vs &) und Kommentaren:
Hier ist eine algorithmische Aufschlüsselung für Zeile 9:
... und 10:
Die Zeilen 9 und 10 erledigen die eigentliche Arbeit, der Rest legt die Variablen fest, die Sie für das Ende benötigen. Ich denke, das ist ungefähr so gut wie es nur geht. Ich kann nirgendwo anders etwas finden, um es besser zu machen.
Alte Version (hier ist alles veraltet):
Dies ist bei weitem nicht kurz genug, um zu gewinnen, denn dies ist eine schreckliche Golfsprache, aber niemand antwortet jemals in IDL, also werde ich es einfach versuchen.
Ich bin mir nicht sicher, ob es eine Möglichkeit gibt, es weiter zu reduzieren ... Ich könnte strmid gleichzeitig für a und b aufrufen, aber dann gebe ich mehr Bytes für die Indizierung von d aus und es funktioniert genauso. Ich werde aber weiter daran arbeiten! (Und morgen bearbeite ich in einer Erklärung den Algorithmus.)
quelle