Quine 程序 "The Qlobe":可旋转的自复制代码
来源标题:The Qlobe: Rotating Quine (2010)
程序员 yusuke 在 RubyConf 上展示了一个名为 The Qlobe 的 quine 程序,其源代码运行后会输出自身,并且输出的字符排布可以旋转展示。该程序用 Ruby 编写,通过 zlib 解压和位运算生成旋转后的代码图像,以适配国际场合而非仅面向日文环境。
以下正文由 AI 翻译自 Hacker News(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
我的 Quine 有时会专门针对日语做特化。但为了参加 RubyConf,我应该写一个“全球通用”的 Quine。
v=0000;eval$s=%qd=%!^Lcf<LK8, @7gj*LJ=c5nM)Tp1g0%Xv.,S[<>YoP
4ZojjV)O>qIH1/n[|2yE[>:ieC "%.#% :::##" 97N-A&Kj_K><wS5rtWk@a+Y5
yH?b[F^e7C/56j|pmRe+:)B "##% ::##########" O98(Zh)'Iofnm.,$C5Nyt=
PPu01Avw^<IiQ=5$'D-y? "##: ###############" g6;_ The Qlobe Copyright(C).Yusuke Endoh, 2010YT+qLw9k^ch|K'),tc 6ygIL8xI#LNz3v}T=4W "# #. .####:#######" lL27FZ0ij)7TQCI)P7u }RT5-iJbbG5P-DHB<. " ##### # :############" R,YvZ_rnv6ky-G+4U' $*are@b4U351Q-ug5 " #######################" 00x8RR%Om7VDp4M5
PFixrPvl&<p[]1IJ " ############:#### %#####" EGgDt8Lm#;bc4zS^
y]0`PstfUxOC(q " .#############:##% .## ." /,}.YOIFj(k&q_V
zcaAi?]^lCVYp!; " %% .################. #. " ;s="v=%04o;ev"%
(;v=(v-($+[45, ":####: :##############% : " ])[n=0].to_i;)%
360)+"al$s=%q#{ "%######. ######### " ;;"%c"%126+$s<<
126}";d.gsub!(/ "##########. #######% " |\s|"."/,"");;
require"zlib"|| "########### :######. " ;d=d.unpack"C*"
d.map{|c|n=(n|| ":#########: .######: . " )90+(c-2)%91};
e=["%x"%n].pack " :#######% :###### #: " &&"H";e=Zlib::
Inflate.inflate( " ######% .####% :: " &&e).unpack("b*"
)[0];22.times{|y| " ####% %### " ;w=(Math.sqrt(1-(
(y2.0-21)/22)**(; " .###: .#% " ;2))23).floor;(w
2-1).times{|x|u=(e+ " %## " )[yz=360,z]2;u=u[
90x/w+v+90,90/w];s[( " #. " ;y80)+120-w+x]=(""<<
32<<".:%#")[4u.count(( " . " ;"0"))/u.size]}};;puts
s+"; The Qlobe#{" "*18+ ( "# :#######" ;"Copyright(C).Yusuke End
oh, 2010")}";exit
这个 quine 每次执行会旋转 45 度;因此执行八次后它会回到原位(见下文)。你可以通过在命令行参数中给出一个整数,让它旋转任意角度。
v=0416;eval$s=%qd=%!^Lcf<LK8, @7gj*LJ=c5nM)Tp1g0%Xv.,S[<>YoP
4ZojjV)O>qIH1/n[|2yE[>:ieC ".#####%.#% " 97N-A&Kj_K><wS5rtWk@a+Y5
yH?b[F^e7C/56j|pmRe+:)B " .#####%##% :" O98(Zh)'Iofnm.,$C5Nyt=
PPu01Avw^<IiQ=5$'D-y? " #####%###: #" g6;_ The Qlobe Copyright(C).Yusuke Endoh, 2010YT+qLw9k^ch|K'),tc 6ygIL8xI#LNz3v}T=4W " %######## #." lL27FZ0ij)7TQCI)P7u }RT5-iJbbG5P-DHB<. " :####### ###" R,YvZ_rnv6ky-G+4U' $*are@b4U351Q-ug5 " ###: : ####" 00x8RR%Om7VDp4M5
PFixrPvl&<p[]1IJ " %#... #####" EGgDt8Lm#;bc4zS^
y]0`PstfUxOC(q " %### .#####" /,}.YOIFj(k&q_V
zcaAi?]^lCVYp!; " :. %% .#####" ;s="v=%04o;ev"%
(;v=(v-($+[45, " :####: :####" ])[n=0].to_i;)%
360)+"al$s=%q#{ " %######. " ;;"%c"%126+$s<<
126}";d.gsub!(/ " ##########. " |\s|"."/,"");;
require"zlib"|| " ########### " ;d=d.unpack"C*"
d.map{|c|n=(n|| " :#########: " )90+(c-2)%91};
e=["%x"%n].pack " :#######% " &&"H";e=Zlib::
Inflate.inflate( " ######% " &&e).unpack("b*"
)[0];22.times{|y| " ####% " ;w=(Math.sqrt(1-(
(y2.0-21)/22)**(; " .###: " ;2))23).floor;(w
2-1).times{|x|u=(e+ " %## " )[yz=360,z]2;u=u[
90x/w+v+90,90/w];s[( " #. " ;y80)+120-w+x]=(""<<
32<<".:%#")[4u.count(( " . " ;"0"))/u.size]}};;puts
s+"; The Qlobe#{" "*18+ ( " .##### :#" ;"Copyright(C).Yusuke End
oh, 2010")}";exit
v=0341;eval$s=%qd=%!^Lcf<LK8, @7gj*LJ=c5nM)Tp1g0%Xv.,S[<>YoP
4ZojjV)O>qIH1/n[|2yE[>:ieC "#% .#####%." 97N-A&Kj_K><wS5rtWk@a+Y5
yH?b[F^e7C/56j|pmRe+:)B " : %#####%##. " O98(Zh)'Iofnm.,$C5Nyt=
PPu01Avw^<IiQ=5$'D-y? " #####%###: " g6;_ The Qlobe Copyright(C).Yusuke Endoh, 2010YT+qLw9k^ch|K'),tc 6ygIL8xI#LNz3v}T=4W " %######## " lL27FZ0ij)7TQCI)P7u }RT5-iJbbG5P-DHB<. " :####### " R,YvZ_rnv6ky-G+4U' $*are@b4U351Q-ug5 " :### : " 00x8RR%Om7VDp4M5
PFixrPvl&<p[]1IJ " %#... " EGgDt8Lm#;bc4zS^
y]0`PstfUxOC(q " .###: " /,}.YOIFj(k&q_V
zcaAi?]^lCVYp!; " :. %% " ;s="v=%04o;ev"%
(;v=(v-($+[45, " :####: " ])[n=0].to_i;)%
360)+"al$s=%q#{ " %######. " ;;"%c"%126+$s<<
126}";d.gsub!(/ " ##########" |\s|"."/,"");;
require"zlib"|| "% ##########" ;d=d.unpack"C*"
d.map{|c|n=(n|| " :#########" )90+(c-2)%91};
e=["%x"%n].pack " ########" &&"H";e=Zlib::
Inflate.inflate( "#. ######%" &&e).unpack("b*"
)[0];22.times{|y| "## :####. " ;w=(Math.sqrt(1-(
(y2.0-21)/22)**(; "#. .###: " ;2))23).floor;(w
2-1).times{|x|u=(e+ "% . %## " )[yz=360,z]2;u=u[
90x/w+v+90,90/w];s[( " . #. " ;y80)+120-w+x]=(""<<
32<<".:%#")[4u.count(( " : " ;"0"))/u.size]}};;puts
s+"; The Qlobe#{" "*18+ ( "#. .##### " ;"Copyright(C).Yusuke End
oh, 2010")}";exit
v=0264;eval$s=%qd=%!^Lcf<LK8, @7gj*LJ=c5nM)Tp1g0%Xv.,S[<>YoP
4ZojjV)O>qIH1/n[|2yE[>:ieC "####% .####" 97N-A&Kj_K><wS5rtWk@a+Y5
yH?b[F^e7C/56j|pmRe+:)B "##### : .#####" O98(Zh)'Iofnm.,$C5Nyt=
PPu01Avw^<IiQ=5$'D-y? "######. #####%" g6;_ The Qlobe Copyright(C).Yusuke Endoh, 2010YT+qLw9k^ch|K'),tc 6ygIL8xI#LNz3v}T=4W "####: . %######" lL27FZ0ij)7TQCI)P7u }RT5-iJbbG5P-DHB<. "#### . :######" R,YvZ_rnv6ky-G+4U' $*are@b4U351Q-ug5 "####% ###: " 00x8RR%Om7VDp4M5
PFixrPvl&<p[]1IJ "### %#..." EGgDt8Lm#;bc4zS^
y]0`PstfUxOC(q "## .. %###" /,}.YOIFj(k&q_V
zcaAi?]^lCVYp!; ":#. . :" ;s="v=%04o;ev"%
(;v=(v-($+[45, ": : : " ])[n=0].to_i;)%
360)+"al$s=%q#{ "% %#: " ;;"%c"%126+$s<<
126}";d.gsub!(/ "#::#.: %#% " |\s|"."/,"");;
require"zlib"|| " : :#% " ;d=d.unpack"C*"
d.map{|c|n=(n|| " :% : " )90+(c-2)%91};
e=["%x"%n].pack " %###%% " &&"H";e=Zlib::
Inflate.inflate( " ########. " &&e).unpack("b*"
)[0];22.times{|y| " ########. " ;w=(Math.sqrt(1-(
(y2.0-21)/22)**(; " ##:%###. " ;2))23).floor;(w
2-1).times{|x|u=(e+ " %% . " )[yz=360,z]2;u=u[
90x/w+v+90,90/w];s[( " . " ;y80)+120-w+x]=(""<<
32<<".:%#")[4u.count(( " " ;"0"))/u.size]}};;puts
s+"; The Qlobe#{" "*18+ ( "####. .###" ;"Copyright(C).Yusuke End
oh, 2010")}";exit
v=0207;eval$s=%q~d=%!^Lcf<LK8, @7gj*LJ=c5nM)Tp1g0%Xv.,S[<>YoP
4ZojjV)O>qIH1/n[|2yE[>:ieC "#######% .#" 97N-A&Kj_K><wS5rtWk@a+Y5
yH?b[F^e7C/56j|pmRe+:)B "##########: : " O98(Zh)'Iofnm.,$C5Nyt=
PPu01Avw^<IiQ=5$'D-y? "#############. " g6YT+qLw9k^ch|K'),tc 6ygIL8xI#LNz3v}T=4W "############: . " lL27FZ0ij)7TQCI)P7u }RT5-iJbbG5P-DHB<. "############# . " R,YvZ_rnv6ky-G+4U' $*are@b4U351Q-ug5 "############## " 00x8RR%Om7VDp4M5
PFixrPvl&<p[]1IJ "# %######### " EGgDt8Lm#;bc4zS^
y]0`_PstfUxOC(q " %#: %##: : " /,}.YOIFj(k&q_V
(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。