2008年8月12日星期二

又一次诡异的终结

明天就要上学去了呢
寄宿制学校就这点不好,估计将有两三个星期碰不了电脑了
今天又错过一场 TJU 上一场比赛,好像还是有一定难度,可惜!哪天抽空把题做一下吧。
唯一可喜可贺的是今天终于在 coLinux 上成功降级 KDE4 到 KDE 3.5.6,另外 Xming 也调试成功了,也在新的环境下玩了一把 Konquest,感觉速度很好,几乎等同于本地环境,不知道是不是心理作用。
不过对 OpenGL 的应用来说 Xming 还是很差劲,对 OpenGL 的支持仅仅停留在对微软垃圾 OpenGL 驱动的封装上。我本想在 Windows 下体验一把 chromium 和 supertuxkart,结果是 chromium 巨卡无比(基本上是 5fps 的速度),supertuxkart 启动后窗口内一片漆黑,并且无法关闭。在 coLinux 终端内直接 Ctrl-Z 之后,那个窗口还是没有消失。最后只能重新启动 Xming。
看来想在 Windows 下跑 Linux 还是长路漫漫啊,不过至少 KDE 是可以无缝运行了,等到哪天有空尽量把 LaTeX 和 Kile 编译好(我编译 IceWeasel 用了近一个小时,编译这两个东西估计又得放在晚上了),这样之后就可以随意移动我的工作环境了。

不过 9 月正式开学之前可能要先丢下 Linux 和 OI 一段时间了 :-(

2008年8月1日星期五

趣题:输出自己代码的程序

考虑这样一个问题:编写一个高级语言程序,能在不访问所有外界数据的情况下,直接输出它本身的源代码,这个输出必须和程序源代码完全相同。


















====================================
初看起来,这怎么可能呢?但这样的程序的确是存在的。比如,下面这个 Pascal 程序就可以做到:


const a='const a=';b=';begin write(a,#39,a,#39#59#98#61#39,b,#39,b)end.';begin write(a,#39,a,#39#59#98#61#39,b,#39,b)end.



这个还算比较简单的,还有更牛*的(删掉换行):


program s;const bbb='program s;const bbb';a='a';b='b';bb=');writeln(';
aa='''';ab='=''';ba=''';';
aaa='begin writeln(bbb,ab,bbb,ba,a,ab,a,ba,b,ab,b,ba,b,b,ab,bb,ba';
aba='a,a,ab,aa,aa,ba,a,b,ab,ab,aa,ba,b,a,ab,aa,ba,ba';
abb='a,a,a,ab,aaa,ba);writeln(a,b,a,ab,aba,ba);writeln(a,b,b,ab,abb,ba';
baa='b,a,a,ab,baa,ba);writeln(b,a,b,ab,bab,ba);writeln(aaa,bb';
bab='aba,bb);writeln(abb);writeln(bb,baa);writeln(bb,bab)end.';
begin writeln(bbb,ab,bbb,ba,a,ab,a,ba,b,ab,b,ba,b,b,ab,bb,ba);writeln(
a,a,ab,aa,aa,ba,a,b,ab,ab,aa,ba,b,a,ab,aa,ba,ba);writeln(
a,a,a,ab,aaa,ba);writeln(a,b,a,ab,aba,ba);writeln(a,b,b,ab,abb,ba
);writeln(b,a,a,ab,baa,ba);writeln(b,a,b,ab,bab,ba);writeln(aaa,bb
);writeln(aba,bb);writeln(abb);writeln(bb,baa);writeln(bb,bab)end.


C++ 版本:

#include
main(){char*s="#include%cmain(){char*s=%c%s%c;cout.form(s,10,34,s,34,10);}%c";cout.form(s,10,34,s,34,10);}


BrainF**k 版本:

>>+++++++>>++>>++++>>+++++++>>+>>++++>>+>>+++>>+>>+++++>>+>>++>>+>>++++++>>++>>++++>>+++++++>>+>>+++++>>++>>+>>+>>++++>>+++++++>>+>>+++++>>+>>+>>+>>++++>>+++++++>>+>>+++++>>++++++++++++++>>+>>+>>++++>>+++++++>>+>>+++++>>++>>+>>+>>++++>>+++++++>>+>>+++++>>+++++++++++++++++++++++++++++>>+>>+>>++++>>+++++++>>+>>+++++>>++>>+>>+>>+++++>>+>>++++++>>+>>++>>+>>++++++>>+>>++>>+>>++++++>>+>>++>>+>>++++++>>+>>++>>+>>++++++>>+>>++>>+>>++++++>>+>>++>>+>>++++++>>++>>++++>>+++++++>>+>>+++++>>+++++++>>+>>+++++>>+>>+>>+>>++++>>+>>++>>+>>++++++>>+>>+++++>>+++++++>>+>>++++>>+>>+>>++>>+++++>>+>>+++>>+>>++++>>+>>++>>+>>++++++>>+>>+++++>>+++++++++++++++++++>>++>>++>>+++>>++>>+>>++>>++++>>+++++++>>++>>+++++>>++++++++++>>+>>++>>++++>>+>>++>>+>>++++++>>++++++>>+>>+>>+++++>>+>>++++++>>++>>+++++>>+++++++>>++>>++++>>+>>++++++[<<]>>[>++++++[-<<++++++++++>>]<<++..------------------->[-<.>>+<]>[-<+>]>]<<[-[-[-[-[-[-[>++>]<+++++++++++++++++++++++++++++>]<++>]<++++++++++++++>]<+>]<++>]<<[->.<]<<]


Befunge 版本:

:0g,:93+`#@_1+



这样的程序被称作“自展”程序(不是自展编译器-_-),http://www.nyx.net/~gthompso/quine.htm 这个网站上提供了各种语言大量的自展程序,大家闲暇时候可以去看看 ^_^