最常见的标准任务之一(尤其是在展示深奥的编程语言时)是实现“猫程序”:读取所有STDIN并将其打印到STDOUT。尽管这是用Unix shell实用程序命名的,但cat
它的功能当然不如真实功能强大,后者通常用于打印(和连接)从磁盘读取的多个文件。
任务
您应该编写一个完整的程序,该程序读取标准输入流的内容并将它们逐字写入标准输出流。当且仅当您的语言不支持标准输入和/或输出流(大多数语言都理解)时,您才可以使用这些术语来表示它们在您的语言中最接近的等效词(例如JavaScript prompt
和alert
)。这些是唯一允许的I / O形式,因为任何其他接口都将在很大程度上改变任务的性质,并使答案的可比性大大降低。
输出应该完全包含输入,而没有其他内容。此规则的唯一例外是您的语言解释器不断输出的内容,例如问候语,ANSI颜色代码或缩进,这些输出不能被禁止。这也适用于尾随换行符。如果输入不包含尾随换行符,则输出也不应包含任何换行符!(唯一的例外是,如果您的语言在执行后绝对总是打印尾随换行符。)
只要标准输出流包含预期的输出,就会忽略标准错误流的输出。特别是,这意味着您的程序在达到流(EOF)的末尾时可能会以错误终止,前提是该操作不会污染标准输出流。如果这样做,我建议您也将无错误的版本添加到您的答案中(以供参考)。
由于这是在每种语言中而不是在每种语言之间的挑战,因此有一些特定于语言的规则:
- 如果您的语言完全有可能将标准输入流中的空字节与EOF区分开,则您的程序必须像其他任何字节一样支持空字节(也就是说,它们也必须写入标准输出流中)。
- 如果您的语言完全有可能支持任意无限的输入流(即,如果您可以在输入中遇到EOF之前开始将字节打印到输出中),则在这种情况下,程序必须正常工作。作为示例,
yes | tr -d \\n | ./my_cat
应打印y
s 的无限流。由您决定打印和刷新标准输出流的频率,但是必须确保它在有限的时间后发生,而不管该流如何(特别是,您不能等待特定字符,例如打印前换行)。
请在您的答案中添加一条注释,说明有关空字节,无限流和无关输出的确切行为。
附加规则
这并不是要找到具有最短解决方案的语言(有些地方空程序会解决问题),而不仅仅是找到每种语言的最短解决方案。因此,没有答案将被标记为已接受。
大多数语言的提交都将以适当的预先存在的编码(通常(但不一定)为UTF-8)以字节计分。
随意使用一种语言(或语言版本),即使它比此挑战要新。专门针对此挑战提交0字节答案的语言是公平的游戏,但并不是特别有趣。
请注意,必须有一个解释器,以便可以测试提交。允许(甚至鼓励)自己为以前未实现的语言编写此解释器。
还要注意,语言也必须符合我们平时的标准编程语言。
如果您选择的语言是已经有答案的另一种(可能是更流行的)语言的琐碎变体(请考虑使用BASIC或SQL方言,Unix shell或琐碎的Brainfuck派生词,例如Headsecks或Unary),请考虑在现有答案中添加注释在其他语言中,相同或非常相似的解决方案也是最短的。
除非之前已否决它们,否则所有标准的代码高尔夫球规则都适用,包括http://meta.codegolf.stackexchange.com/q/1061。
附带说明一下,请不要在无聊的语言中打扰无聊(但有效)的答案;这些对于这个问题仍然很有用,因为它试图编译尽可能完整的目录。但是,主要是使用作者实际上必须努力打出代码的语言来提高答案的准确性。
目录
这篇文章底部的Stack Snippet会根据答案a)生成目录,a)作为每种语言最短解决方案的列表,b)作为整体排行榜。
为确保您的答案显示出来,请使用以下Markdown模板以标题开头。
## Language Name, N bytes
N
您提交的文件大小在哪里。如果您提高了分数,则可以通过打败旧分数来保持标题。例如:
## Ruby, <s>104</s> <s>101</s> 96 bytes
如果要在标头中包含多个数字(例如,因为您的分数是两个文件的总和,或者您想单独列出解释器标志罚分),请确保实际分数是标头中的最后一个数字:
## Perl, 43 + 2 (-p flag) = 45 bytes
您还可以将语言名称设置为链接,然后该链接将显示在代码段中:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
sh
使用的答案,cat
其中也包含一个使用的更短解决方案dd
。)
cat