什么是 Quine

Quine 即”自重写“程序,是指可以打印自身源代码的程序。

还挺好玩的

C 语言

在《Go 语言高级编程》一书中我了解到最短的 C 语言自重写程序是这样的:

main(a){printf(a="main(a){printf(a=%c%s%c,34,a,34);}",34,a,34);}

使用了 ASCII 码来处理字符串的双引号。不过 Go 语言的占位符 %q 可以自动加上双引号。

Go 语言

package main;func main(){c:="package main;func main(){c:=%q;print(c,c)}";print(c,c)}

Python 语言

受 C 语言启发,写了一个 Python 语言的自重写程序,同样只有一行:

s="s=%s%s%s;print(s%%(chr(34),s,chr(34)))";print(s%(chr(34),s,chr(34)))

Java 语言

前几天和 Bing 聊天的时候聊到”充满诗意的代码“,Bing 给出了一段 Java Quinie:

public class Quine {
    public static void main(String[] args) {
        char q = 34;
        String[] l = {
                "public class Quine {",
                "    public static void main(String[] args) {",
                "        char q = 34;",
                "        String[] l = {",
                "                ",
                "        };",
                "        for (int i = 0; i < 4; i++)",
                "            System.out.println(l[i]);",
                "        for (int i = 0; i < l.length; i++)",
                "            System.out.println(l[4] + q + l[i] + q + ',');",
                "        for (int i = 5; i < l.length; i++)",
                "            System.out.println(l[i]);",
                "    }",
                "}",
        };
        for (int i = 0; i < 4; i++)
            System.out.println(l[i]);
        for (int i = 0; i < l.length; i++)
            System.out.println(l[4] + q + l[i] + q + ',');
        for (int i = 5; i < l.length; i++)
            System.out.println(l[i]);
    }
}

有一种独特的美感。

2023-06-02