이 프로그램은 (아마도) c로 만들어진 가장 짧은 Befunge-93 인터프리터입니다. :) 지금도 시간 있으면 슥슥 고치려 하고 있으나 제가 c에 익숙하지 못 해서 그렇게 잘 줄이지는 못 하겠군요.
#include<stdio.h> #include<stdlib.h> #include<time.h> #define C :Q==38 #define R !(X=Y=0) #define U (_=r,S?r=S->p,s=S->q,free(S),S=s,r:(r=0)) #define Z struct c #define B (i=U,j=U)%W==j&&i%H==i?z[W*i+j] Z{int p;Z*q;}*S,*s;int z[2000],W=80,H=25,x,y,X,Y,i,j,q,Q,r,_;FILE*F;int u(int r) {s=S;S=(Z*)malloc(sizeof(Z));S->q=s;return S->p=r;}int main(int v,char**V){v-2?\ exit(!printf(".tokinized present\nBefunge-93 Interpreter; version 0.20\nby Toki\ gun <zenith@tokigun.net>\n\nUsage: %s program.bf\n",*V)):(F=fopen(*++V,"r"))?sr\ and(time(0)):exit(!!printf(".error: File Not Found. %s\n",*V));while(i<W*H)z[i++ ]=32;for(X=R;j<H&&~(r=fgetc(F));Q=r)r==13||(r==10&&Q-13)?_=!++j:_<W?z[j*W+_++]=r :0;for(;q|(Q=z[W*y+x])^64;x=(W+x+X)%W,y=(H+y+Y)%H)Q==34?q=~q:q?u(Q):Q>47&&Q<58?u (Q-48)C+5?u(U+U)C+7?U,u(U-_)C+4?u(U*U)C+9?U?u(U/_):U C-1?U?u(U%_):U C-5?u(!U)C+\ 58?u(U<U)C+24?X=R C+22?X=-R C+56?Y=-R C+W?Y=R C+H?*((i=rand())&2?&X:&Y)=i&R?1:-1 C+57?X=U?-R:R C+86?Y=U?-R:R C-3?x+=X,y+=Y C+20?u(u(U))C+54?U,U,u(_),u(r)C-2?U C+ 8?printf("%d ",U)C+6?putchar(U)C+88?u(getchar())C?scanf("%d",&i),u(i)C+65?u(B:32 )C+74?B=U:U:0;while(S)U;exit(-fclose(F));}
이 코드는 적어도 Microsoft Visual C++ 6.0과 gcc 2.x 이상에서 제대로 동작합니다. (물론, gcc를 쓰면 윈도우즈와 리눅스 등의 환경에서 잘 동작하지요.)
컴파일해서 실행 파일(여기서는 tkbf93이라고 합시다)을 만듭니다. 인자 하나를 주면 그 파일을 읽어서 실행하고, 아니면 도움 화면을 다음과 같이 출력합니다.
$ tkbf93 .tokinized present Befunge-93 Interpreter; version 0.20 by Tokigun <zenith@tokigun.net> Usage: tkbf93 program.bf $ cat < hello.bf v v,< >025*"!dlrow olleH">:| @ $ tkbf93 hello.bf Hello world!
이 프로그램은 파일을 읽을 수 없을 때 에러 코드 1을, 아니면 에러 코드 0을 반환합니다.