您的任务是从GNU核心实用程序中实现一个类似于nl命令行工具的程序。
标准漏洞被禁止。
您不能使用任何内置或外部函数、程序或实用程序对文件或字符串的行编号,例如nl本身或GNU中的=命令。
程序接受文件名作为参数。您的代码不必跨平台;应该使用运行代码的操作系统的文件名格式,也就是说,如果您碰巧在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。
如果给出的文件太多(超过64个),则退出状态2。
如果输入太长(超过999999行).\,则退出状态3
这是密码-高尔夫-最短的节目胜利!
我可能会在稍后添加奖金,以实现nl的某些选项。目前还没有奖金。
发布于 2014-09-30 20:27:07
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发布于 2014-10-01 11:04:07
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:使用该函数的返回值退出https://codegolf.stackexchange.com/questions/38320
复制相似问题