[迷宫图片]编程珠玑

我最喜欢的编程目前为止的语言是哈斯克尔.有时,当我非常需要速度时,我可能会依靠C类(或C类++用于更好的数据结构以及更理智的内存管理,同时忍受所有丑陋的缺点)。在我的第一门编程语言之后,辛克莱BASIC,Z80组装下一个,帕斯卡大学一年级,C做了一个令人耳目一新的改变。看看这个C程序员的十诫.另请参阅Frans Faase的列表签名程序.

填空程序

p(c){putchar(c);}f(x,y,m){(y=m-绝对值(m-y))-m&&m-x?个?f(x<m?y:x&m,x<m-x:y,m/2) :p(x-m-1&y?32:64);}   主(z){对于(z=牛顿*牛顿;z--;第页(z%N?32:10))f(z%N,z/N,N);}

使用-DN=1、-DN=3、-DN=7或-DN=15(二乘一)进行编译以产生输出

@
        
@ @ @@   @@   @
        
@ @ @   @ @ @@   @   @   @@   @ @ @   @@           @@ @ @   @ @ @@   @    @ @ @   @ @ @
        
@ @ @   @ @ @   @ @ @   @ @ @@   @   @   @   @   @   @   @@   @ @ @   @   @   @ @ @   @@           @   @           @@ @ @   @ @ @   @ @ @   @ @ @@   @           @   @    @ @ @   @ @ @ @ @ @ @   @ @ @@                           @@   @ @ @ @ @   @ @ @ @ @   @@   @       @   @       @   @@ @ @   @ @ @   @ @ @   @ @ @@           @        @ @ @   @ @ @   @ @ @   @ @ @@   @       @   @       @   @@   @ @ @ @ @   @ @ @ @ @   @
此改进版(灵感来自nu的codegolf条目)

f(y,x,m){返回x?x=abs(~m+x),y>米-f(x,y,m):x&m?f(y,x,m/2):m==y&y:-2;}主要的(y,x){用于(x=0;否;)y+=20/putchar(“\n|_”[++x&!f(y+1,x&N,N)|f(y-x%2,x&R,N)+2]);}
产生更漂亮的输出(N=3,7,15,31):

        
_ | |
        
_   _ | |_| ||_   _|_| |__
        
_   _   _   _ | |_| | | |_| ||_   _| |_   _|_| |_____| |_ |  ___   ___  ||_|  _| |_  |_|_  |_   _|  _ | |___| |___| |
        
_   _   _   _   _   _   _   _ | |_| | | |_| | | |_| | | |_| ||_   _| |_   _| |_   _| |_   _|_| |_____| |_   _| |_____| |_ |  ___   ___  | |  ___   ___  ||_|  _| |_  |_| |_|  _| |_  |_|_  |_   _|  _   _  |_   _|  _ | |___| |___| |_| |___| |___| ||_   ___   ___   ___   ___   _|_| |_  |_|  _| |_  |_|  _| |_ |  _  |  _  |_   _|  _  |  _  ||_| |_| | |___| |___| | |_| |_|_   _  |  ___   ___  |  _   _ ||_||_|_|_|_|_||||_|||_   _|  _  |_   _|  _  |_   _|_| |___| |___| |___| |___| |__

太神了

