Ваша задача - реализовать программу, аналогичную nl
инструменту командной строки из основных утилит GNU.
Стандартные лазейки запрещены.
Вы не можете использовать какие-либо встроенные или внешние функции, программы или утилиты для нумерации строк файла или строки, например, nl
себя или =
команды в GNU sed.
Спецификация
вход
Программа принимает имена файлов в качестве аргументов. Ваш код не обязательно должен быть кроссплатформенным; должен использоваться формат имени операционной системы, в которой выполняется код, т. е. если вы находитесь в Windows, разделитель каталогов может быть \
или /
.
Вы должны быть в состоянии принять 64 входных файла, в том числе, -
если он указан. Если задано более 64, обрабатывайте только первые 64.
В списке имен файлов, -
представляет стандартный ввод.
Если указаны имена файлов, прочитайте их в том порядке, в котором они указаны, и объедините их содержимое, вставив новую строку между каждым и в конце. Если вы не можете прочитать одно или несколько имен файлов (поскольку файл не существует или у вас нет прав на чтение), игнорируйте их. Если все указанные имена файлов недействительны, ничего не выводить.
Если имена файлов не заданы, читайте со стандартного ввода. Чтение только из стандартного ввода, если имена файлов не указаны или -
указаны.
Выход
Выход программы будет на стандартный вывод, вход с линиями пронумерованы таким образом (можно предположить , что вход имеет \n
, \r\n
или \r
конца строки, выбрать наиболее удобный для вас, но указать , какой из них):
<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 символов пробела, и он вставляется в конце этих символов; остальные становятся пробелами (например, 1
будет 5 пробелов, 22
будет 4 пробела, ...). Если ввод достаточно длинный, у вас в конце концов останется недостаточно места для номера строки в строке 999999
. Вы не должны ничего выводить после строки 999999.
Если вход пуст, ничего не выводить.
Статус выхода
Нижние числа имеют приоритет: если возникли ошибки 1 и 2, выйдите со статусом 1.
Выйдите со статусом 0, если вход был успешно получен, а строки успешно пронумерованы и выведены.
Выход со статусом 1, если один или несколько файлов, указанных в командной строке, не найдены или не могут быть прочитаны.
Выход со статусом 2, если задано слишком много файлов (более 64).
Выход со статусом 3, если ввод был слишком длинным (более 999999 строк). \
счет
Это код-гольф - выигрывает самая короткая программа!
Я могу добавить бонусы позже для реализации определенных опций, которые nl
есть. На данный момент бонусов нет.
prompt()
эмулировать аргументы программы и стандартный ввод?Ответы:
Баш, 121
источник
if
выражения немного короче, если используете арифметические выражения, например(($#>64))&&s=2
s=0;(($#>64))&&s=2
наs=$[2*($#>64)]
,(($s==0))||
с((s))&&
иif
заявление с[ -f "$f" ]||s=1
.awk
будет также объединяться, если передано несколько файлов, так что это официально считается бесполезным использованием cat ;-). Вместо этого я думаю, что это сработает:awk '...' $@
Рубин, 195
источник
STDIN
псевдоним$<
.ARGF
, который также будет считывать оставшиеся файлы в качестве аргументов. Я думаю, что это может быть использовано для дальнейшего использованияARGF
каким-либо образом (даже кажется,"-"
что он считается стандартным).block in <main>': undefined method
[] 'для # <перечислитель: 0x000006002980c8> (NoMethodError) из britishteanl: 2: вeach' from britishteanl:2:in
<main>' - что не так? Я запустил его какruby britishteanl folder/filename
Perl, 84 + 2 (
-pl
) = 86 байтDeparsed:
Важно знать:
-p
переносит программу, указанную-e
в циклеwhile
/continue
BEGIN
код будет выполнен перед (неявной) основной частью-r
также не выполняется, если файл не существует,!-e
и по умолчанию используется проверка$_
, неявно указанная вmap { ... } @ARGV
$.
содержит текущий номер строкиисточник
питон 173
источник
-
дляsys.stdin
. Возможное решение может быть что-то вроде,fh=sys.stdin if f=='-' else open(f)
а затем пойти сx=fh.readline()
?! К сожалению, это не делает его немного короче, хотя. :)J (162)
Объяснение:
]`(]&<&'-')@.(0=#)2}.ARGV
Получите аргументы командной строки и удалите первые два (потому что это интерпретатор и имя файла скрипта). Если полученный список пуст, вернуть['-']
(то есть, как если бы пользователь только прошел-
), в противном случае вернуть список без изменений.(
...::1:)
: если внутренняя функция завершается с ошибкой, вернуть1
, иначе вернуть то, что вернула внутренняя функция.((2*64<#)[
...)
: оцените внутреннюю функцию и отбросьте результат. Затем, если длина переданного списка не была больше64
, верните0
, в противном случае верните2
.&.>@;@{.@(_64&(<\))
: получить не более64
элементов из списка и для каждого из них запустить следующую функцию:(1!:1)@(<`3:@.('-'-:]))
: если элемент был-
, прочитайте содержимое дескриптора файла3
(stdin), в противном случае прочитайте содержимое файла, названного этим элементом. Если это не удается (т. Е. Файл не существует), приведенный выше код перехватит его и вернет1
.exit@3:`(
...)@.(1e6>#)@(<;.2)
: разбить строку по окончанию строки. Если есть 1.000.000 или более строк, выйдите со статусом3
. В противном случае:,&TAB@(6&":)&.>@>:@i.@#
: сгенерируйте числа для каждой строки, отформатируйте их в 6-значном столбце и добавьте aTAB
в конец каждой строки,,&.>]
: добавьте каждый номер в начале каждой строки.stdout@(,&LF)@;
: затем вывести все, а затем допLF
.exit
: выйти с возвращенным значением этой функцииисточник
Рубин, 76 байт
Один байт для
p
флага. Беги сruby -p nl.rb
.Аргументы stdin или file обрабатываются автоматически Ruby. Он уже завершается с кодом 1, если аргумент файла не существует.
$.
это количество строк, которые были прочитаны.$*
это аргументы командной строки, и файлы выталкиваются при чтении файлов.p
Флаг выполняетBEGIN
блок и оборачивает остальную часть программы внутри цикла , а-получает-печать, используя в$_
качестве ввода / вывода.источник
Perl,
125122 байтаисточник
С
362359Просто для удовольствия. ;-) Работает с переводами строк LF или CR / LF.
источник