这个站点存在很多问题,涉及在解释器标签中实现各种语言。但是,实际上所有这些都是深奥的语言,没有人使用。是时候为这里的大多数用户所知道的实用语言做翻译了。是的,如果您在阅读标题时遇到问题(不是您遇到的问题),则它是shell脚本。(是的,我故意挑战了,因为我对GolfScript和Befunge之类的语言感到无聊,所以我提出了一些挑战,即更实用的编程语言有更大的获胜机会)
但是,shell脚本是一种比较大的语言,因此我不会要求您实现它。相反,我将制作一小部分的Shell脚本功能。
我决定的子集是以下子集:
- 执行程序(但是,即使允许使用单引号,程序也只能包含字母)
- 程序参数
- 单引号(接受任何可打印的ASCII字符,包括空格,不包括单引号)
- 无引号的字符串(允许ASCII字母,数字和破折号)
- 管子
- 空语句
- 多个语句用换行符分隔
- 尾随/前导/多个空格
在此任务中,您必须从STDIN读取输入,然后运行每个请求的命令。您可以放心地假定使用POSIX兼容的操作系统,因此不需要Windows或类似功能的可移植性。您可以放心地假设未通过管道传输到其他程序的程序不会从STDIN中读取。您可以放心地假设这些命令将存在。您可以放心地假设不会使用其他任何东西。如果某个安全的假设被打破,您可以采取任何措施。您可以放心地假设最多15个参数,以及少于512个字符的行(如果您需要显式的内存分配或其他内容-即使C很小,我也会给C赢得成功的机会很小)。您不必清理文件描述符。
您可以在任何时候执行程序-即使在收到完整的行之后,也可以在STDIN结束之后。选择您想要的任何方法。
简单的测试用例,可让您测试外壳(请注意第三个命令后的空白):
echo hello world
printf '%08X\n' 1234567890
'echo' 'Hello, world!'
echo heeeeeeelllo | sed 's/\(.\)\1\+/\1/g'
yes|head -3
echo '\\'
echo 'foo bar baz' | sed 's/bar/BAR/' | sed 's/baz/zap/'
上面的程序应该输出以下结果:
hello world
499602D2
Hello, world!
helo
y
y
y
\\
foo BAR zap
除非您没有命令的任何参数,否则不允许您执行shell本身(此异常是为Perl编写的,当仅将参数放入时,它将在shell中运行命令system
,但可以随意将其用于其他对象语言,如果您可以通过节省字符的方式执行此操作),或者您运行的命令是shell本身。这可能是此挑战中的最大问题,因为许多语言都有system
执行shell的功能。而是使用直接调用程序的语言API,例如subprocess
Python中的模块。无论如何,这对于安全性来说是个好主意,那么,您不想创建一个不安全的shell,您想要吗?这很可能会停止PHP,但是仍然有其他语言可供选择。
如果你想使你的程序在shell脚本,你不能使用eval
,source
或.
(如,一个功能,而不是一个字符)。我认为这将使挑战变得太容易了。
允许滥用规则。我明确禁止了很多事情,但是我几乎可以肯定,您仍然可以做我没有做过的事情。有时候,我对人们如何解释我的规则感到惊讶。另外,请记住,您可以为我未提及的任何事情做任何事情。例如,如果我尝试使用变量,则可以擦除硬盘(但请不要这样做)。
最短的代码获胜,因为这是codegolf。