这是我最喜欢的编程珍珠,一个237个字符的程序生成迷宫任意长度。这是我1988年提交给国际C语言混乱代码大赛.
字符*M,A,Z,E=40,J[40],T[40];main(C){用于(*J=A=scanf(M=“%d”,&C);--E;J[E]=T[E]=E)打印f(“._”);for(;(A-=Z=!Z)||(printf(“\n|”),A=39,C--)    ;   Z||printf(M))M[Z]=Z[A-(E=A[J-Z])&&!C类&A==T[A]|6<<27<rand()||!C和!Z?J[T[E]=T[A]]=E,J[T[C]=A-Z]=A,“_.”:“|”];}
注意,常数27假定为31位随机数生成器,如果出现以下情况,则需要替换为11兰特()产生15位数字而不是。现代C编译器不允许重写常量字符串,可以通过将第一行更改为
字符M[3],A,Z,E=40,J[40],T[40];main(C){用于(*J=A=scanf(“%d”,&C);
如果你想知道这个程序是如何实现其神秘性的,请阅读.

俄罗斯方块

1989年,与我的朋友合作弗里克·维迪克,我提交了一个1467字符俄罗斯方块程序,获得最佳游戏类别。

各种各样的东西

以下C代码对整数t[1]进行排序。。。t[j]升序:
对于(i=j/2;j>1;t[l]=k){如果(i)k=t[i--];否则{k=t[j];t[j-]=t[1];}对于(l=i+1;(m=l+l)<=j;t[l]=t[m],l=m){如果(m<j&&t[m]<t[m+1])m++;如果(t[m]<=k)断裂;}}

河内重访

算法教科书中提出的一些理想候选问题对于递归,结果更适合于迭代:
最大值=1<<圆盘数量;对于(x=1;x<最大值;x++)printf(“将光盘从%d移动到%d\n”,(x&x-1)%3,((x|x-1)+1)%3);

你能增长多快?

下面是一行Haskell-script,它计算非常快速生长功能。它是由R.L.古德斯坦作为函数的示例这是总数(即定义在任何输入上),尽管这一事实无法证明一阶皮亚诺算术!(另请参见维基百科条目包括证明)。
main=mapM_(print.gs)[0..]其中gs=克2g b 0=b;g b n=g c$s 0 n-1其中s _ 0=0;s e n=mod n b*c ^s 0 e+s(e+1)(div n b);c=b+1
值gs(0)=2,gs(1)=3,gs事实上,我们很熟悉。

但该函数在gs(4)=3*2^402653211-1时真正起作用,哪个是胡道尔数W公司402653184,可被29整除。
下面是一张Postscript图片,展示了价值观作为基础的函数增长对于这个Goodstein序列(所有较大的序列看起来一样,只是规模不同)。

函数g的一个更清晰的表示是

g b 0=bg b n=g c((s 0 n)-1)其中s _ 0=0s e n=(n`mod`b)*c^(s 0 e)+(s(e+1)(n`div`b))c=b+1
gs()的小值可以用近似值表示属于阿克曼函数,这个的有限部分快速增长的层次结构:

(f)0(n) =n+1
(f)k+1(千分之一)(n) =英尺k个n个(n) ●●●●。

则gs(4)=f(3)-1,gs(5)=f4(4) -1,gs(6)=f6(6) -1和gs(7)=f8(8)-1.

紧凑型粗筛

#包括<stdio.h>#包括<stdlib.h>#定义DO(P、R、I、M、E、S、i0、v0、i1、v1、i2、v2、i3、v3、i4、v4、i5、v5、i6、v6、i7、v7)k=P\如果(!(筛子[n]和(1<<R))\{printf(“%ld”,30*n+位[R])\e=eos-I*n-M\对于(m=筛+(30*n+E)*n+S);m<e;m+=i0)\{*m|=(1<<v0);*(m+=i1)|=(1<<v1)\*(m+=i2)|=(1<<v2)*(m+=i3)|=(1<<v3)\*(m+=i4)|=(1<<v4)*(m+=i5)|=(1<<v5)\*(m+=i6)|=(1<<v6)*(m+=i7)|=(1<<v7)\}\如果(m<eos){*m|=(1<<v0)\如果((m+=i1)<eos){*m|=(1<<v1)\如果((m+=i2)<eos){*m|=(1<<v2)\如果((m+=i3)<eos){*m|=(1<<v3)\如果((m+=i4)<eos){*m|=(1<<v4)\如果((m+=i5)<eos){*m|=(1<<v5)\如果((m+=i6)<eos)*m|=(1<<v6)\} } } } } } }字符位[]={1,7,11,13,17,19,23,29};int main(int argc,char*argv[]){无符号长p,q,r,k=0,n,s;焦炭*m,*e,*eos,*sieve;长字节,atol();如果(argc!=2)printf(“用法:%s(<bytes_used>或-<maxprime>)\n”,*argv),则退出(0);如果((字节=atol(argv[1]))<0)字节=1+(-字节)/30;如果(!(sieve=calloc(bytes,1)))printf(“内存不足。\n”),退出(0);如果(字节>30)对于(k=r=(字节-1)/30;(q=r/k)<k;k>>=1)k+=q;eos=筛+字节;s=k+1*筛子=1;printf(“2 3 5”);对于(n=p=q=r=0;n<s;n++){DO(p++,0,28,0,2,0,p,0,r,1,q,2,k,3,q,4,k,5,q,6,r,7);r++;DO(q++,1,24,6,14,1,r,5,q,4,p,0,k,7,p,3,q,2,r,6,p,1);r++;q++;溶解氧(p-1、2、26、9、22、4、q、0、k、6、q、1、k、7、q、3、r、5、p、2、r、4);r++;溶解氧(q-1,3,28,12,26,5,p,5,q,2,p,1,k,7,r,4,p,3,r,0,k,6);DO(q+1,4,26,15,34,9,q,5,p,6,k,0,r,3,p,4,r,7,k,1,p,2);r++;DO(p+1,5,28,17,38,12,k,0,q,4,r,2,p,5,r,3,q,7,k,1,q,6);r++;q++;溶解氧(q++,6,26,20,46,17,k,5,r,1,p,6,r,2,k,3,p,7,q,0,p,4);r++;DO(p++,7,24,23,58,28,r,0,k,7,r,6,q,5,p,4,q,3,p,2,q,1);}printf(“…”);for(p=字节-s;p<字节;p++)对于(k=0;k<8;k++)if(!(筛[p]&(1<<k))printf(“%ld”,30*p+位[k]);for(p=0,n=3;p<字节;p++)对于(k=0;k<8;k++)n+=!(筛[p]&(1<<k));printf(“\n找到%ld个素数\n”,n);退出(0);}

回到我的主页.
john.tromp@gmail.com