为了纪念即将到来的 9 月 1 日,我将举办一场自我修正写作比赛Hello world
。
让我立即保留该任务是在 中创建的,但您可以用任何具有与 Python 类似行为的语言Python
编写答案:
- 通过指定括号内的最后一个字符串将字符串传递到标准控制台输出函数
- PL允许你运行一个明显写有错误的程序
您需要编写代码,在代码末尾将指示反向HelloWorld 命令(允许添加工作所需的结构 - 例如end
括号等):
# Любой Ваш код
HelloWorld("print")
启动后,Hello world 应用程序的更正文本将显示在控制台中:
print("HelloWorld")
HelloWorld
在这种情况下,可以更改“发送用于打印”的文本(部分) - 代码应与以下命令类似地工作:
hello_world("print") >>> print("hello_world")
test("print") >>> print("test")
输出的文本是用一个词写成的——就像一个函数一样。
在它之后,输出命令用括号和引号表示- 它自己的 PL。无需提供更改的能力("print")
(或在另一种语言中类似)。
同样,应用程序不必在显示正确的 HelloWorld 代码文本后运行。
JavaScript 中的示例:
# Любой Ваш код
HelloWorld('console.log')
帕斯卡示例:
program Hello;
begin
# Любой Ваш код
HelloWorld('writeln')
end.
胜利标准(平票降序)
- 计票时的最高票数
- 最少数量的代码字符(所有内容都包括在内 - 包括您的代码和最后一行 HelloWorld)
- 最早回复
总结 - 9 月 1 日 21:00 莫斯科时间
根据比赛结果,得票最多的答案是@CrazyElf——通过捕获异常的解决方案NameError
。
但答案同样包含有趣和意想不到的解决方案!
感谢大家的参与!特别感谢Python以外语言的解决方案!
所以@extrn想出了Perl中最短的解决方案——61个字符!
我最初的解决方案也是通过拦截异常来发明的,但它有111 个字符NameError
长:
import sys;sys.excepthook=lambda*a:print(f'''print("{str(a[1]).split()[1].strip("'")}")''')
HelloWorld("print")
可以通过异常拦截来实现
NameError
。但这在交互式 Python 中不起作用(例如,在
Jupyter Notebook
),它仅在从命令行运行时才起作用:
结论:
字符数有320个,懒得按字符数来优化了。
而且分析本身还不是很漂亮。
我有兴趣尝试这个概念。
更新:
比赛用182个字符:
Perl,61 个字符
我重新阅读了条件,现在才注意到允许使用单引号
在线尝试一下!
可读
Python 145 - 164 个字符(有或没有最后一行)
我想想出一些原创的东西:)
更易读的版本
老实说,没有拐杖,即使这个代码也有效:
而且,与其他 Python 解决方案不同,我的代码在运行时捕获任何函数调用,因此此代码也可以工作:
Python,85 个字符
相同的代码以更易读的形式:
print
在第一行末尾返回None
.\
在那里它将第一行和第二行粘在一起。该表达式None and ...
从不计算第二个参数。文件的最后一行不会被评估,也不会导致错误。该程序读取自己的代码,假设它恰好包含两行 (
_, s = open(__file__)
),解析第二行 (a, b, _ = s.split('"')
),并打印所需的结果。该变量包含一个额外的左括号;打印时a
它会被字符删除。\b
结果看起来是正确的,但如果将其重定向到流,您可以看到断括号和删除它的退格键:如果
"print"
始终相同,则 83 个字符:Python,120 个字符
以可读形式:
inspect.currentframe().f_code
检索 Python 解释器当前正在执行的代码。.co_names
- 当前代码中提到的所有标识符的列表。列表中的名字按首次出现的顺序列出。我们需要姓氏。下一行将此名称分配给打印函数。
当解释器到达最后一行时,其中的函数已经定义并打印所需的内容。
PS该解决方案不需要从磁盘读取源代码文件。
在所有计算中:
;
需要删除或替换)console.log
在浏览器版本中,在计数之前,需要将其替换为alert
所有解决方案都假设文件中只有一个输出命令(尽管有些可以针对多个输出命令进行改进),并且它将是文件中除包装器之外的唯一代码。
HTML + JS,128 个字符
显示文本的限制:禁止所有关键字和多个全局属性。
console.log
替换为的最小工作(无效)html 文件print
将如下所示:NodeJS,104 个字符
显示文本的限制:禁止所有关键字和多个全局属性(例如
undefined
)。NodeJS,111 个字符
显示文本限制:禁止所有关键字。
浏览器JS,93-6*3 = 75个字符
显示文本的限制:并非所有关键字都被禁止。
无需关注显示的错误 - 这就是代码片段的工作原理。如果你查看浏览器控制台,那里没有错误。
输出后,脚本执行将停止。
参数(要输出的函数的名称)被忽略(似乎这可以通过条件实现?)。
PS:
console.log
->alert
计数时。您可以从一开始就读取可执行文件,输出所有正确的打印并结束进程,以免遇到 NameError 错误。
总共,我的代码有105 个字符 + hello world 行
该代码只是在任何非空行中滑动函数名称和参数,因此例如
type_age("input")
它将以相同的方式翻译为input("type_age")
如果我们确定只处理打印,那么我们可以对其进行硬编码并获得86 个字符
最有可能的是,可以进行优化和进一步优化,但最好还是了解更清晰的任务标准
解决方案(不是拐杖)136个字符!
竞赛代码:
这段代码不允许出现异常
NameError
!可读版本:
输出:
请看我的相关问题!
JavaScript,92 个字符(浏览器为 86 个)
显示文本的限制:禁止所有关键字,仅此而已。
换行是可选的;可以在浏览器中进行
alert
。PS:这似乎是我拥有的最干净的 js 解决方案。