Twoim zadaniem jest wdrożenie programu podobnego do nl
narzędzia wiersza poleceń z podstawowych narzędzi GNU.
Standardowe luki są zabronione.
Nie możesz używać żadnej wbudowanej lub zewnętrznej funkcji, programu lub narzędzia do numerowania linii pliku lub łańcucha, takich jak on nl
sam lub =
polecenie w GNU sed.
Specyfikacja
Wejście
Program akceptuje nazwy plików jako argumenty. Twój kod nie musi być wieloplatformowy; należy zastosować format nazwy pliku systemu operacyjnego z uruchomionym kodem, tzn. jeśli zdarzyło Ci się być w systemie Windows, separatorem katalogów może być \
lub /
.
Musisz mieć możliwość pobrania 64 plików wejściowych, w tym -
jeśli jest to określone. Jeśli podano więcej niż 64, obsłuż tylko pierwsze 64.
Na liście nazw plików -
reprezentuje standardowe dane wejściowe.
Jeśli podano nazwy plików, czytaj z plików w kolejności, w jakiej zostały podane, i konkatenuj ich zawartość, wstawiając nowy wiersz między nimi i na końcu. Jeśli nie możesz odczytać z jednego lub więcej nazw plików (ponieważ plik nie istnieje lub nie masz do niego uprawnień do odczytu), zignoruj je. Jeśli wszystkie podane nazwy plików są niepoprawne, nie wysyłaj nic.
Jeśli nie podano nazw plików, czytaj ze standardowego wejścia. Czytaj ze standardowego wejścia tylko wtedy, gdy nie podano nazw plików lub jeśli -
podano.
Wynik
Wyjście programu wola, na standardowe wyjście, wejście z liniami numerowane w ten sposób (Można zakładać, że wejście ma \n
, \r\n
lub \r
końca linii; odebrać w zależności co jest wygodne dla Ciebie, ale określić, który z nich):
<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>
...
...
6 znaków spacji jest przypisanych do numeru linii i jest on wstawiany na końcu tych znaków; reszta staje się polami (np. 1
będzie miała 5 pól wiodących, 22
będzie miała 4 pola wiodące, ...). Jeśli dane wejściowe są wystarczająco długie, w końcu zabraknie miejsca na numer linii w linii 999999
. Nie możesz niczego wypisywać po wierszu 999999.
Jeśli wejście jest puste, nie wysyłaj nic.
Wyjdź ze statusu
Niższe liczby mają pierwszeństwo: jeśli napotkano błędy 1 i 2, należy wyjść ze statusem 1.
Wyjdź ze statusem 0, jeśli wejście zostało pomyślnie odebrane, a linie pomyślnie ponumerowane i wyprowadzone.
Wyjdź ze statusem 1, jeśli co najmniej jeden z plików określonych w wierszu poleceń nie został znaleziony lub nie można go odczytać.
Wyjdź ze statusem 2, jeśli podano zbyt wiele plików (więcej niż 64).
Wyjdź ze statusem 3, jeśli dane wejściowe były zbyt długie (ponad 999999 linii). \
Punktacja
To jest golf golfowy - wygrywa najkrótszy program!
Mogę dodać bonusy później za wdrożenie niektórych opcji, które nl
ma. W tej chwili nie ma żadnych bonusów.
prompt()
emulować argumenty programu i standardowe wyjście?Odpowiedzi:
Bash, 121
źródło
if
wyrażenia będą nieco krótsze, jeśli użyjesz wyrażeń arytmetycznych, np.(($#>64))&&s=2
s=0;(($#>64))&&s=2
zs=$[2*($#>64)]
,(($s==0))||
z((s))&&
, aif
oświadczenie z[ -f "$f" ]||s=1
.awk
połączy także wiele plików, więc oficjalnie liczy się to jako bezużyteczne użycie cat ;-). Zamiast tego myślę, że to zadziała:awk '...' $@
Ruby, 195
źródło
STDIN
jest alias do$<
.ARGF
, który odczyta również z pozostałych plików podanych jako argumenty. Myślę, że można toARGF
jakoś pograć w golfa (wydaje się nawet rozpoznawać"-"
jako standardowe).block in <main>': undefined method
[] 'for # <Enumerator: 0x000006002980c8> (NoMethodError) from britishteanl: 2: ineach' from britishteanl:2:in
<main>' - co jest nie tak? Uruchomiłem jakoruby britishteanl folder/filename
Perl, 84 + 2 (
-pl
) = 86 bajtówWydzielono:
Ważne, aby wiedzieć:
-p
otacza program podany-e
w pętliwhile
/continue
BEGIN
kod zostanie wykonany przed (domyślną) częścią główną-r
również kończy się niepowodzeniem, jeśli plik nie istnieje!-e
i domyślnie jest testowany$_
, domyślnie podany wmap { ... } @ARGV
$.
przechowuje bieżący numer liniiźródło
python 173
źródło
-
dlasys.stdin
. Możliwym rozwiązaniem może być coś takiego,fh=sys.stdin if f=='-' else open(f)
a potem iśćx=fh.readline()
? Niestety nie czyni go to jednak krótszym. :)J (162)
Wyjaśnienie:
]`(]&<&'-')@.(0=#)2}.ARGV
: Pobierz argumenty wiersza poleceń i usuń dwa pierwsze (ponieważ są to interpreter i nazwa pliku skryptu). Jeśli wynikowa lista jest pusta, zwróć['-']
(tzn. Jakby użytkownik tylko zdał-
), w przeciwnym razie zwróć listę bez zmian.(
...::1:)
: jeśli funkcja wewnętrzna zawiedzie, wróć1
, w przeciwnym razie zwróć wszystko, co funkcja wewnętrzna zwróciła.((2*64<#)[
...)
: oceń funkcję wewnętrzną i wyrzuć wynik. Następnie, jeśli długość przekazanej listy nie była większa niż64
, zwróć0
, w przeciwnym razie zwróć2
.&.>@;@{.@(_64&(<\))
: pobierz co najwyżej64
elementy z listy i dla każdego z nich uruchom następującą funkcję:(1!:1)@(<`3:@.('-'-:]))
: jeśli elementem był-
, przeczytaj zawartość deskryptora pliku3
(stdin), w przeciwnym razie przeczytaj zawartość pliku nazwanego przez ten element. Jeśli to się nie powiedzie (tzn. Plik nie istnieje), powyższy kod go złapie i zwróci1
.exit@3:`(
...)@.(1e6>#)@(<;.2)
: podziel ciąg na końcach linii. Jeśli jest 1 000 000 lub więcej linii, zakończ ze statusem3
. Inaczej:,&TAB@(6&":)&.>@>:@i.@#
: wygeneruj liczby dla każdego wiersza, sformatuj je w 6-cyfrowej kolumnie i dodaj aTAB
na końcu każdego ciągu,,&.>]
: dodaj każdy numer na początku każdej linii.stdout@(,&LF)@;
: następnie wypisz całość, a następnie dodatkowyLF
.exit
: wyjście z wartością zwracaną przez tę funkcjęźródło
Rubinowy, 76 bajtów
Jeden bajt dla
p
flagi. Uruchom zruby -p nl.rb
.Argumenty standardowe lub plikowe są obsługiwane automatycznie przez Ruby. Wychodzi już z kodem 1, jeśli argument pliku nie istnieje.
$.
to liczba przeczytanych wierszy.$*
to argumenty wiersza poleceń, a pliki są usuwane podczas odczytywania plików.p
Flaga wykonujeBEGIN
blok i zawija resztę programu wewnątrz pętli while-dostaje-Print, używając$_
jako wejścia / wyjścia.źródło
Perl,
125122 bajtówźródło
C
362359Tylko dla zabawy. ;-) Działa z kanałami liniowymi LF lub CR / LF.
źródło