RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1591778
Accepted
mrgervant
mrgervant
Asked:2024-08-25 00:26:33 +0000 UTC2024-08-25 00:26:33 +0000 UTC 2024-08-25 00:26:33 +0000 UTC

自修正 HelloWorld("print")

  • 772

为了纪念即将到来的 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.

胜利标准(平票降序)

  1. 计票时的最高票数
  2. 最少数量的代码字符(所有内容都包括在内 - 包括您的代码和最后一行 HelloWorld)
  3. 最早回复
总结 - 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")
любой-язык
  • 16 16 个回答
  • 765 Views

16 个回答

  • Voted
  1. Best Answer
    CrazyElf
    2024-08-25T03:29:22Z2024-08-25T03:29:22Z

    可以通过异常拦截来实现NameError。
    但这在交互式 Python 中不起作用(例如,在Jupyter Notebook),
    它仅在从命令行运行时才起作用:

    import traceback as tb
    import sys
    import re
    
    def my_except_hook(exctype, value, traceback):
        rx = re.compile(r'([^\(]+)\(\"([^\"]*)\"\)')
        line = next(iter(tb.extract_tb(traceback))).line
        text, command = rx.findall(line)[0]
        print(f'{command}("{text}")')
    
    sys.excepthook = my_except_hook
    
    hello_world("print")
    

    结论:

    print("hello_world")
    

    字符数有320个,懒得按字符数来优化了。
    而且分析本身还不是很漂亮。
    我有兴趣尝试这个概念。


    更新:

    比赛用182个字符:

    import re,sys,traceback as t
    def h(d,o,b):print('{1}("{0}")'.format(*re.findall(r'([^\(]+)\(\"([^\"]*)\"\)',next(iter(t.extract_tb(b))).line)[0]))
    sys.excepthook=h
    hello_world("print")
    
    • 13
  2. extrn
    2024-08-25T10:45:16Z2024-08-25T10:45:16Z

    Perl,61 个字符

    我重新阅读了条件,现在才注意到允许使用单引号

    AUTOLOAD{$AUTOLOAD=~/::/;print"@_('$'')"}
    HelloWorld('print')
    

    在线尝试一下!

    可读

    use strict;
    use warnings;
    
    # функция, выполняемая при вызове неизвестного имени.
    # sub в ее случае указывать необязательно
    sub AUTOLOAD {
        # аргументы записываются в массив @_
        my @args = @_;
        # а в переменную $AUTOLOAD - полное имя функции, например "main::HelloWorld"
        our $AUTOLOAD;
        # с помощью регулярного выражения, ищем в ней ::
        $AUTOLOAD =~ /::/;
        # не попавшая под регулярное выражение часть строки записывается в переменную $'
        my $name = $';
        # при интерполяции, массив отображается в виде разделенной пробелами строки,
        # но аргумент у нас один, так что пробелы не появятся
        print("@args('$name')")
    }
    
    HelloWorld("print")
    
    • 10
  3. dofi4ka
    2024-08-26T08:08:28Z2024-08-26T08:08:28Z

    Python 145 - 164 个字符(有或没有最后一行)

    我想想出一些原创的东西:)

    exec('#'+open(__file__).read(),type('',(dict,),{'__getitem__':lambda s,i:s.get(i,lambda x:print(f"{x}({i!r})"))})(__builtins__.__dict__));exit()
    helloworld("print")
    

    更易读的版本

    class DefaultDict(dict):  # пользовательский класс в котором изменён дандер получения элемента
        def __getitem__(self, key):  # в случае если элемента нет в словаре возвращаем лямбду
            return self.get(key, lambda arg: print(f"{arg}({key!r})"))
    
    
    # создаём новый экземпляр нашего класса передавая в него словарь всех built-in имен чтобы не сломать логику их получения
    env_globals = DefaultDict(__builtins__.__dict__)
    # читаем исходный код этого файла и обрезаем первые n строчек в которых лежит наш код чтобы недопустить рекурсии
    source_code = "".join(open(__file__).readlines()[14:])
    
    # запускаем весь оставшийся код передавая в качестве словаря глобальных переменных экземпляр нашего класса
    exec(source_code, env_globals)
    # выходим из программы чтобы не выполнять весь код ниже ещё раз и не получить NameError
    exit()
    

    老实说,没有拐杖,即使这个代码也有效:

    exec('#'+open(__file__).read(),type('',(dict,),{'__getitem__':lambda s,i:s.get(i,lambda x:print(f"{x}({i!r})"))})(__builtins__.__dict__));exit()
    
    import turtle
    
    helloworld("print")
    
    turtle.tracer(-1)
    turtle.pensize(40)
    turtle.teleport(-50, -80)
    turtle.dot(40)
    turtle.teleport(-50, 80)
    turtle.dot(40)
    
    turtle.teleport(60, -186)
    turtle.left(50)
    for i in range(81):
        turtle.forward(5)
        turtle.left(1)
    
    print(":)")
    
    Ohh_HelloWorld("print")
    
    turtle.mainloop()
    

    而且,与其他 Python 解决方案不同,我的代码在运行时捕获任何函数调用,因此此代码也可以工作:

    exec('#'+open(__file__).read(),type('',(dict,),{'__getitem__':lambda s,i:s.get(i,lambda x:print(f"{x}({i!r})"))})(__builtins__.__dict__));exit()
    
    computed_str = "hello_" + "world"
    
    globals()[computed_str]("print")
    
    • 8
  4. Stanislav Volodarskiy
    2024-08-25T06:18:33Z2024-08-25T06:18:33Z

    Python,85 个字符

    _,s=open(__file__);a,b,_=s.split('"');print(f'{b}("{a}\b")')and\
    HelloWorld("print")
    

    相同的代码以更易读的形式:

    _, s = open(__file__); a, b, _ = s.split('"'); print(f'{b}("{a}\b")') and \
    HelloWorld("print")
    

    print在第一行末尾返回None.\在那里它将第一行和第二行粘在一起。该表达式None and ...从不计算第二个参数。文件的最后一行不会被评估,也不会导致错误。

    该程序读取自己的代码,假设它恰好包含两行 ( _, s = open(__file__)),解析第二行 ( a, b, _ = s.split('"')),并打印所需的结果。该变量包含一个额外的左括号;打印时a它会被字符删除。\b结果看起来是正确的,但如果将其重定向到流,您可以看到断括号和删除它的退格键:

    $ python temp.py
    print("HelloWorld")
    
    $ python temp.py | python -c "print(repr(input()))"
    'print("HelloWorld(\x08")'
    

    如果"print"始终相同,则 83 个字符:

    _,s=open(__file__);a,_=s.split('(');print(f'print("{a}")')and\
    HelloWorld("print")
    
    • 7
  5. Stanislav Volodarskiy
    2024-08-26T03:28:44Z2024-08-26T03:28:44Z

    Python,120 个字符

    import inspect as i;*_,f=i.currentframe().f_code.co_names;locals()[f]=lambda s:print(f'{s}("{f}")')
    HelloWorld("print")
    

    以可读形式:

    import inspect
    
    fname = inspect.currentframe().f_code.co_names[-1]
    
    locals()[fname] = lambda s: print(f'{s}("{fname}")')
    
    HelloWorld("print")
    

    inspect.currentframe().f_code检索 Python 解释器当前正在执行的代码。.co_names- 当前代码中提到的所有标识符的列表。列表中的名字按首次出现的顺序列出。我们需要姓氏。

    下一行将此名称分配给打印函数。

    当解释器到达最后一行时,其中的函数已经定义并打印所需的内容。

    PS该解决方案不需要从磁盘读取源代码文件。

    • 6
  6. Qwertiy
    2024-08-26T05:23:35Z2024-08-26T05:23:35Z

    在所有计算中:

    • 换行符算作 1 个字符,但仅在需要时才算(异议者可以根据;需要删除或替换)
    • console.log在浏览器版本中,在计数之前,需要将其替换为alert

    所有解决方案都假设文件中只有一个输出命令(尽管有些可以针对多个输出命令进行改进),并且它将是文件中除包装器之外的唯一代码。

    HTML + JS,128 个字符

    显示文本的限制:禁止所有关键字和多个全局属性。

    eval(document.currentScript.textContent.replace(/.*?(\w+)\("(.*)"\).*/s,"$1=()=>$2('$1')"))
    HelloWorld("console.log")

    console.log替换为的最小工作(无效)html 文件print将如下所示:

    <script>eval(document.currentScript.textContent.replace(/.*?(\w+)\("(.*)"\).*/s,"$1=()=>$2('$1')"))
    HelloWorld("alert")</script>
    

    NodeJS,104 个字符

    显示文本的限制:禁止所有关键字和多个全局属性(例如undefined)。

    eval((""+arguments.callee).replace(/.*?(\w+)\("(.*)"\).*/s,"$1=()=>$2('$1')"))
    HelloWorld("console.log")
    

    NodeJS,111 个字符

    显示文本限制:禁止所有关键字。

    console.log((""+arguments.callee).replace(/.*?(\w+)\("(.*)"\).*/s,"$2('$1')"))
    return
    HelloWorld("console.log")
    
    • 5
  7. Qwertiy
    2024-08-26T05:59:49Z2024-08-26T05:59:49Z

    浏览器JS,93-6*3 = 75个字​​符

    显示文本的限制:并非所有关键字都被禁止。

    无需关注显示的错误 - 这就是代码片段的工作原理。如果你查看浏览器控制台,那里没有错误。

    输出后,脚本执行将停止。

    参数(要输出的函数的名称)被忽略(似乎这可以通过条件实现?)。

    onerror=e=>!console.log('console.log("'+e.match(/: (\w+)/)[1]+'")')
    HelloWorld("console.log")

    PS:console.log->alert计数时。

    • 5
  8. dofi4ka
    2024-08-25T01:33:43Z2024-08-25T01:33:43Z

    您可以从一开始就读取可执行文件,输出所有正确的打印并结束进程,以免遇到 NameError 错误。

    总共,我的代码有105 个字符 + hello world 行

    _,*f=open(__file__);[l[:-1]and(j:=l.strip().split("("),print(j[1][1:-2]+f"('{j[0]}')"))for l in f];exit()
    
    helloworld("print")
    

    该代码只是在任何非空行中滑动函数名称和参数,因此例如type_age("input")它将以相同的方式翻译为input("type_age")

    如果我们确定只处理打印,那么我们可以对其进行硬编码并获得86 个字符

    _,*f=open(__file__);[l[:-1]and(print(f"print('{l.split("(")[0]}')"))for l in f];exit()
    
    helloworld("print")
    

    最有可能的是,可以进行优化和进一步优化,但最好还是了解更清晰的任务标准

    • 4
  9. AnnaBazueva
    2024-08-25T02:11:37Z2024-08-25T02:11:37Z

    解决方案(不是拐杖)136个字符!

    竞赛代码:

    import re
    for f in re.findall(r'\w+(?=\(\"pr)',open(__file__).read()):locals()[f]=lambda x,f=f:print(f'{x}("{f}")')
    Hello_world("print")
    

    这段代码不允许出现异常NameError!

    可读版本:

    import re
    
    def create_function(name):
        def func(param):
            print(f'{param}("{name}")')
        return func
    
    for f in re.findall(r'\w+(?=\(\"print\"\))', open(__file__).read()):
        locals()[f] = create_function(f)
    
    Hello_world("print")
    It_is_not_print("print")
    

    输出:

    (.venv) PS C:\KWORK> & c:/KWORK/.venv/Scripts/python.exe c:/KWORK/not_print.py
    print("Hello_world")
    print("It_is_not_print")
    (.venv) PS C:\KWORK> 
    

    请看我的相关问题!

    • 4
  10. Qwertiy
    2024-08-26T06:00:58Z2024-08-26T06:00:58Z

    JavaScript,92 个字符(浏览器为 86 个)

    显示文本的限制:禁止所有关键字,仅此而已。

    换行是可选的;可以在浏览器中进行alert。

    with(new Proxy({},{has:t=>1,get:(t,s)=>f=>eval(f)(f+'("'+s+'")')}))
    HelloWorld("console.log")

    PS:这似乎是我拥有的最干净的 js 解决方案。

    • 4

相关问题

  • SOLID——ISP原理的讨论(接口隔离原理,接口分离)

  • 条件运算符和三元运算符有什么区别?

  • 解释翻译和编译

  • 如何在不使用标准语言函数的情况下计算 abs [关闭]

  • 在具有不同设置的打印机上打印文档的脚本使用什么?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5