Einige Leute bestehen darauf, Leerzeichen für Tabellierung und Einrückung zu verwenden.
Für die Tabellierung ist das unbestreitbar falsch. Per Definition müssen Tabulatoren für die Tabellierung verwendet werden.
Auch beim Einrücken sind Tabulatoren objektiv überlegen:
In der Stack Exchange-Community besteht ein klarer Konsens .
Die Verwendung eines einzelnen Einrückungsbereichs ist visuell unangenehm. mehr als eine zu verwenden ist verschwenderisch.
Da alle Dorsch
e Golfers wissen, Programme sollten so kurz wie möglich sein. Dies spart nicht nur Festplattenspeicher, sondern auch Kompilierungszeiten, wenn weniger Bytes verarbeitet werden müssen.Durch Anpassen der Registerbreite 1 sieht dieselbe Datei auf jedem Computer anders aus, sodass jeder seine bevorzugte Einzugsbreite verwenden kann, ohne die eigentliche Datei zu ändern.
Alle guten Texteditoren verwenden standardmäßig Tabulatoren (und Definitionen).
Ich sage es und ich habe immer Recht!
Leider hört nicht jeder auf die Vernunft. Jemand hat Ihnen eine Datei geschickt, die es falsch macht TM und Sie müssen es reparieren. Du könntest es einfach manuell machen, aber es wird andere geben.
Es ist schon schlimm genug, dass Spacer Ihre kostbare Zeit verschwenden, und Sie entscheiden sich, das kürzestmögliche Programm zu schreiben, um das Problem zu beheben.
Aufgabe
Schreiben Sie ein Programm oder eine Funktion, die Folgendes bewirkt:
Lesen Sie eine einzelne Zeichenfolge entweder aus STDIN oder als Befehlszeilen- oder Funktionsargument.
Identifizieren Sie alle Stellen, an denen Leerzeichen für die Tabellierung oder Einrückung verwendet wurden.
Ein Leerzeichen ist ein Einzug, wenn er am Anfang einer Zeile steht.
Eine Folge von zwei oder mehr Leerzeichen ist eine Tabellierung, wenn es sich nicht um Einrückungen handelt.
Ein einzelnes Leerzeichen, das kein Einzug ist, wurde möglicherweise nicht für die Tabellierung verwendet. Wenn Sie dasselbe Zeichen für verschiedene Zwecke verwenden, gibt es erwartungsgemäß keine einfache Möglichkeit, dies zu erkennen. Deshalb werden wir sagen, dass der Raum für Verwirrung benutzt worden ist .
Bestimmen Sie die längste mögliche Tabulatorbreite 1, für die alle für Tabulatoren oder Einrückungen verwendeten Leerzeichen durch Tabulatoren ersetzt werden können, ohne das Erscheinungsbild der Datei zu ändern.
Wenn die Eingabe weder Tabulatoren noch Einrückungen enthält, kann die Tabulatorenbreite nicht bestimmt werden. Überspringen Sie in diesem Fall den nächsten Schritt.
Ersetzen Sie unter Verwendung der zuvor festgelegten Tabulatorbreite alle für die Tabellierung oder Einrückung verwendeten Leerzeichen durch Tabulatoren.
Ersetzen Sie außerdem, wann immer dies möglich ist, ohne das Erscheinungsbild der Datei zu ändern, alle Leerzeichen, die zur Verwechslung verwendet werden, durch Tabulatoren. (Wenn Sie Zweifel haben, entfernen Sie Leerzeichen.)
Geben Sie den geänderten String aus Ihrer Funktion zurück oder drucken Sie ihn an STDOUT.
Beispiele
Alle Räume von
a bc def ghij
sind tabellarisch.
Bei jedem Durchlauf von Leerzeichen wird die vorhergehende Zeichenfolge mit Nicht-Leerzeichen bis zu einer Breite von 5 aufgefüllt, sodass die richtige Tabulatorbreite 5 und die richtige Ausgabe 2 ist
a--->bc-->def->ghij
Die ersten beiden Räume von
ab cde f ghi jk lm
sind tabellarisch, die anderen verwirrt.
Die richtige Registerbreite ist 4, die richtige Ausgabe 2 also
ab->cde>f ghi>jk lm
Das letzte Leerzeichen bleibt unangetastet, da es als zwei Leerzeichen dargestellt wird, wenn es durch einen Tabulator ersetzt wird:
ab->cde>f ghi>jk->lm
Alle bis auf ein Leerzeichen
int main( ) { puts("TABS!"); }
sind Einrückung, der andere ist Verwirrung.
Die Einbuchtung Ebene 0, 4 und 8 Felder, so dass die korrekte Tabulatorbreite 4 ist und die korrekte Ausgabe 2 ist
int --->main( ) --->{ --->--->puts("TABS!"); --->}
Das Feld in
( )
würde als drei Felder dargestellt, wenn es durch einen Tabulator ersetzt würde. Es bleibt also unberührt.Die ersten beiden Räume von
x yz w
sind Einrückung, die anderen Verwirrung.
Die richtige Registerbreite ist 2 und die richtige Ausgabe 2 ist
->x>yz w
Das letzte Leerzeichen wird als zwei Leerzeichen dargestellt, wenn es durch einen Tabulator ersetzt wird. Es bleibt also unberührt.
Die ersten beiden Räume von
xy zw
sind Einrückungen, die anderen drei sind Tabellierungen.
Nur eine Tabulatorbreite von 1 erlaubt es, alle Leerzeichen zu entfernen, sodass die richtige Ausgabe 2 vorliegt
>>xy>>>zw
Alle Räume von
a b c d
sind Verwirrung.
Es gibt keine möglichst lange Tabulatorbreite, so dass die korrekte Ausgabe 2 ist
a b c d
Zusätzliche Regeln
Die Eingabe besteht ausschließlich aus druckbaren ASCII-Zeichen und Zeilenvorschüben.
Sie können davon ausgehen, dass maximal 100 Textzeilen und maximal 100 Zeichen pro Zeile vorhanden sind.
Wenn Sie STDOUT für die Ausgabe wählen, können Sie einen einzelnen nachgestellten Zeilenvorschub drucken.
Es gelten die Standardregeln für Code-Golf .
1 Die Tabulatorbreite ist definiert als der Abstand in Zeichen zwischen zwei aufeinander folgenden Tabulatoren unter Verwendung einer monospaced Schriftart.
2 Die ASCII-Kunstpfeile stellen die Tabulatoren dar, die Stack Exchange nicht ordnungsgemäß rendern kann, für die ich einen Fehlerbericht eingereicht habe. Die eigentliche Ausgabe muss eigentliche Tabulatoren enthalten.
quelle
programs should be as short as possible
Ich glaube, ich habe Arthur Whitneys längst verschollenen Bruder gefunden !!Antworten:
Pyth,
102103 BytesProbieren Sie es online
Interessante Idee, da aber Tabulatoren in der Eingabe das Konzept sprengen, wenig brauchbar.
Bearbeiten: Fehler behoben. vielen dank @aditsu
quelle
PowerShell,
414409 ByteIch ging voran und benutzte Zeilenumbrüche anstatt
;
wo möglich, um die Anzeige zu vereinfachen. Ich verwende Unix-Zeilenenden, daher sollte dies keinen Einfluss auf die Byteanzahl haben.Wie man ausführt
Kopieren Sie den Code in die
SpaceMadness.ps1
Datei und leiten Sie die Eingabe in das Skript. Ich gehe davon aus, dass die zu konvertierende Datei heißttaboo.txt
:Aus PowerShell:
Von der Eingabeaufforderung:
Ich habe es mit PowerShell 5 getestet, aber es sollte mit 3 oder höher funktionieren.
Testen
Hier ist ein kurzer PowerShell-Scrip, mit dem Sie die oben genannten Funktionen testen können:
Legen Sie dies in das gleiche Verzeichnis wie
SpaceMadness.ps1
, ich nenne es diesestester.ps1
, nennen Sie es wie folgt:Du hast die Idee. Es spuckt den Inhalt jeder Datei nach der Konvertierung aus und durchläuft
[RegEx]::Escape()
diese, wobei sowohl Leerzeichen als auch Tabulatoren ausgeblendet werden, so dass es sehr praktisch ist, zu sehen, was tatsächlich geändert wurde.Die Ausgabe sieht folgendermaßen aus (aber mit Farben):
Erläuterung
Die allererste Zeile definiert
g
so kurz wie möglich die größte gemeinsame Faktor / Divisor-Funktion , die ein Array (eine beliebige Anzahl von Zahlen) aufnimmt und GCD rekursiv mit dem euklidischen Algorithmus berechnet .Ziel war es, die "größtmögliche Tabulatorbreite" zu ermitteln, indem der Index + die Länge aller in der Frage definierten Einrückungen und Tabulatoren genommen und dann dieser Funktion zugeführt wurden, um die GCD zu erhalten, die meines Erachtens die beste ist, die wir können für die Tabulatorbreite tun. Die Länge einer Verwechslung ist immer 1, daher trägt sie nichts zu dieser Berechnung bei.
$b
definiert einen Scriptblock, weil ich diesen Code ärgerlicherweise zweimal aufrufen muss, um so einige Bytes zu sparen. Dieser Block nimmt den String (oder das Array von Strings)$n
und führt einen regulären Ausdruck darauf (sls
oderSelect-String
) aus, der Übereinstimmungsobjekte zurückgibt. Ich erhalte hier tatsächlich sowohl Einrückungen als auch Tabellierungen in einer, was mir zusätzliche Verarbeitung erspart hat, da ich sie separat erfasst habe.$n
wird für verschiedene Dinge innerhalb und außerhalb der Hauptschleife verwendet (wirklich schlecht, aber hier notwendig, damit ich es in$b
den Skriptblock einbetten und das sowohl innerhalb als auch außerhalb der Schleife ohne langeparam()
Deklaration und Übergabe von Argumenten verwenden kann.$s
Die Tabulatorbreite wird zugewiesen, indem der$b
Block in dem Zeilenarray in der Eingabedatei aufgerufen, dann der Index und die Länge jeder Übereinstimmung summiert und das Array der Summen als Argument in die GCD-Funktion zurückgegeben wird. So$s
hat die Größe unserer Tabs jetzt aufgehört.Dann beginnt die Schleife. Wir iterieren über jede Zeile im Array der Eingabezeilen
$n
. Das erste, was ich in der Schleife mache, ist,$n
den Wert der aktuellen Zeile aus dem oben genannten Grund zuzuweisen (lokaler Bereich).$w
Ruft den Wert des Scriptblock-Aufrufs nur für die aktuelle Zeile ab (die Einrückungen und Tabellen für die aktuelle Zeile).$c
bekommt einen ähnlichen Wert, aber stattdessen finden wir alle Verwirrungen .Ich addiere
$w
und$c
welche Arrays sind, und gebe mir ein Array mit allen benötigten Speicherplatzübereinstimmungen,sort
in absteigender Reihenfolge nach Index, und beginne, über jede Übereinstimmung für die aktuelle Zeile zu iterieren.Die Art ist wichtig. Schon früh habe ich herausgefunden, wie schwierig es ist, Teile eines Strings basierend auf Indexwerten zu ersetzen, wenn der Ersetzungsstring kleiner ist und die Länge des Strings ändert! Die anderen Indizes werden ungültig. Wenn ich also mit den höchsten Indizes in jeder Zeile beginne, stelle ich sicher, dass ich die Zeichenfolge nur vom Ende kürzer mache und rückwärts gehe, damit die Indizes immer funktionieren.
In dieser Schleife
$x
befindet sich im Index der aktuellen Übereinstimmung$l
die Länge der aktuellen Übereinstimmung.$s
kann in der Tat sein0
und das verursacht einen lästigen Division durch Null Fehler, also überprüfe ich auf seine Gültigkeit und mache dann die Mathematik.Das
!(($x+$l)%$s)
Bit dort ist der einzelne Punkt, an dem ich überprüfe, ob eine Verwirrung durch einen Tabulator ersetzt werden soll oder nicht. Wenn der Index plus die durch die Tabulatorbreite geteilte Länge keinen Rest enthält, sollten Sie diese Übereinstimmung durch einen Tabulator ersetzen (diese Mathematik funktioniert immer für die Einrückungen und Tabulatoren , da ihre Größe die Tabulatorbreite bestimmt hat beginnen mit).Beim Ersetzen wirkt sich jede Iteration der Übereinstimmungsschleife auf die aktuelle Zeile der Eingabe aus, sodass es sich um eine kumulative Menge von Ersetzungen handelt. Der reguläre Ausdruck sucht nur nach
$l
Leerzeichen, denen ein$x
beliebiges Zeichen vorangestellt ist . Wir ersetzen es durch$l/$s
Tabulatorzeichen (oder 1, wenn diese Zahl unter Null liegt).Dieser Teil
(($l/$s),1-ge1)[0]
ist eine ausgefallene gewundene Redewendungif (($l/$s) -lt 0) { 1 } else { $l/$s }
oder alternativ[Math]::Max(1,($l/$s))
. Es erstellt ein Array aus$l/$s
und1
verwendet dann-ge 1
, um ein Array zurückzugeben, das nur die Elemente enthält, die größer oder gleich eins sind, und nimmt dann das erste Element. Es kommt in ein paar Bytes kürzer als die[Math]::Max
Version.Sobald alle Ersetzungen abgeschlossen sind, wird die aktuelle Zeile aus der
ForEach-Object
(%
) -Iteration zurückgegeben, und wenn alle zurückgegeben werden (ein Array von festen Zeilen), werden sie-join
mit Zeilenumbrüchen versehen (da wir am Anfang auf Zeilenumbrüche aufgeteilt haben).Ich habe das Gefühl, dass es hier Raum für Verbesserungen gibt, für die ich zu ausgebrannt bin, aber vielleicht sehe ich etwas später.
quelle
PHP -
278210 BytesDie Funktion testet jede Registerbreite, beginnend mit dem Wert 100, der maximalen Länge einer Zeile und damit der maximalen Registerbreite.
Für jede Registerbreite teilen wir jede Zeile in "Blöcke" dieser Länge. Für jeden dieser Blöcke:
Sobald alle Blöcke einer Zeile analysiert wurden, speichern wir einen Zeilenvorschub. Wenn alle Blöcke aller Zeilen erfolgreich analysiert wurden, geben wir die gespeicherte Zeichenfolge zurück. Andernfalls, wenn jede streng positive Tabulatorbreite ausprobiert wurde, gab es weder eine Tabellierung noch eine Einrückung, und wir geben die ursprüngliche Zeichenfolge zurück.
Hier ist die ungolfed Version:
Besonderer Dank geht an DankMemes für die Einsparung von 2 Bytes.
quelle
for($t=101;--$t;)
anstelle vonfor($t=100;$t;--$t)
CJam, 112
Probieren Sie es online aus
Ich musste diese Herausforderung annehmen, weil ich meinen Teil dazu beitragen musste, die Welt von diesem Gräuel zu befreien. Tabs sind offensichtlich überlegen, aber leider können einige Leute einfach nicht mit ihnen argumentiert werden.
Erläuterung:
quelle
PowerShell ,
165160153152142138137 ByteProbieren Sie es online!
Weniger golfen:
quelle