零行代码中的“ Hello,World”

2021-01-04 22:30:10

\ $ \ begingroup \ $ NPM的sloc是一种用于统计文件中源代码行的中等流行工具。该工具将尝试去除单行注释和多行注释,并对剩余的行进行计数,以便获得对“ true”的估计。代码行数。

但是,使用的解析器是基于正则表达式的,并且非常简单,因此很容易被欺骗。在这个挑战中,您将需要构建一个hello world程序,该程序将sloc计数为零行代码。

下载sloc。如果您有npm,可以通过npm i sloc完成。我们将使用发布时的最新版本0.2.1。或者,使用本文底部链接的在线测试环境。

用该语言编写一个完整的程序,该程序将输出确切的字符串Hello,World!到标准输出。输出可以选择包含尾随换行符,但不接受其他格式。该程序可能会输出任何东西到stderr。但是,要被视为有效提交,sloc必须将程序视为源代码的零行。您可以通过运行sloc myprogram.ext来验证这一点,该信息应显示为Source:0。

----------结果------------物理:1来源:0评论:1单行注释:0块注释:1混合:0空块注释:0空:0待办事项:0读取的文件数:1 ----------------------------

为什么?好吧,sloc使用'''或"""确定Python中是否有多义注释。但是,它不能正确地将它们配对。因此,Python将我们的程序解析为:

(这不是最短的有效Python提交,因此它不应阻止您寻找较短的提交)

询问所有语言是否都可能是一个合理的问题。我不知道,但是到目前为止,我所研究的所有内容(Python,C,HTML)都至少有一种解决方案。因此,您的语言很有可能会出现。

\ $ \ endgroup \ $

\ $ \ begingroup \ $ sloc可以正确识别为两行,我放弃了:/ \ $ \ endgroup \ $ – ovs

\ $ \ begingroup \ $我将指出,对于什么才算是一种编程语言,我们的定义完全是遗留的,挑战不仅限于“编程语言”。他们曾经是,但现在不再。您当然可以覆盖默认值。我只是没有看到您为什么要参加这种情况的充分理由,并且认为您可能不知道新的共识(您不会是第一个)。 \ $ \ endgroup \ $ –麦向导♦

\ $ \ begingroup \ $是否可以在线运行sloc,而不需要在本地安装? \ $ \ endgroup \ $ –多米尼克·范·埃森(Dominic van Essen)

\ $ \ begingroup \ $ @WheatWizard我不知道新的共识。有什么办法可以用警告标记旧的共识? \ $ \ endgroup \ $ –西西斯(Sisyphus)

\ $ \ begingroup \ $ @DominicvanEssen尽管不知道咖啡脚本,但我还是迷迷糊糊地创建了一个基于TIO的在线检查器。现在位于帖子的最后部分。 \ $ \ endgroup \ $ –西西斯(Sisyphus)

\ $ \ begingroup \ $由于sloc是基于正则表达式的,因此很可能会认为它无法识别嵌套注释。 如果我们看一看,确实可以做到。 如果我们这样嵌套两个注释: sloc标识源的一行和注释的一行。 基于这些观察,我最好的猜测是它使用的正则表达式是 如果将其弹出到正则表达式引擎中,我们将看到它与嵌套注释匹配,如下所示: 好的,所以我们打破了它,但是这与预期的效果相反。 我们希望sloc认为我们的代码是注释,而不是我们的注释是代码。 因此,我们添加了一个"行注释标记" sloc认为注释的一部分是代码,因此sloc认为正在启动行注释。 因此,要定位两个注释,分别是块注释{-{-}和行注释-},但是要想真正解析注释的haskell,全都是一个块注释。 因此,我们仅在之后添加代码。 Sloc认为这仍然是评论,Haskell知道不是。 \ $ \ endgroup \ $

\ $ \ begingroup \ $有趣的是,与其他大多数答案不同,我选择的cloc工具也被您的代码欺骗了! \ $ \ endgroup \ $ – Vorac \ $ \ begingroup \ $尽管立即崩溃并向stderr发送错误,但会打印正确的输出。 感谢@Kevin Cruijssen提供了有关删除System.exit(0)的提示。 ----------结果------------物理:1来源:0评论:1单行注释:0块注释:1混合:0空块注释:0 空:0待办事项:0读取的文件数:1 ---------------------------- 我最初的答案是在Java 7+中,字节为83个字节(缺少逗号): \ $ \ endgroup \ $ \ $ \ begingroup \ $ @Razetime谢谢。 我还没有发表评论的特权。 \ $ \ endgroup \ $ –阿米尔M \ $ \ begingroup \ $非常好! 这似乎是一种通用方法,涵盖了带有/ *和* /多行注释的任何语言。 \ $ \ endgroup \ $ –西西斯(Sisyphus)

\ $ \ begingroup \ $同样长度的另一种解决方案是在代码前加上// \ u000a。 \ $ \ endgroup \ $ –西西斯(Sisyphus)

\ $ \ begingroup \ $在第三条规则中声明"该程序可能会将任何内容输出到stderr。&#34 ;,因此您可以删除System.exit(0);。在您的Java 6答案中。它将首先输出“ Hello,World!”,然后将异常输出到STDERR。 PS:您忘记了字符串" Hello,World!中的逗号。在两个程序中\ $ \ endgroup \ $ –凯文·克鲁伊森(Kevin Cruijssen)

\ $ \ begingroup \ $使用.NET 5 C#,您可以省略类声明和main方法,而只需编写System.Console.Write(" Hello world!");。 (46字节)作为有效代码。可悲的是,它似乎不是tio.run中可用的选项... :) \ $ \ endgroup \ $ –米汉

\ $ \ begingroup \ $有趣的是JS代码还欺骗了SE的语法突出显示器。 \ $ \ endgroup \ $ – Jan多尼亚克

\ $ \ begingroup \ $ C版本可以以//而不是/ ** /结尾吗? \ $ \ endgroup \ $ – chux-恢复莫妮卡

\ $ \ begingroup \ $显然,该应用使用了其他语法荧光笔来正确处理它。 \ $ \ endgroup \ $ –浪费

\ $ \ begingroup \ $ @wastl首次使应用程序运行得更好! \ $ \ endgroup \ $ –蒂姆

\ $ \ begingroup \ $ Dewi Morgan声称没有可能的解决方案,因此很显然让我进一步研究了一种解决方法:)(然后,他跟进了多个' shenanigans')

唯一的缺点(也是让我最初放弃它的原因)是,您必须使用默认情况下启用了缓冲的SAPI。因此,如果您尝试使用php cli运行它,它可能会输出//并抱怨没有要删除的缓冲区。但是,如果从Web服务器(甚至是内置的php -S)运行,它将产生预期的Hello World!

----------结果------------物理:1来源:0注释:1单行注释:1块注释:0混合:0空块注释:0空:0待办事项:0读取的文件数:1 ----------------------------

\ $ \ endgroup \ $

\ $ \ begingroup \ $如果允许不同的PHP配置,则可以确保short_open_tags已启用(即使不是默认值也可以吗?),然后将<?php替换为<?,因此减少了4个字节\ $ \端组\ $ –约翰内斯

\ $ \ begingroup \ $哦,PHP还支持#用于单行注释。如果sloc支持它:少一个字节。 \ $ \ endgroup \ $ –约翰内斯

\ $ \ begingroup \ $您应该编辑答案以同时说" TypeScript"因为它也可以在TypeScript TIO和"在线测试环境"中使用将扩展名设置为ts。 \ $ \ endgroup \ $ – Samathingamajig

\ $ \ begingroup \ $注释的正斜杠之后,有两个退格字符可将其从输出中删除。然后,它输出目标字符串。

因此,这是否合法取决于" output"可能会被严重误解为最终在某些终端上的视觉输出。我怀疑不是,因为在线测试环境可能是规范环境,并且不尊重退格。因此,尽管对于发现的弱点可能有点有趣,但这不太可能成为赢家:)

对于任何不包括这种作弊的解决方案,我们都会有两个选择:

PHP打开标签,然后进行注释。缺少任何前面的文本以将其从sloc隐藏起来,open标签被视为一行代码。

此参数基于以下假设:注释是从sloc隐藏代码的唯一方法。

但是,如果我们替换" comments&#34 ;,则该参数同样有效。 "如果放置在PHP opentag之前会导致任何不良输出;并且如果将它放在sloc之后,就不会对它隐藏opentag,我认为它包含了所有内容,因为PHP的正则表达式似乎没有任何可利用的反向引用,但是我可能做出了错误的假设。

它正确处理//行和/*...*/注释,但可悲的是没有意识到#行注释,否则将改为15个字符,这是击败使用压缩或使用&的语言之外的所有语言的一个很好的变化。 #34; Hello World!"字符串作为语言构造。确定,或//表示打印且文件扩展名可以设置为.c或类似语言的语言。

它不检查前面的未配对&lt ;?或<?php,然后再考虑一些代码。对于PHP,<?....?>之外的所有内容输出。这是我利用的错误。

\ $ \ endgroup \ $

\ $ \ begingroup \ $要获得合法的PHP解决方案,可以考虑使用-r标志\ $ \ endgroup \ $ –西西斯(Sisyphus)

\ $ \ begingroup \ $ @Sisyphus您说得对,我记错了!标准漏洞允许编译器使用命令行参数! :)他们只是计入总数,这很好。 \ $ \ endgroup \ $ –德维·摩根(Dewi Morgan)

\ $ \ begingroup \ $ @JoKing您在开玩笑吧? :D好吧,我是菜鸟,所以可能会引起误解。但是,如果是这样的话,几乎每个编译器都允许将代码作为参数传递,因此对于每种语言,每个代码竞赛都可能是0个字符,这确实很无聊。因此,很可能是我误会了。您的意思是,在php -r' hi&#34 ;;'中,领先的php -r'和尾随的'不算? \ $ \ endgroup \ $ –德维·摩根(Dewi Morgan)

\ $ \ begingroup \ $有点令人困惑,但这是有关标记的当前元共识。据此,是的,虽然技术上将是带有-r标志的PHP语言,但仅会计算string参数中的部分。零字节滥用将属于MetaGolfScript漏洞\ $ \ endgroup \ $ –乔·金♦

\ $ \ begingroup \ $受@Dewi Morgan的PHP答案的启发,我想看看是否可以找到其他任何不使用退格键作弊的方法。

我的第一个想法是我的HTML答案将立即作为PHP答案起作用,但是事实并非如此。即使PHP解释了&lt ;?之外的所有内容。 ?>标记为纯HTML,只需将扩展名从HTML切换到PHP即可使sloc将其解释为一行,实际上,似乎sloc在PHP模式下会忽略HTML注释。

我希望///?可以为PHP解决此问题,但是sloc将此解释为0行(万岁!),PHP只是忽略了结束标记,这意味着整个构造都将输出到页面。

所以,现在我必须同意:似乎不存在没有退格键(或使用-r标志)的有效PHP解决方案。

\ $ \ endgroup \ $

\ $ \ begingroup \ $似乎浏览器也接受<!-> Hello,World!<!-> (23个字符),sloc仍将其视为注释。通过查看其他解决方案,这可能是没有作弊的最短解决方案。 \ $ \ endgroup \ $ –匿名者

\ $ \ begingroup \ $ @johannes确实如此,但是可悲的是,sloc将其设置为PHP模式时将其视为一行:( \ $ \ endgroup \ $ – Toastrackenigma

\ $ \ begingroup \ $ {总计:1,来源:0,评论:1,单身:0,阻止:1,混合:0,空:0,待办事项:0,blockEmpty:0}

\ $ \ endgroup \ $ \ $ \ begingroup \ $ CSS尽管不是真正的编程语言,但仍可以执行基本输出。 此代码在页面上的每个元素之后创建一个伪元素 Sloc的块注释检测已损坏(从其他答案中可以看出),并且报告为0行源代码。 请参见此处的sloc输出。 下面的代码段已被修改(40字节),因此代码段运行器和某些为< html> (导致双输出)正确显示。 \ $ \ endgroup \ $ \ $ \ begingroup \ $ ----------结果------------物理:4来源:0评论:4单行注释:0块注释:4混合: 0空块注释:0空:0待做:0读取的文件数:1 \ $ \ endgroup \ $

\ $ \ begingroup \ $您可以使用p代替puts。空格也可以省略。要使其等同于看跌期权,请使用p" Hello,World!\ n"但是我看不到需要换行符。 \ $ \ endgroup \ $ –伯克

\ $ \ begingroup \ $我不确定这是否完全有效。它是一个完整的程序,必须直接从外壳启动(例如,在“在线尝试”或“ rdrr.io”中不能正常运行,或者在复制时,粘贴到R控制台中)。另存为" helloworld.r"具有执行权限,然后使用./helloworld.r或更确切地说是exec helloworld.r>运行。 output.txt。

R不支持多行注释,因此“与注释定界符配对”无法使用其他语言提供的技巧。唯一的(单行)注释字符是#,并且紧随其后直到下一个换行符的所有内容都不会执行。但是,shebang行以#开头!用" sloc"计数作为注释,即使程序加载器可以读取和解释它。

通常,shebang行仅告诉程序加载器使用哪个解释程序来运行程序的其余部分。因此,这是一个更常规的2行(sloc = 1)R程序,可以完成相同的任务:

但是-我们还可以在shebang行中包含命令行参数,并且rscript解释器接受-e标志,以将程序代码作为参数传递给它,这就是sloc = 0代码在这里的作用。

因此:该程序在R中有效,并且程序代码由R运行,但是它需要从shell启动并使用程序加载器的帮助。这有效吗?我不知道但这是我能想到的唯一方法在没有多行注释的语言中定位...

\ $ \ endgroup \ $

\ $ \ begingroup \ $为什么执行helloworld.r?那将替换您的外壳…\ $ \ endgroup \ $ –·本·诺布尔

\ $ \ begingroup \ $ @ D.BenKnoble-我会说实话:我不太了解这些内容。我只是尝试了两种方式,它对我有用... \ $ \ endgroup \ $ –多米尼克·范·埃森(Dominic van Essen)

\ $ \ begingroup \ $很抱歉,但是我认为这不算R代码。它使用对R的调用,但是您不能通过任何标准的调用R代码的方式来执行它(即使用source,Rscript,R CMD BATCH ...)。这里的语言类似于安装了R的系统上的&shell,而不是R ... \ $ \ endgroup \ $ –罗宾·莱德(Robin Ryder)

\ $ \ begingroup \ $类似地,如果" shell"是挑战允许的语言,或者如果我们认为此通用方法有效,则可以执行#!/ bin / sed s /.*/ Hello,World!/(31字节)\ $ \ endgroup \ $ –奈

\ $ \ begingroup \ $ @RobinRyder-是的-这正是为什么我不确定答案是否正确的原因(而且我指出,它不能以更标准的方式运行)... \ $ \ endgroup \ $ –多米尼克·范·埃森(Dominic van Essen)

\ $ \ begingroup \ $ sloc script.pl ----------结果------------物理:1来源:0评论:1单行注释:1块注释:0混合:0空块注释:0空:0待办事项:0读取的文件数:1 ----------------------------

\ $ \ endgroup \ $

\ $ \ begingroup \ $,因为它的代码高尔夫球当前应显示的字节数为59,另一个解决方案为39字节或20字节,具体取决于计数\ $ \ endgroup \ $ –纳韦尔·富勒(Nahuel Fouilleul)

\ $ \ begingroup \ $我不能完全确定这实际上是Perl,我认为这是您的shell解释该文件,因为在TIO中进行测试时,它抱怨无法通过shebang设置-E:尝试线上! \ $ \ endgroup \ $ – Dom Hastings

\ $ \ begingroup \ $ @DomHastings它必须取决于您的shell吗? > zero_line_hello_world.pl您好,世界! \ $ \ endgroup \ $ –量子力学

\ $ \ begingroup \ $根据我在前端读取命令行标志的方式,可能会使用各种答案。

我觉得没有办法,所以在这个选票上是不错的,并且应该是这样的:)我将其更多地发布是为了探索问题空间,也许是最终的争论,即在PHP中不可能有解决方案,而不是一个答案。我希望被接受。

我已经针对所有这些提出了自己的论点,并用有胆识的大胆陈述进行了总结,因为这自然会使论点更加真实。我非常有兴趣在评论中听到反对意见或其他意见!

一种解释是,命令行上没有任何内容很重要,但是整个命令行被视为一种"语言方言名称"。进入。

反对:应计算所有代码。否则,这种方法通过将所有工作卸载到CLI上而使几乎任何语言的字节都变得无关紧要。这里的-r标志的参数不是选择语言选项的标志,而是代码,因此应该算作参数。

可以说,尽管我们在CLI上计算代码,但sloc要求仅适用于源文件的内容。如果没有源文件,则源文件中没有代码行!

反对:所有计数的代码都应传递给sloc。每种语言都允许您在cli参数中添加代码。挑战并不是要在不使用源文件的情况下降级为运行Hello World,因此这不是解决挑战的有趣方法。

因此,我们可以在命令行中传递一个最少的代码示例,从而获得避免PHP&lt ;?的所有好处。要求,但不支付任何重大罚款。

反对:必要的代码转义应视为代码。没有忽略引号的好理由。无论如何,不​​忽略它们会使挑战变得更加有趣。

因此,我认为应该将所有计数的字符都传递给sloc,并且此解决方案用引号引起来,并且应该对引号进行计数。带引号的字符串算作sloc中的代码行。因此,这无法通过sloc测试。

反对:这不再是PHP。现在,我们不是真正使用PHP进行编码,而是使用(某些shell)+ PHP进行编码。如果将其作为bash脚本提交,则其计数为39个字符,并且未通过sloc测试。我们不应该只是假装它在Shell调用的一种实用程序中运行而减少计数并假装它通过。

这是两个伙伴! 首先,一个名为/ x的文件,仅包含我们的13个字符的输出字符串: 然后,假设1)我们对命令行中使用的文件名进行计数,并且2)我们将其放在传递给sloc的代码之前,因为计数的所有内容都是代码,因此sloc会将其解释为单行注释。 仅作为参考,包括这些内容:尝试-r和文件说明符来解决"取决于我们如何串联"。 问题,上面。 如果文件名在行之前-r参数没有运行。 -B,-R,-E,-F参数也是如此。 反对:鉴于-r标志不计算在内,因此很难看出将如何计算。 而且它还是不管用。 也许BREF组没有用,因为他们需要控制实际的输入行,因为它们控制每个输入行的行为吗? 同样的交易。 如果行上有空文件名,则它们不会运行。 -R,-E,-F参数也是如此。

-w参数是"带注释和空格的输出源。 这听起来像是对挑战的准确描述! 乌西 ......