Ken Thompson可是大牛人了!不认识的人赶快Google/百度一下。Ken爷爷是Unix创始人,C语言鼻祖!Ken 当时大学时候没游戏玩,就自己给自己出题目写程序,就有了这个复制自身代码的程序了,相当经典,当然那时还没有C语言, Ken 是用 Fortran 编的. 后来在获图灵奖的演说中, Ken 用 C 语言演示了这个程序.请看Ken爷爷的经典C程序:

Ken Thompson 的经典 C 程序

我尝试用Python来完成这个复制自己的程序,出乎预料,我最短只用了两行就完成了,可见Python的强大。

解法一:
= "print 'a = ', repr(a), '\n', repr(a)[1:-5]', a"
print 'a = ', repr(a), '\n', repr(a)[1:-5]

输出结果:
a =  "print 'a = ', repr(a), '\n', repr(a)[1:-5]', a"
print 'a = ', repr(a), '\n', repr(a)[1:-5]

解法二:
= ["print 'a = ', a, '\\n', ''.join(a)"]
print 'a = ', a, '\n'''.join(a)
输出结果:
a = ["print 'a = ', a, '\\n', ''.join(a)"]
print 'a = ', a, '\n', ''.join(a)

有兴趣的朋友可以用C#试试~~
最后,真心祝愿震区的朋友平安。让我们坚信:中国人民是不可战胜的!

Feedback

#1楼    回复  引用  查看    

2008-05-13 09:50 by volnet(可以叫我大V)      
解法2是不是少了‘[]’?
不懂Python,可能是我错了

#2楼    回复  引用  查看    

2008-05-13 09:50 by 傻样精英      
为什么非要百度一下,我google一下行不行?

#3楼 [楼主]   回复  引用  查看    

2008-05-13 09:55 by CoderZh      
@傻样精英
一样的,我随口说的百度

#4楼 [楼主]   回复  引用  查看    

2008-05-13 09:57 by CoderZh      
@volnet(可以叫我大V)
你指的哪里少了[]?貌似没少的,我这里输出的结果是正确的。

#5楼 [楼主]   回复  引用  查看    

2008-05-13 09:58 by CoderZh      
@傻样精英
拿你没辙,把google加上去了。

#6楼 [楼主]   回复  引用  查看    

2008-05-13 10:01 by CoderZh      
@volnet(可以叫我大V)
对了,原来你把两个单引号看做是双引号了
''.join ---> 是两个单引号来着
是Python中比较经典的用法

#7楼    回复  引用    

2008-05-13 10:11 by ????????????????? [未注册用户]
谁是你爷爷???

#8楼    回复  引用  查看    

2008-05-13 10:12 by hailibu      
看得不太懂,希望有人解码成C#,关注ing

#9楼 [楼主]   回复  引用  查看    

2008-05-13 10:33 by CoderZh      
@?????????????????
称之为Ken爷爷是表示对他老人家的尊敬

#10楼    回复  引用    

2008-05-13 10:45 by 新用户 [未注册用户]
上google去百度一下

#11楼    回复  引用    

2008-05-13 11:41 by o,my god [未注册用户]
output self source code for C#:

http://www.cnblogs.com/leadzen/archive/2008/03/24/1069061.html

#12楼 [楼主]   回复  引用  查看    

2008-05-13 12:28 by CoderZh      
@o,my god
不错

#13楼    回复  引用  查看    

2008-05-13 16:22 by 曲滨*銘龘鶽      
这有什么好玩?

不就是把自己打印出去了???

#14楼    回复  引用  查看    

2008-05-14 10:22 by John Rambo      
园子里有个大牛写过cs的版本:
class P{static void Main(){string s="class P{{static void Main(){{string s={1}{0}{1};System.Console.WriteLine(s,s,(char)34);}}}}";System.Console.WriteLine(s,s,(char)34);}}

#15楼 [楼主]   回复  引用  查看    

2008-05-14 12:30 by CoderZh      
@John Rambo
不错~

#16楼    回复  引用  查看    

2008-06-06 17:15 by 阿纳金      
有些地方不是很懂,尤其是那个repr函数
能解释的详细一点吗?

#17楼 [楼主]   回复  引用  查看    

2008-06-06 17:28 by CoderZh      
@阿纳金
你试一下
print repr('\n')

print '\n'
看结果怎样就明白了。

#18楼    回复  引用    

2008-06-13 11:12 by UFO_未占用版 [未注册用户]
说实话,我没看懂哪里“复制自身”了,都是固定好格式打印出来的。

#19楼    回复  引用    

2008-06-13 11:19 by UFO_未占用版 [未注册用户]
有本事写一个“通用的模块”来看看

#20楼 [楼主]   回复  引用  查看    

2008-06-13 13:46 by CoderZh      
@UFO_未占用版
"通用的模块"指的是什么?
这里的“复制自身”只是说把自身的源代码原样输出,不知道你理解的是??