Tugas Anda adalah mengimplementasikan program yang mirip dengan nl
alat baris perintah dari utilitas inti GNU.
Celah standar dilarang.
Anda tidak boleh menggunakan fungsi, program, atau utilitas internal atau internal apa saja untuk memberi penomoran pada baris file atau string, seperti nl
itu sendiri atau =
perintah dalam GNU sed.
Spesifikasi
Memasukkan
Program menerima nama file sebagai argumen. Kode Anda tidak harus cross-platform; format nama file OS yang menjalankan kode harus digunakan, yaitu jika Anda kebetulan menggunakan Windows, pemisah direktori bisa \
atau /
.
Anda harus dapat mengambil 64 file input, termasuk -
jika ditentukan. Jika lebih dari 64 diberikan, hanya menangani 64 yang pertama.
Dalam daftar nama file, -
merupakan input standar.
Jika nama file diberikan, baca dari file sesuai urutannya dan gabungkan isinya, masukkan baris baru antara masing-masing dan di akhir. Jika Anda tidak dapat membaca dari satu atau beberapa nama file (karena file tersebut tidak ada atau Anda tidak memiliki izin untuk membacanya), abaikan saja. Jika semua nama file yang ditentukan tidak valid, tidak menghasilkan apa-apa.
Jika tidak ada nama file yang diberikan, baca dari input standar. Hanya baca dari input standar jika tidak ada nama file yang diberikan atau jika -
diberikan.
Keluaran
Program akan menampilkan, ke keluaran standar, input dengan garis-garis yang diberi nomor demikian (Anda dapat mengasumsikan bahwa input tersebut memiliki \n
, \r\n
atau \r
ujung garis; pilih mana yang sesuai untuk Anda, tetapi tentukan yang mana):
<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 karakter ruang dialokasikan untuk nomor baris, dan itu dimasukkan di akhir karakter ini; sisanya menjadi spasi (mis. 1
akan memiliki 5 ruang utama, 22
akan memiliki 4 ruang utama, ...). Jika input cukup panjang, Anda pada akhirnya akan kehabisan ruang untuk nomor baris, pada baris 999999
. Anda tidak boleh mengeluarkan apa pun setelah baris 999999.
Jika input kosong, tidak menghasilkan apa-apa.
Status keluar
Angka yang lebih rendah diprioritaskan: jika kesalahan 1 dan 2 ditemukan, keluar dengan status 1.
Keluar dengan status 0 jika input berhasil diterima, dan garis-garis berhasil diberi nomor dan keluaran.
Keluar dengan status 1 jika satu atau lebih file yang ditentukan pada baris perintah tidak ditemukan atau tidak dapat dibaca.
Keluar dengan status 2 jika terlalu banyak file (lebih dari 64) diberikan.
Keluar dengan status 3 jika inputnya terlalu panjang (lebih dari 999999 baris). \
Mencetak gol
Ini adalah kode-golf - program menang tercepat!
Saya dapat menambahkan bonus nanti untuk menerapkan opsi tertentu yang nl
dimiliki. Tidak ada bonus saat ini.
prompt()
untuk meniru program args dan stdin?Jawaban:
Bash, 121
sumber
if
ekspresi Anda sedikit lebih pendek jika Anda menggunakan ekspresi aritmatika, misalnya(($#>64))&&s=2
s=0;(($#>64))&&s=2
dengans=$[2*($#>64)]
,(($s==0))||
dengan((s))&&
danif
pernyataan dengan[ -f "$f" ]||s=1
.awk
juga akan digabungkan jika melewati beberapa file, jadi ini secara resmi dianggap sebagai penggunaan cat yang tidak berguna ;-). Sebaliknya saya pikir ini akan berhasil:awk '...' $@
Ruby, 195
sumber
STDIN
alias$<
.ARGF
, yang akan membaca dari sisa file yang diberikan sebagai argumen juga. Saya pikir ini bisa diturunkan lebih lanjut menggunakanARGF
entah bagaimana (bahkan tampaknya diakui"-"
sebagai stdin).block in <main>': undefined method
[] 'untuk # <Enumerator: 0x000006002980c8> (NoMethodError) dari britishteanl: 2: dieach' from britishteanl:2:in
<main>' - ada apa? Saya menjalankannya sebagairuby britishteanl folder/filename
Perl, 84 + 2 (
-pl
) = 86 byteDibatasi:
Penting untuk diketahui:
-p
membungkus program yang diberikan dengan-e
diwhile
/continue
loopBEGIN
kode akan dieksekusi sebelum bagian utama (implisit)-r
juga gagal jika file tidak ada!-e
dan default untuk pengujian$_
, secara implisit diberikan dalammap { ... } @ARGV
$.
memegang nomor baris saat inisumber
python 173
sumber
-
untuksys.stdin
. Solusi yang mungkin adalah sesuatu sepertifh=sys.stdin if f=='-' else open(f)
dan kemudian pergix=fh.readline()
?! Sayangnya itu tidak membuatnya lebih pendek. :)J (162)
Penjelasan:
]`(]&<&'-')@.(0=#)2}.ARGV
: Dapatkan argumen baris perintah, dan hapus dua yang pertama (karena itu adalah interpreter dan nama file skrip). Jika daftar yang dihasilkan kosong, kembalikan['-']
(yaitu, seolah-olah pengguna hanya lewat-
), jika tidak kembalikan daftar tidak berubah.(
...::1:)
: jika fungsi dalam gagal, kembali1
, jika tidak, kembalikan apa pun fungsi dalam kembali.((2*64<#)[
...)
: mengevaluasi fungsi dalam dan membuang hasilnya. Kemudian, jika panjang daftar yang dilewati tidak lebih tinggi dari64
, kembali0
, jika tidak kembali2
.&.>@;@{.@(_64&(<\))
: dapatkan paling banyak64
elemen dari daftar, dan untuk masing-masing menjalankan fungsi berikut:(1!:1)@(<`3:@.('-'-:]))
: jika elemen itu-
, baca isi deskriptor file3
(stdin), jika tidak baca isi file yang dinamai oleh elemen itu. Jika ini gagal (yaitu file tidak ada), kode di atas akan menangkapnya dan kembali1
.exit@3:`(
...)@.(1e6>#)@(<;.2)
: pisahkan string pada ujung garisnya. Jika ada 1.000.000 atau lebih baris, keluar dengan status3
. Jika tidak:,&TAB@(6&":)&.>@>:@i.@#
: menghasilkan angka untuk setiap baris, memformatnya dalam kolom 6 digit, dan menambahkan aTAB
ke akhir setiap string,,&.>]
: tambahkan setiap nomor di bagian depan setiap baris.stdout@(,&LF)@;
: kemudian output semuanya, diikuti oleh tambahanLF
.exit
: keluar dengan nilai pengembalian fungsi itusumber
Ruby, 76 byte
Satu byte untuk
p
bendera. Jalankan denganruby -p nl.rb
.argumen stdin atau file ditangani secara otomatis oleh Ruby. Sudah keluar dengan kode 1 jika argumen file tidak ada.
$.
adalah jumlah baris yang telah dibaca.$*
adalah argumen baris perintah, dan file muncul saat file dibaca. Thep
bendera mengeksekusiBEGIN
blok dan membungkus sisa program di dalam loop sementara-mendapat-cetak, menggunakan$_
sebagai input / output.sumber
Perl,
125122 bytesumber
C,
362359Hanya untuk bersenang-senang. ;-) Bekerja dengan LF atau CR / LF linefeeds.
sumber