TokigunStudio obfuscation collection

tkbf93: tokinized befunge-93 interpreter

이 프로그램은 (아마도) c로 만들어진 가장 짧은 Befunge-93 인터프리터입니다. :) 지금도 시간 있으면 슥슥 고치려 하고 있으나 제가 c에 익숙하지 못 해서 그렇게 잘 줄이지는 못 하겠군요.

코드 (version 0.20)

#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을 반환합니다.


지금은 글을 남길 수 없고 이미 남겨진 걸 볼 수만 있습니다.

Copyright © 2004-2005, Kang Seonghoon (Tokigun). All Rights Reserved.
Permanent Link: http://page.tokigun.net/obfuscation/_/tkbf93.php
Last updated on December 10, 2004. Valid XHTML 1.1 Valid CSS 2