首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线路编号-工具nl

线路编号-工具nl
EN

Code Golf用户
提问于 2014-09-29 19:31:40
回答 2查看 796关注 0票数 13

您的任务是从GNU核心实用程序中实现一个类似于nl命令行工具的程序。

标准漏洞被禁止。

您不能使用任何内置或外部函数、程序或实用程序对文件或字符串的行编号,例如nl本身或GNU中的=命令。

规范

输入

程序接受文件名作为参数。您的代码不必跨平台;应该使用运行代码的操作系统的文件名格式,也就是说,如果您碰巧在Windows上,目录分隔符可以是\/

您必须能够接受64个输入文件,如果指定了-,则包括它。如果超过64个,则只处理前64个。

在文件名列表中,-表示标准输入。

如果文件名是给定的,请按文件的顺序读取文件,并将其内容连接起来,在每个文件之间插入一个新行,并在末尾插入一个新行。如果无法读取一个或多个文件名(因为文件不存在或没有读取权限),请忽略它们。如果指定的所有文件名无效,则不输出任何文件名。

如果没有指定文件名,则从标准输入中读取。只有在没有给出文件名或给出-的情况下,才从标准输入读取。

输出

程序将向标准输出输出这样编号行的输入(您可以假设输入有\n\r\n\r行尾;选择对您方便的,但指定哪个行):

代码语言:javascript
复制
<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。

如果给出的文件太多(超过64个),则退出状态2。

如果输入太长(超过999999行).\,则退出状态3

评分

这是密码-高尔夫-最短的节目胜利!

我可能会在稍后添加奖金,以实现nl的某些选项。目前还没有奖金。

EN

回答 2

Code Golf用户

发布于 2014-09-30 20:27:07

python 173

代码语言:javascript
复制
import os,sys
c=0
l=1
for f in sys.argv[1:]:
    if c>64:exit(2)
    if not os.path.isfile(f):exit(1)
    c+=1
    for x in open(f):
        if l>=10**6:exit(3)
        print '%6d\t%s'%(l,x),;l+=1
票数 1
EN

Code Golf用户

发布于 2014-10-01 11:04:07

J (162)

代码语言:javascript
复制
exit(((2*64<#)[exit@3:`(stdout@(,&LF)@;@(,&TAB@(6&":)&.>@>:@i.@#,&.>]))@.(1e6>#)@(<;.2)@(1!:1)@(<`3:@.('-'-:]))&.>@;@{.@(_64&(<\))) ::1:)]`(]&<&'-')@.(0=#)2}.ARGV

解释:

  • ]`(]&<&'-')@.(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位列,并在每个字符串的末尾添加一个TAB
      • ,&.>]:将每个数字加到每一行的前面。
      • stdout@(,&LF)@;:然后输出全部内容,然后再输出一个额外的LF

  • exit:使用该函数的返回值退出
票数 1
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/38320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档