Ihre Aufgabe besteht diesmal darin, eine Variante des POSIX- expand(1)
Dienstprogramms zu implementieren, mit der Tabulatoren auf Leerzeichen erweitert werden.
Ihr Programm besteht darin, eine Tabstop-Spezifikation zu verwenden und dann die Eingabe für Standard-In zu lesen und Tabulatorzeichen in der Eingabe durch die entsprechende Anzahl von Leerzeichen zu ersetzen, um zum nächsten Tabstop zu gelangen. Das Ergebnis sollte auf Standard out geschrieben werden .
Tabstop-Spezifikation
Eine Tabstop-Spezifikation besteht entweder aus einer einzelnen Zahl oder einer durch Kommas getrennten Liste von Tabstops. Im Fall einer einzelnen Zahl wird sie wiederholt, als ob ein Vielfaches davon in einer durch Kommas getrennten Liste vorkommt (dh 4
als 4,8,12,16,20,...
). Jeder Eintrag in einer durch Kommas getrennten Liste ist eine positive Ganzzahl, der optional ein a vorangestellt ist +
. Ein +
Präfix gibt einen relativen Unterschied zum vorherigen Wert in der durch Kommas getrennten Liste an. Der erste Wert in der Liste muss absolut sein (dh nicht vorfixiert). Die Tabstops geben die Spalte des nächsten Nicht-Leerzeichens (nach dem erweiterten Tabulator) an, wobei die Spalte ganz links als Nummer 0 verwendet wird. Tabulatoren sollten immer auf mindestens ein Leerzeichen erweitert werden.
Input-Output
Die Tabstop-Spezifikation kann nach Ihrem Ermessen entweder als erster Befehlszeilenparameter für das Programm verwendet oder vom Standard als erste Eingabezeile (abgeschlossen durch eine neue Zeile) eingelesen werden. Nachdem der Tabstop gelesen wurde, soll die verbleibende Eingabe (im ersten Fall alle Eingaben) bis zur Verarbeitung von EOF verarbeitet und erweitert werden. Die erweiterte Ausgabe wird auf Standard ausgeschrieben.
Es wird angenommen, dass alle erweiterten Tabstops und alle Eingaben maximal 80 Spalten breit sind. Alle erweiterten Tabstops nehmen strikt zu.
Beispiel
Die Tabstop-Spezifikation 4,6,+2,+8
entspricht 4,6,8,16
und mit beiden Eingaben
ab<Tab>c
<Tab><Tab>d<Tab>e<Tab>f
wird erweitert in ( ␣
zeigt ein Leerzeichen an)
ab␣␣c
␣␣␣␣␣␣d␣e␣␣␣␣␣␣␣f
01234567890123456 (Ruler for the above, not part of the output)
1111111
Scoring ist reines Code-Golf ; kürzester Code gewinnt.
quelle
x+($1?i:0)
als die kürzere schreiben$1?x+i:x
?:
) auch den Anfang eines Symbols markieren kann. Da ein Symbol jedoch nicht mit einer Ziffer beginnen kann,:0
ist es ohne Leerzeichen in Ordnung. Oder so. Es ist komisch. Die Klammern sind auch entscheidend, wie es scheint.t<<x+($1?i:0);i=x
der ersten Aussage ändert sich nichtsx
, oder? Ich denke, Sie müssen es umkehren alsi=x+($1?i:0);t<<i
i=t=[]
(dai
dies beim ersten Mal garantiert nicht benötigt wird). Vereinfachung der Tab-Stop-Analyse{t<<i=$2.to_i+($1?i:0)}
undl
vollständige Eliminierung (i
enthält diesen Wert bereits). Aber schön, dass Sie sich nicht darum kümmern, dass der Tab nicht mehr ständig zunimmt: Das spart Ihnen 4 Zeichen, und ich kann ihn ausleihen, um 2 zu sparen.C 228 Zeichen
Hier ist eine C-Lösung, um die Dinge zu starten. Hier gibt es noch viel Golf zu spielen (schauen Sie sich all diese
if
s undfor
s undputchar
s an ...). Getestet mit dem Beispieltestfall sowie mit derselben Eingabe, jedoch4
und8
für die Registerkartenspezifikation.quelle