刚才在水区看到一个有点意思的题目:
程序运行后输出的结果就是程序本身一模一样的源代码
第一个调试通过的30分,之后通过的10分,最简短的加10分,有创意的加10分
余下散掉(限C#代码,最好是控制台程序)

解决方案 »

  1.   

    //输出自己
    //VC6下通过#include <iostream>
    #include <fstream>
    using namespace std;
    int main()
    {    
        ifstream ifs(__FILE__);   
           cout << ifs.rdbuf();   
            ifs.close();   
         }
      

  2.   

    to codeloveforever:
    自己输出自己的源代码文件属于犯规,因为源代码本身不是执行程序的一部分。to hm7921936:
    逻辑?你是怎么推理的?如果没有答案这个题目就没有意思了...多谢关注,大家继续
      

  3.   

    Reflector...Reflector...Reflector...不过俺这么懒...是不愿动脑筋写这个代码的...
      

  4.   

    static void Main(string[] args)
            {
                string path = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
                path = path.Replace("\\bin\\Debug", "") + "Program.cs";
                if (System.IO.File.Exists(path) == true)
                {
                    System.IO.StreamReader stream = new System.IO.StreamReader(path);
                    string mystring;
                    mystring = stream.ReadToEnd();
                    Console.Write(mystring);
                }
                System.Console.ReadKey();
            }
      

  5.   

    static void Main(string[] args)
            {
                string path = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
                path = path.Replace("\\bin\\Debug", "") + "Program.cs";
                if (System.IO.File.Exists(path) == true)
                {
                    System.IO.StreamReader stream = new System.IO.StreamReader(path);
                    string mystring;
                    mystring = stream.ReadToEnd();
                    Console.Write(mystring);
                    stream.Close();
                }
                System.Console.ReadKey();
            }
      

  6.   

    呵呵,已经说过,自己读自己的源代码是犯规
    我先把自己写答案贴在这里,采用base64贴出
    觉得没什么好的想法或不怕被限制思路,可以解开看dXNpbmcgU3lzdGVtOw0KdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQp1c2luZyBTeXN0ZW0uVGV4dDsNCm5hbWVzcGFjZSBDb25zb2xlQXBwbGljYXRpb24xDQp7DQogICAgY2xhc3MgUHJvZ3JhbQ0KICAgIHsNCiAgICAgICAgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQ0KICAgICAgICB7DQogICAgICAgICAgICBzdHJpbmdbXSBjb2RlTGluZXMgPSBuZXcgc3RyaW5nW10gew0KICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW07IiwNCiAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7IiwNCiAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLlRleHQ7IiwNCiAgICAgICAgICAgICAgICAibmFtZXNwYWNlIENvbnNvbGVBcHBsaWNhdGlvbjEiLA0KICAgICAgICAgICAgICAgICJ7IiwNCiAgICAgICAgICAgICAgICAiICAgIGNsYXNzIFByb2dyYW0iLA0KICAgICAgICAgICAgICAgICIgICAgeyIsDQogICAgICAgICAgICAgICAgIiAgICAgICAgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKSIsDQogICAgICAgICAgICAgICAgIiAgICAgICAgeyIsDQogICAgICAgICAgICAgICAgIiAgICAgICAgICAgIHN0cmluZ1tdIGNvZGVMaW5lcyA9IG5ldyBzdHJpbmdbXSB7IiwNCiAgICAgICAgICAgICAgICAiIiwNCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgfTsiLA0KICAgICAgICAgICAgICAgICIgICAgICAgICAgICBmb3JlYWNoIChzdHJpbmcgY29kZUxpbmUgaW4gY29kZUxpbmVzKSIsDQogICAgICAgICAgICAgICAgIiAgICAgICAgICAgIHsiLA0KICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgaWYgKGNvZGVMaW5lID09IHN0cmluZy5FbXB0eSkiLA0KICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgeyIsDQogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGNvbnN0TGluZSBpbiBjb2RlTGluZXMpIiwNCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICB7IiwNCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gMTY7IGkrKykiLA0KICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgoY2hhcikweDIwKTsiLA0KICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKChjaGFyKTB4MjIpOyIsDQogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoY29uc3RMaW5lKTsiLA0KICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKChjaGFyKTB4MjIpOyIsDQogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKChjaGFyKTB4MkMpOyIsDQogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgfSIsDQogICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICB9IiwNCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGNvZGVMaW5lKTsiLA0KICAgICAgICAgICAgICAgICIgICAgICAgICAgICB9IiwNCiAgICAgICAgICAgICAgICAiICAgICAgICAgICAgQ29uc29sZS5SZWFkS2V5KCk7IiwNCiAgICAgICAgICAgICAgICAiICAgICAgICB9IiwNCiAgICAgICAgICAgICAgICAiICAgIH0iLA0KICAgICAgICAgICAgICAgICJ9IiwNCg0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBjb2RlTGluZSBpbiBjb2RlTGluZXMpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgaWYgKGNvZGVMaW5lID09IHN0cmluZy5FbXB0eSkNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBjb25zdExpbmUgaW4gY29kZUxpbmVzKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSAxNjsgaSsrKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoKGNoYXIpMHgyMCk7DQogICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKChjaGFyKTB4MjIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShjb25zdExpbmUpOw0KICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgoY2hhcikweDIyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKChjaGFyKTB4MkMpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGNvZGVMaW5lKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIENvbnNvbGUuUmVhZEtleSgpOw0KICAgICAgICB9DQogICAgfQ0KfQ0K
      

  7.   

    .Net虽然不像JAVA直接源代码执行,但是其代码是可以逆转换的,解析之初是IL代码,然后能映射为C#代码,现在就有很知名的程序专门逆向.Net工程。
    但是做到和源代码一模一样是不可能的,只能做到功能上完全一样,甚至成员名称也一样,所以为防止逆向工程侵害版权,才有混淆器的出现,混淆器将所有成员以无意义的名称重命名,以给逆转者造成阅读障碍。
      

  8.   

    即使 Reflector 之后也不是原原本本的
      

  9.   

    using System;class PrintSource
    {
        static void Main()
        {
            string s = "using System;{0}{0}class PrintSource{0}{2}{0}    static void Main(){0}    {2}{0}        string s = {1}{4}{1};{0}        Console.WriteLine(s, (char)10, (char)34, (char)123, (char)125, s);{0}    {3}{0}{3}";
            Console.WriteLine(s, (char)10, (char)34, (char)123, (char)125, s);
        }
    }
      

  10.   

    fish_autumn写的代码调试通过和C代码很象#include <stdio.h>
    char *a="#include <stdio.h>%c%cchar *a=%c%s%c;%c%cint main(){printf(a,13,10,34,a,34,13,10); return 0;}"; 
    int main(){printf(a,13,10,34,a,34,13,10); return 0;}我写的代码是这样的,长了一点:using System;
    using System.Collections.Generic;
    using System.Text;
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                string[] codeLines = new string[] {
                    "using System;",
                    "using System.Collections.Generic;",
                    "using System.Text;",
                    "namespace ConsoleApplication1",
                    "{",
                    "    class Program",
                    "    {",
                    "        static void Main(string[] args)",
                    "        {",
                    "            string[] codeLines = new string[] {",
                    "",
                    "            };",
                    "            foreach (string codeLine in codeLines)",
                    "            {",
                    "                if (codeLine == string.Empty)",
                    "                {",
                    "                    foreach (string constLine in codeLines)",
                    "                    {",
                    "                        for (int i = 1; i <= 16; i++)",
                    "                            Console.Write((char)0x20);",
                    "                        Console.Write((char)0x22);",
                    "                        Console.Write(constLine);",
                    "                        Console.Write((char)0x22);",
                    "                        Console.WriteLine((char)0x2C);",
                    "                    }",
                    "                }",
                    "                Console.WriteLine(codeLine);",
                    "            }",
                    "            Console.ReadKey();",
                    "        }",
                    "    }",
                    "}",            };
                foreach (string codeLine in codeLines)
                {
                    if (codeLine == string.Empty)
                    {
                        foreach (string constLine in codeLines)
                        {
                            for (int i = 1; i <= 16; i++)
                                Console.Write((char)0x20);
                            Console.Write((char)0x22);
                            Console.Write(constLine);
                            Console.Write((char)0x22);
                            Console.WriteLine((char)0x2C);
                        }
                    }
                    Console.WriteLine(codeLine);
                }
                Console.ReadKey();
            }
        }
    }
      

  11.   

    思路是把源代码复制 然后重命名 成 txt格式的  然后读取
    应该是这样了的
      

  12.   

    不过如果是 C# 搞懂 公共语言运行 库就OK 了!~
      

  13.   

    很多人误解这道题了,我想这道题不是什么技术高深的问题,
    不是叫你反汇编,反MIL,读取源文件==,
    纯粹就是一道技巧题
    一但你Console.WriteLine("你的代码")
    那么在"你的代码"里又要包含"Console.WriteLine("你的代码")",而这里的"你的代码"就会造成两面对着的镜一样,会无限反射, 即自己照不出自己
    需要利用一定的字符操作的技巧才能完成这道题.
    例如 fish_autumn(Autumn) 的代码.
      

  14.   

    有那么难啊?...IO操作ReadLine不就可以了?
      

  15.   

    看了 fish_autumn(Autumn) 的代码
    成功的原因有两点
    1.在输出的语句使用了 {0} {1} {2]...
    2.在输出双引号时使用了 ASCII 码第一点使得他能自己输出自己
    只要Console.WriteLine(s, ... s);
    第二点免去了转义字符带来的麻烦你是可以想象在s="s = {0}...Console.WriteLine(s, \"\"\" s);";
    Console.WriteLine(s, "\"" s);在s里的 \"\"\"  与代码的"\""  产生不一致性
      

  16.   

    应该是
    s="s = {0}...Console.WriteLine(s, \"\\\"\" s);";
    Console.WriteLine(s, "\"" s);在s里的 \"\\\"\"  与代码的"\""  产生不一致性
      

  17.   

    再更正成功的原因有两点
    1.在输出的语句使用了 {0} {1} {2]...
    2.在输出符号时使用了 ASCII 码
      

  18.   

    没看明白LZ给出的代码,
                    "            string[] codeLines = new string[] {",
                    "",
                    "            };",
    这个地方有输出时是要将""替换掉的,但替换成什么样的字符串呢?替换了会不会和原代码一样呢?这里也存在迭代的问题吧??
      

  19.   

    如果用console输出字符串代码。 而不是反编译代码的话 ,根本无法实现的。 就和俩镜子对照一样。 无限反射。就和数字可以无限大一样。  
      

  20.   

    LS 运行一下
    fish_autumn(Autumn)  的代码, 他实现了
      

  21.   

    程序写的妙,是我没想到的。基本思路理解,琢磨了半天
    string s = "using System;{0}{0}class PrintSource{0}{2}{0}    static void Main(){0}    {2}{0}        string s = {1}{4}{1};{0}        Console.WriteLine(s, (char)10, (char)34, (char)123, (char)125, s);{0}    {3}{0}{3}";
            Console.WriteLine(s, (char)10, (char)34, (char)123, (char)125, s);只明白了一半,也许是语法不过关,谁来耐心解释一下,每个句读。
    不甚感激啊。
    这题目很有意思。
      

  22.   

    根据LZ的给出的代码提示,下面的代码测试通过
    using System;
    using System.Text;
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                string[] codeLines = new string[] {
                        "using System;",
                        "using System.Text;",
                        "namespace ConsoleApplication1",
                        "{",
                        "    class Program",
                        "    {",
                        "        static void Main(string[] args)",
                        "        {",
                        "            string[] codeLines = new string[] {",
                        "",
                        "            };",
                        "            foreach (string codeLine in codeLines)",
                        "            {",
                        "                if (codeLine ==string.Empty)",
                        "                {",
                        "                    foreach (string constLine in codeLines)",
                        "                    {",
                        @"                        if(constLine.IndexOf('+') >=0)",
                        @"                           Console.WriteLine(  new string(' ',10)  +  '\x40'.ToString() + '\x22'+ constLine + '\x22'+ '\x2C');",
                        "                         else",
                        @"                             Console.WriteLine(  new string(' ',10) + '\x22'+ constLine + '\x22' +'\x2C');",
                        "                    }",
                        "                }",
                        "                Console.WriteLine(codeLine);",
                        "            }",
                        "        }",
                        "    }",
                        "}",            };
                foreach (string codeLine in codeLines)
                {
                    if (codeLine == string.Empty )
                    {
                        foreach (string constLine in codeLines)
                        {
                            if(constLine.IndexOf('+') >=0)                            
                                Console.WriteLine( new string(' ',10) + '\x40'.ToString() + '\x22'+ constLine + '\x22'+ '\x2C');
                            else
                                Console.WriteLine( new string(' ',10) + '\x22'+ constLine + '\x22' +'\x2C');
                        }
                    }
                    Console.WriteLine(codeLine);
                }
            }
        }}
      

  23.   

    string s = "using System;{0}{0}class PrintSource{0}{2}{0}    static void Main(){0}    {2}{0}        string s = {1}{4}{1};{0}        Console.WriteLine(s, (char)10, (char)34, (char)123, (char)125, s);{0}    {3}{0}{3}";Console.WriteLine(s, (char)10, (char)34, (char)123, (char)125, s);Console.WriteLine() 时:
    (char)10: 即 \n ,替换s中的{0}
    (char)34: 即 "  ,替换s中的{1}
    (char)123:即 {  ,替换s中的{2}
    (char)125:即 }  ,替换s中的{3}
    s 本身替换s中的{4}
      

  24.   

    ...............................
    用反射得到当前运行的assembliy
    用Sharpdevelop的addin插件思路找到当前运行的CS文件
    参考楼上某兄的方法将cs文件路径替换static void Main(string[] args)
            {
                string path = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
                path = path.Replace("\\bin\\Debug", "") + "Program.cs";
                if (System.IO.File.Exists(path) == true)
                {
                    System.IO.StreamReader stream = new System.IO.StreamReader(path);
                    string mystring;
                    mystring = stream.ReadToEnd();
                    Console.Write(mystring);
                }
                System.Console.ReadKey();
            }
      

  25.   

    An old game!http://www.nyx.net/~gthompso/quine.htm
    http://www.cnblogs.com/Ninputer/archive/2006/04/04/366554.html
      

  26.   

    http://www.nyx.net/~gthompso/quine.htm
    这里收集得比较全,各种语言都有