【问题标题】:Quine Confusion.What actually does quine prints?Quine Confusion.Quine 打印的究竟是什么?
【发布时间】:2010-09-05 07:40:00
【问题描述】:

quine 打印程序的实际代码(即未混淆)还是打印混淆程序?

【问题讨论】:

    标签: c quine


    【解决方案1】:

    我不认为混淆与它有任何关系。通常,quine 会打印程序本身的实际源代码。

    【讨论】:

    • 顺便说一句:前几天你的家乡不是发生了大地震吗?一切都好吗?
    • @Hans Passant:谢谢你的提问,你是第一个这样 :) 这里一切都很好,房子和内容(包括人)都很好。电力、水,甚至互联网在整个活动期间都是连续的(即使在一个街区之外也不是真的)。​​
    【解决方案2】:

    假设您有一个 C 程序,它打印其源代码的“混淆”或其他修饰版本。例如,假设空格或变量名称有所不同。

    那么那个程序就不是一个 quine,因为根据定义,一个 quine 是一个打印自己的程序,而“它自己”是指完全相同的字节序列。但是该程序的输出,一旦编译,将打印与原始程序相同的内容(因为它只是一个装饰变体),即它本身。所以输出是一个quine。

    这有时会简化编写 quine 的过程 - 只需编写一个“nearly-quine”,它可能无法获得完全正确的格式,运行一次,输出就是您的实际 quine。

    这一切都假设一个 quine 在 C 中。 x86 机器代码中的 quine 必须输出的不是其 C 源代码,而是构成 .exe 文件的相同字节序列。

    我不确定您所说的“实际代码”与“混淆代码”是什么意思,但要测试某物是否是 quine,您必须确定它应该是哪种语言。也许通过决定您可以回答自己的问题 - 您只是想要 C 中的 quine,还是与您的混淆器有关的 quine?

    【讨论】:

      【解决方案3】:

      这是标准 C 中的实际 quine,位于 Wikipedia

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

      您会注意到它的结构相对简单。它使用包含程序文本的字符串常量作为格式字符串和要由printf() 格式化的值之一。

      编译并运行时,它会准确打印出那一行代码。

      wiki 文章中有多种语言的 quines 示例,包括 C 语言中的更多示例。

      【讨论】:

        【解决方案4】:

        以下是一个简单的 quine 代码。此源代码需要保存为“quine_file.c”。编译并执行。

        这里取了一个简单的文件指针,用于逐行读取源文件并打印到stdout。

        #include <stdio.h>
        #include <stdlib.h>
        
        void main()
        {
              FILE *fp = NULL;
              char * line = NULL;
              int len = 0;
              int read;
              fp = fopen("quine_file.c","r");
              if(fp == NULL)
                   return;
              while ((read = getline(&line, &len, fp)) != -1) 
              {
                   printf("%s", line);
              }
              fclose(fp);
              if (line)
                  free(line);
              exit(EXIT_SUCCESS);
        }
        

        【讨论】:

          【解决方案5】:

          quine 是一个打印自己的列表的程序。这意味着当程序运行时,它必须准确地打印出程序员作为程序一部分编写的那些指令(当然,包括执行打印的指令,以及打印中使用的数据)。

          - 大卫·马多雷

          Further reading

          JavaScript 示例

          $=_=>`$=${$};$()`;$();
          

          这个程序在执行时会显示以下字符串

          "$=_=>`$=${$};$()`;$();"
          

          在代码艺术中精选 video @ 30m21s - 迪伦·比蒂

          【讨论】:

            【解决方案6】:
            #include <stdio.h>
            main(){
            FILE* fp = fopen("printItself.c", "r");
            int c;
            while ((c = getc(fp)) != EOF)  putc(c, stdout);
            }
            

            将它保存在一个名为 printItself.c 的文件中......前面例子的问题是,如果我在程序中添加一行,例如 int x;在处理换行符和空格等的同时,我还必须将其添加到字符串中......但在这个例子中,你可以添加任何你想要的东西。

            【讨论】:

            • 任何接受输入文件的东西都不是 quine
            猜你喜欢
            • 2014-10-28
            • 2012-08-27
            • 2010-11-12
            • 2011-03-18
            • 2011-01-22
            • 1970-01-01
            相关资源
            最近更新 更多