对quine问题的一点实践

quine

事情从千里码开始,看到高阶函数这个问题的时候,了解了quine问题,附上百科链接

相关quine实现

java

使用文本存储自身代码,通过多次循环输出自身

public class Quine
{
  public static void main(String[] args)
  {
    char q = 34;      // Quotation mark character
    String[] l = {    // Array of source code
    "public class Quine",
    "{",
    "  public static void main(String[] args)",
    "  {",
    "    char q = 34;      // Quotation mark character",
    "    String[] l = {    // Array of source code",
    "    ",
    "    };",
    "    for(int i = 0; i < 6; i++)           // Print opening code",
    "        System.out.println(l[i]);",
    "    for(int i = 0; i < l.length; i++)    // Print string array",
    "        System.out.println(l[6] + q + l[i] + q + ',');",
    "    for(int i = 7; i < l.length; i++)    // Print this code",
    "        System.out.println(l[i]);",
    "  }",
    "}",
    };
    for(int i = 0; i < 6; i++)           // Print opening code
        System.out.println(l[i]);
    for(int i = 0; i < l.length; i++)    // Print string array
        System.out.println(l[6] + q + l[i] + q + ',');
    for(int i = 7; i < l.length; i++)    // Print this code
        System.out.println(l[i]);
  }
}

python

暂时不太懂这段python的原理

s = 's = %r\nprint(s%%s)'
print(s%s)

javascript

通过callee.toString()获取自身代码,再通过截取这段字符串获取自身整体的代码

Quine = function () {var str = arguments.callee.toString(); Quine = console.log(str.substring(52, 60) + str +
 str.substring(32, 37) + str.substring(9, 11));}.call()

通过输出a来输出函数自身,下面那个是我改了一下方便在console执行

function a() {
    document.write(a, "a()");
}
a()
或
function a() {
    console.log(a+"a()");
}a()

php

获取自身文本

<? highlight_file(__FILE__) ?>

我的尝试

由于上面php的实现太简单了,我想实现一个使用函数的quine
于是模仿上面java的代码写了下面这个小函数

function a(){
    $p=chr(39);$q=chr(10);$t=chr(9);
    $b=array(
        'function a(){',
        '$p=chr(39);$q=chr(10);$t=chr(9);',
        '$b=array(',
        ');',
        '}',
        'a();',
        'echo $b[0].$q;',
        'for($i=1;$i<3;$i++)echo $t.$b[$i].$q;',
        'for($i=0;$i<count($b);$i++)echo $t.$t.$p.$b[$i].$p.",".$q;',
        'echo $t.$b[3].$q;',
        'for($i=6;$i<13;$i++)echo $t.$b[$i].$q;',
        'echo $b[4].$q;',
        'echo $b[5];',
    );
    echo $b[0].$q;
    for($i=1;$i<3;$i++)echo $t.$b[$i].$q;
    for($i=0;$i<count($b);$i++)echo $t.$t.$p.$b[$i].$p.",".$q;
    echo $t.$b[3].$q;
    for($i=6;$i<13;$i++)echo $t.$b[$i].$q;
    echo $b[4].$q;
    echo $b[5];
}
a();

改的乱七八糟的,但是确实能输出自己

今天本来不加班的,写这个小函数写了好一会,挺有意思的

最后修改:2018 年 04 月 25 日 10 : 26 AM

1 条评论

  1. moozik

    感觉我把简单问题复杂化了,纠结

发表评论