gpt4 book ai didi

programming-languages - 如何编写 self 复制代码(在 exec 上打印源代码)?

转载 作者:行者123 更新时间:2023-12-03 08:36:18 25 4
gpt4 key购买 nike

我已经看到很多基于 C/C++ 的解决方案来解决这个问题,我们必须编写一个程序,在执行时打印它自己的源代码。

一些解决方案——

http://www.cprogramming.com/challenges/solutions/self_print.html

Quine Page solution in many languages

网络上有更多的解决方案,每个解决方案都各不相同。我想知道我们如何处理这样一个问题,解决这个问题的人的内心是什么。借给我一些关于这个问题的见解......虽然解释语言(如 perl、php、ruby 等)的解决方案可能很容易......我想知道如何用编译语言设计它......

最佳答案

除了作弊¹之外,编译语言和解释语言之间没有区别。

quines 的通用方法非常简单。首先,无论程序是什么样的,在某些时候它必须打印一些东西:

打印 ...

但是,它应该打印什么?本身。所以它需要打印“打印”命令:

打印“打印...”

接下来应该打印什么?好吧,与此同时程序也在增长,所以它也需要打印以“print”开头的字符串:

打印“打印\”打印...\“”

现在程序再次增长,所以还有更多要打印的内容:

打印"打印\"打印\\\"...\\\"\""

等等。
每添加一个代码,就会有更多代码要打印。
这种方法行不通,
但它揭示了一个有趣的模式:
字符串 "print\""一遍又一遍地重复。
把重复的部分放上去就好了
变成一个变量:

a = "打印\""
打印一个

然而,程序刚刚改变,
所以我们需要调整一个:

a = "a = ...\n打印一个"
打印一个

当我们现在尝试填写“...”时,
我们遇到了和以前一样的问题。
最终,我们想写这样的东西:

a = "a = "+ (a 的引用内容) + "\nprint a"
打印一个

但这是不可能的,
因为即使我们有这样的功能 quoted()引用,
还有我们定义的问题a就其本身而言:

a = "a = "+ 引用(a) + "\nprint a"
打印一个

所以我们唯一能做的就是在 a 中放置一个占位符。 :

a = "a = @\n打印一个"
打印一个

这就是全部技巧!
现在其他任何事情都清楚了。
只需更换占位符
引用内容为a :

a = "a = @\n打印一个"
打印 a.replace("@", 引用(a))

由于我们更改了代码,
我们需要调整字符串:

a = "a = @\nprint a.replace(\"@\", 引用(a))"
打印 a.replace("@", 引用(a))

就是这样!
所有语言的所有quines都以这种方式工作
(作弊者除外)。

那么,你应该确保你只更换
占位符的第一次出现。
如果你使用第二个占位符,
您可以避免需要引用字符串。

但这些都是小问题
并且容易解决。
其实quoted()的实现和 replace()是各种quines真正不同的唯一细节。

¹ 通​​过让程序读取其源文件

关于programming-languages - 如何编写 self 复制代码(在 exec 上打印源代码)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/105725/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com