十几年前一guru同事在离职email里分享了一个99瓶啤酒的perl程序,target是打印:
99 bottles of beer on the wall, 99 bottles of beer.
Take one down and pass it around, 98 bottles of beer on the wall.
98 bottles of beer on the wall, 98 bottles of beer.
Take one down and pass it around, 97 bottles of beer on the wall.
....
2 bottles of beer on the wall, 2 bottles of beer.
Take one down and pass it around, 1 bottle of beer on the wall.
1 bottle of beer on the wall, 1 bottle of beer.
Go to the store and buy some more, 99 bottles of beer on the wall.
那时我还没听说过Google。最近一查,发现有专门的网站:http://99-bottles-of-beer.net
比如Perl code: http://99-bottles-of-beer.net/download/658
$a= "cpuu \bmft p \bg cff \bs";$b ="po ui \bf xbm \bm";$c=" Ypv ublf p \bof epxo qb \btt ju bspvoe"; $a =~ s/\n//;$a =~ s/\s+/ /g; $b =~ s/\n// ; $b =~ s/\s+/ /g;$c =~ s/\n// ; $c =~ s/\s+/ /g;$a =~ y/b-z/a-z/;$b =~ tr/b-z/a-z/;$c =~ tr/b-z/a-z/ ; for( $d=100;$d>0;$d--){ print"$d $a $b $d" ;print" $a,\n$c, " ;print($d-1);print " $a $b.\n";} $x = "cjc"; $y="dobbz"; $z="com";print"\n" ;print "- $x\@$y." ;print"$z \n\n";
http://99-bottles-of-beer.net/download/737 (可能需要旧Perl比如5.19之前的,不然会得到错误:Eval-group not allowed at runtime, use re 'eval' in regex):
''=~( '(?{' .('`' |'%') .('[' ^'-') .('`' |'!') .('`' |',') .'"'. '\\$' .'==' .('[' ^'+') .('`' |'/') .('[' ^'+') .'||' .(';' &'=') .(';' &'=') .';-' .'-'. '\\$' .'=;' .('[' ^'(') .('[' ^'.') .('`' |'"') .('!' ^'+') .'_\\{' .'(\\$' .';=('. '\\$=|' ."\|".( '`'^'.' ).(('`')| '/').').' .'\\"'.+( '{'^'['). ('`'|'"') .('`'|'/' ).('['^'/') .('['^'/'). ('`'|',').( '`'|('%')). '\\".\\"'.( '['^('(')). '\\"'.('['^ '#').'!!--' .'\\$=.\\"' .('{'^'['). ('`'|'/').( '`'|"\&").( '{'^"\[").( '`'|"\"").( '`'|"\%").( '`'|"\%").( '['^(')')). '\\").\\"'. ('{'^'[').( '`'|"\/").( '`'|"\.").( '{'^"\[").( '['^"\/").( '`'|"\(").( '`'|"\%").( '{'^"\[").( '['^"\,").( '`'|"\!").( '`'|"\,").( '`'|(',')). '\\"\\}'.+( '['^"\+").( '['^"\)").( '`'|"\)").( '`'|"\.").( '['^('/')). '+_,\\",'.( '{'^('[')). ('\\$;!').( '!'^"\+").( '{'^"\/").( '`'|"\!").( '`'|"\+").( '`'|"\%").( '{'^"\[").( '`'|"\/").( '`'|"\.").( '`'|"\%").( '{'^"\[").( '`'|"\$").( '`'|"\/").( '['^"\,").( '`'|('.')). ','.(('{')^ '[').("\["^ '+').("\`"| '!').("\["^ '(').("\["^ '(').("\{"^ '[').("\`"| ')').("\["^ '/').("\{"^ '[').("\`"| '!').("\["^ ')').("\`"| '/').("\["^ '.').("\`"| '.').("\`"| '$')."\,".( '!'^('+')). '\\",_,\\"' .'!'.("\!"^ '+').("\!"^ '+').'\\"'. ('['^',').( '`'|"\(").( '`'|"\)").( '`'|"\,").( '`'|('%')). '++\\$="})' );$:=('.')^ '~';$~='@'| '(';$^=')'^ '[';$/='`';
有意思的是这个程序可能是用Acme::EyeDrops从一个简单的Perl程序转换来的:
use Acme::EyeDrops qw(sightly get_eye_string hjoin_shapes); my $ninety_nine = <<'BURP'; $==pop||99;--$=;sub _{($;=($=||No)." bottle"."s"x!!--$=." of beer")." on the wall"} print+_,", $;! Take one down, pass it around, ",_,"! "while++$= BURP chop($ninety_nine); $ninety_nine =~ s/\nprint/print/; print sightly( { Regex => 1, Compact => 1, ShapeString => hjoin_shapes(2, (get_eye_string('bottle2'))x6), SourceString => $ninety_nine } );
关于99个啤酒瓶编程的相关网站很多,如:
https://codegolf.stackexchange.com/questions/2/99-bottles-of-beer
https://titanwolf.org/Network/Articles/Article?AID=01592803-8636-4fcd-ac1a-3cc92050a741
之所以想起旧事,是因为最近看了Dylan Beattie的<<The Art of Code>>
里面提到Oscar Toledo G. 2010年用1kB Javascript实现的mini chess:
<head>
<title>1K Javascript Tiny Chess by Óscar Toledo G. ©2010</title>
</head>
<body>
<script>
for(B=i=y=u=b=i=5-5,x=10,I=[],l=[];B++<304;I[B-1]=B%x?B/x%x<2|B%x<2?7:B/x&4?0:l[i++]="ECDFBDCEAAAAAAAAIIIIIIIIMKLNJLKM@G@TSb~?A6J57IKJT576,+-48HLSUmgukgg OJNMLK IDHGFE".charCodeAt(y++)-64:7);function X(c,h,e,s){c^=8;for(var o,S,C,A,R,T,G,d=e&&X(c,0)>1e4,n,N=-1e8,O=20,K=78-h<<9;++O<99;)if((o=I[T=O])&&(G=o^c)<7){A=G--&2?8:4;C=o-9?l[61+G]:49;do if(!(R=I[T+=l[C]])&&!!G|A<3||(R+1^c)>9&&G|A>2){if(!(R-2&7))return K;n=G|(c?T>29:T<91)?o:6^c;S=(R&&l[R&7|32]*2-h-G)+(n-o?110:!G&&(A<2)+1);if(e>h||1<e&e==h&&S>2|d){I[T]=n;I[O]=0;S-=X(c,h+1,e,S-N);if(!(h||e-1|B-O|T-b|S<-1e4))return W(),c&&setTimeout("X(8,0,2),X(8,0,1)",75);I[O]=o;I[T]=R}if(S>N||!h&S==N&&Math.random()<.5)if(N=S,e>1)if(h?s-S<0:(B=O,b=T,0))break}while(!R&G>2||(T=O,(G||A>2|(c?O>78:O<41)&!R)&&++C*--A))}return-K+768<N|d&&N}function W(){i="<table>";for(u=18;u<99;document.body.innerHTML=i+=++u%x-9?"<th width=60 height=60 onclick='I[b="+u+"]>8?W():X(0,0,1)'style='font-size:50px'bgcolor=#"+(u-B?u*.9&1||9:"d")+"0f0e0>&#"+(I[u]?9808+l[67+I[u]]:160):u++&&"<tr>")B=b}W()
</script>
</body>
</html>
#define P(a,b,c) a##b##c
#include/*++**++*/<curses.h>
int c,h, v,x,y,s, i,b; int
main () { initscr( ); P(cb,
rea, k)() ;///
P(n, oec, ho)(
)/* */ ;for (curs_set(0); s= x=COLS/2
; P( flu, shi, np)()){ timeout(y=c= v=0);///
P(c, lea, r)() ;for (P (
mva, d, dstr )(2, 3+x,
G) ; ; P( usl, eep, )(U)){//
P(m, vad, dstr )( y >>8,x,//
" "); for(i=LINES; /* */ i -->0
; mvinsch(i,0,0>(~c|i-h-H &h-i )?' '
:(i- h|h- i+H) <0?'|' :'=' ));
if(( i=( y +=v= getch( )>0?I:v+
A)>>8)>=LINES||mvinch(i*= 0<i, x)!=' '||' '
!=mvinch(i,3+x))break/*&% &*/; mvaddstr(y
>>8, x,0>v ?F:B ); i=--s
/-W; P(m, vpr, intw)(0,
COLS-9," %u/%u ",(0<i)* i,b=b<i?i:
b); refresh(); if(++ c==D){ c
-=W; h=rand()%(LINES-H-6
)+2; } } flash(); }}
是个完全可编译可运行的Flappy bird程序(depends on libcurses-devel, 需要下载makefile, 里边定义了游戏参数)。实际上,上面的程序是The International Obfuscated C Code Contest比赛2015年的优胜者之一。从1984年到2020年已经举办27届,优胜程序列在这里:https://www.ioccc.org/years-spoiler.html,其中的每一个程序都一定会让每个C程序员惊叹不已。上面提到的Oscar Toledo G.也有5个程序获奖。
下面的是Youtube video关于Andy Sloane的Donut-shaped C code生成3D spinning donuts
Andy的C code source:
编译:
Updated on Oct 11, 2023: Just saw a Wolfenstein implementation with 600 line Gawk code, a 3D game in Text mode, though will feel dizzy when playing. Reference: https://hackaday.com/2016/01/15/wolfenstein-in-600-lines-of-code/:
sudo apt-get install gawk git clone https://github.com/TheMozg/awk-raycaster.git cd awk-raycaster/ gawk -f awkaster.awk
0 Comments:
Post a Comment