当前位置:  开发笔记 > 编程语言 > 正文

如何编写自我复制代码(在exec上打印源代码)?

如何解决《如何编写自我复制代码(在exec上打印源代码)?》经验,为你挑选了2个好方法。

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

一些解决方案

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

Quine Page解决方案有多种语言版本

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



1> vog..:

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

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

print ...

但是,应该打印什么?本身.所以它需要打印"print"命令:

print "print ..."

下一步应该打印什么?那么,在程序增长的同时,它也需要打印以"print"开头的字符串:

print "print \"print ...\""

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

print "print \"print \\\"...\\\"\""

等等.每增加一个代码,就会有更多代码需要打印.这种方法无处可去,但它揭示了一个有趣的模式:字符串"print \""一遍又一遍地重复.将重复部分放入变量会很好:

a = "print \""
print a

但是,程序刚改变了,所以我们需要调整一个:

a = "a = ...\nprint a"
print a

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

a = "a = " + (quoted contents of a) + "\nprint a"
print a

但这是不可能的,因为即使我们有这样的quoted()引用功能,仍然存在我们a根据自身定义的问题:

a = "a = " + quoted(a) + "\nprint a"
print a

所以我们唯一能做的就是把一个占位符放入a:

a = "a = @\nprint a"
print a

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

a = "a = @\nprint a"
print a.replace("@", quoted(a))

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

a = "a = @\nprint a.replace(\"@\", quoted(a))"
print a.replace("@", quoted(a))

就是这样!所有语言中的所有quines都以这种方式工作(欺骗者除外).

那么,你应该确保只更换占位符的第一个出现位置.如果你使用第二名持有人,你可以避免引用字符串.

但这些都是小问题,很容易解决.事实上,实现quoted()并且replace() 是各种细节真正不同的唯一细节.


¹使程序读取其源文件



2> aaronsw..:

编写quines有几种不同的策略.显而易见的是只编写打开代码并将其打印出来的代码.但更有趣的是涉及允许自嵌入的语言功能,例如许多语言中的%s风格的printf功能.您必须弄清楚如何嵌入某些内容,以便最终解析为嵌入请求.我怀疑,像palindromes一样,涉及很多试验和错误.

推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有