Ihre Aufgabe ist es, ein Programm zu implementieren, das dem nl
Befehlszeilentool der GNU-Kerndienstprogramme ähnelt .
Standardlücken sind verboten.
Sie dürfen keine eingebauten oder externen Funktionen, Programme oder Hilfsprogramme zum Nummerieren der Zeilen einer Datei oder eines Strings verwenden, wie z. B. sich nl
selbst oder den =
Befehl in GNU sed.
Spezifikation
Eingang
Das Programm akzeptiert Dateinamen als Argumente. Ihr Code muss nicht plattformübergreifend sein. Das Dateinamenformat des Betriebssystems, auf dem der Code ausgeführt wird, sollte verwendet werden. Wenn Sie sich also unter Windows befinden, kann das Verzeichnistrennzeichen \
oder sein /
.
Sie müssen in der Lage sein, 64 Eingabedateien aufzunehmen, auch -
wenn diese angegeben sind. Wenn mehr als 64 angegeben sind, behandeln Sie nur die ersten 64.
Stellt in der Liste der Dateinamen -
die Standardeingabe dar.
Wenn Dateinamen angegeben werden, lesen Sie diese in der angegebenen Reihenfolge aus und verketten Sie ihren Inhalt, indem Sie jeweils eine neue Zeile zwischen und am Ende einfügen. Wenn Sie einen oder mehrere Dateinamen nicht lesen können (weil die Datei nicht vorhanden ist oder Sie keine Leseberechtigung dafür haben), ignorieren Sie sie. Wenn alle angegebenen Dateinamen ungültig sind, wird nichts ausgegeben.
Wenn keine Dateinamen angegeben sind, lesen Sie von der Standardeingabe. Lesen Sie von der Standardeingabe nur, wenn keine Dateinamen angegeben sind oder wenn -
angegeben.
Ausgabe
Das Programm wird ausgegeben, auf der Standardausgabe, die Eingabe mit Linien so nummeriert (Sie gehen davon aus , dass der Eingang hat \n
, \r\n
oder \r
Zeilenende, wählen je nachdem , was für Sie bequem ist, aber angeben , welche):
<5 spaces>1<tab><content of line 1 of input>
<5 spaces>2<tab><content of line 2 of input>
...
<4 spaces>10<tab><content of line 10 of input>
...
<3 spaces>100<tab><content of line 100 of input>
...
...
Die Zeilennummer wird mit 6 Leerzeichen versehen und am Ende dieser Zeichen eingefügt. Der Rest wird zu Leerzeichen (z. B. 1
5 führende Leerzeichen, 22
4 führende Leerzeichen, ...). Wenn die Eingabe ausreichend lang ist, ist möglicherweise nicht mehr genügend Platz für die Zeilennummer in Zeile vorhanden 999999
. Sie dürfen nach Zeile 999999 nichts mehr ausgeben.
Wenn die Eingabe leer ist, wird nichts ausgegeben.
Beenden Sie den Status
Die niedrigeren Zahlen haben Vorrang: Wenn Fehler 1 und 2 aufgetreten sind, beenden Sie mit Status 1.
Beenden Sie mit dem Status 0, wenn die Eingabe erfolgreich empfangen und die Zeilen erfolgreich nummeriert und ausgegeben wurden.
Beenden Sie mit Status 1, wenn eine oder mehrere der in der Befehlszeile angegebenen Dateien nicht gefunden wurden oder nicht gelesen werden konnten.
Beenden Sie mit Status 2, wenn zu viele Dateien (mehr als 64) angegeben wurden.
Beenden Sie mit Status 3, wenn die Eingabe zu lang war (mehr als 999999 Zeilen). \
Wertung
Das ist Code-Golf - das kürzeste Programm gewinnt!
Ich kann später Boni für die Implementierung bestimmter Optionen hinzufügen, die nl
hat. Im Moment gibt es keine Boni.
prompt()
Programmargumente und stdin emulieren?Antworten:
Bash, 121
quelle
if
Ausdrücke etwas kürzer machen, wenn Sie arithmetische Ausdrücke verwenden, z. B.(($#>64))&&s=2
s=0;(($#>64))&&s=2
mits=$[2*($#>64)]
,(($s==0))||
mit((s))&&
und dieif
Anweisung mit ersetzen[ -f "$f" ]||s=1
.awk
Wird auch verkettet, wenn mehrere Dateien übergeben werden, so gilt dies offiziell als nutzlose Verwendung von cat ;-). Stattdessen denke ich, dass dies funktionieren wird:awk '...' $@
Rubin, 195
quelle
STDIN
ist voreingenommen$<
.ARGF
, der auch aus den übrigen als Argumente angegebenen Dateien liest. Ich denke, das kann man irgendwie weiter mit Golf spielenARGF
(es scheint sogar als Standard zu gelten"-"
).block in <main>': undefined method
[] 'für # <Enumerator: 0x000006002980c8> (NoMethodError) von britishteanl: 2: ineach' from britishteanl:2:in
<main>' - was ist falsch? Ich lief es alsruby britishteanl folder/filename
Perl, 84 + 2 (
-pl
) = 86 BytesDeparsed:
Wichtig zu wissen:
-p
bricht das angegebene Programm mit-e
in diewhile
/continue
Schleife einBEGIN
Code wird vor dem (impliziten) Hauptteil ausgeführt-r
schlägt auch fehl, wenn die Datei nicht vorhanden ist!-e
$_
Standardwert ist testing , implizit angegeben inmap { ... } @ARGV
$.
Enthält die aktuelle Zeilennummerquelle
Python 173
quelle
-
fürsys.stdin
. Eine mögliche Lösung könnte so etwas seinfh=sys.stdin if f=='-' else open(f)
und dann mitgehenx=fh.readline()
?! Leider wird es dadurch nicht kürzer. :)J (162)
Erläuterung:
]`(]&<&'-')@.(0=#)2}.ARGV
: Rufen Sie die Befehlszeilenargumente ab und entfernen Sie die ersten beiden (da dies der Interpreter und der Name der Skriptdatei sind). Wenn die resultierende Liste leer ist, geben Sie zurück['-']
(dh als ob der Benutzer nur bestanden hätte-
), andernfalls geben Sie die Liste unverändert zurück.(
...::1:)
: Wenn die innere Funktion fehlschlägt, kehren Sie zurück1
, andernfalls kehren Sie zurück, was auch immer die innere Funktion zurückgegeben hat.((2*64<#)[
...)
: die innere Funktion bewerten und das Ergebnis wegwerfen. Wenn dann die Länge der übergebenen Liste nicht größer als war64
, kehren Sie zurück0
, andernfalls kehren Sie zurück2
.&.>@;@{.@(_64&(<\))
: Hole höchstens64
Elemente aus der Liste und führe für jedes die folgende Funktion aus:(1!:1)@(<`3:@.('-'-:]))
: Wenn das Element war-
, lesen Sie den Inhalt des Dateideskriptors3
(stdin), andernfalls lesen Sie den Inhalt der Datei, die von diesem Element benannt wurde. Wenn dies fehlschlägt (dh die Datei existiert nicht), wird sie vom obigen Code abgefangen und zurückgegeben1
.exit@3:`(
...)@.(1e6>#)@(<;.2)
: Teilen Sie die Zeichenfolge an den Zeilenenden. Wenn es 1.000.000 oder mehr Zeilen gibt, beenden Sie mit dem Status3
. Andernfalls:,&TAB@(6&":)&.>@>:@i.@#
: Generieren Sie die Zahlen für jede Zeile, formatieren Sie sie in einer 6-stelligen Spalte und fügen Sie a hinzuTAB
am Ende jeder Zeichenfolge ein hinzu.,&.>]
: füge jede Zahl vor jeder Zeile hinzu.stdout@(,&LF)@;
: dann das Ganze ausgeben, gefolgt von einem ExtraLF
.exit
: exit mit dem Rückgabewert dieser Funktionquelle
Ruby, 76 Bytes
Ein Byte für die
p
Flagge. Laufen Sie mitruby -p nl.rb
.Standard- oder Dateiargumente werden automatisch von Ruby behandelt. Es wird bereits mit Code 1 beendet, wenn kein Dateiargument vorhanden ist.
$.
ist die Anzahl der gelesenen Zeilen.$*
sind die Befehlszeilenargumente, und die Dateien werden beim Lesen entfernt. Dasp
Flag führt denBEGIN
Block aus und schließt den Rest des Programms in eine while-gets-print-Schleife ein, wobei es$_
als Ein- / Ausgabe verwendet wird.quelle
Perl,
125122 Bytesquelle
C
362359Einfach nur so. ;-) Funktioniert mit LF- oder CR / LF-Zeilenvorschüben.
quelle