비펀지·펀지

코드

아래 코드 중 Funge-98이 필요한 코드의 대부분은 초기 개발 단계의 PyFunge에서 테스트되었기 때문에 완벽하게 표준을 따르는 Funge-98 구현체에서는 정확히 동작하지 않습니다. (가장 큰 문제로 당시에는 k의 구현이 완전히 틀렸습니다.) 따라서 이들 프로그램이 제대로 작동하는 마지막 PyFunge 버전은 rev d28ef2b01345입니다. 언젠가 심심하면 돌아가도록 고칠 지도 모릅니다...

로또 번호 생성기

(2004-03-21) 한국의 로또 6/45를 위한 랜덤한 숫자를 생성합니다. 아마도 처음으로 짠 비펀지 (정확히는, Befunge-93) 프로그램이 아닐까 싶습니다.

6v    v<           +1_v#<
 >:#v_>:95*-#v_$@>"z"-  ^
 ^ <1     >v >:7g^ >1v >v
 +  >-06>:|>1-\4*#v?2v "\
7 p^>$$$^v<tokigun\>3v z>
:1v ^$$$$$20040321<\+<>""
$^>+.1+v >95*%:7g"z"- #^_

세벌식 자판 입력 변환기

(2004-05-05) 고정된 문자열을 출력하는 프로그램입니다. 고정된 문자열은 코드 오른쪽 위에 세벌식 최종 자판의 영문 입력(엄밀히는 쿼티 자판)으로 인코딩되어 있으며, 따라서 세벌식 최종을 안다면 손쉽게 문자열을 고칠 수 있습니다. 0은 한영 전환을 위해 쓰이며 두 개의 0은 입력의 끝을 알립니다.

이 프로그램은 엄밀히 말하면 , 명령이 유니코드로 출력을 해야 하기 때문에 올바른 Befunge-93 프로그램이 아니며, 오히려 Funge-98에 가까운 코드입니다. (그러나 Funge-98은 128 이상의 문자 코드를 허용하되 정의는 하지 않으므로 여전히 제대로 동작한다는 보장은 없습니다.) 대부분의 자바스크립트 Befunge-93 구현, 이를테면 요런 것은 이 조건을 만족합니다.

988*45*37*pv|>*0"-\ .fudh3djsbkdkkv' ,4jcnfmaehsfj"052*:"tneserp dezinikot."  v
vp*37*46*88<|^250"j9tsyrhgs lvz pea;tzmfs kgwjgw nngkv ndQjt2hgsuc iv hdzjd "< 
>88*47*37*pv|>"kvygp"0"-_-"0"dk3ej sghfydj"0"39-egnufeB"0" tnenfmxvorl bkkfl"^ 
   ()()    8|^"gyrida jtsjtyv kgwjgw nngkc u/djt2ng3hduf."0*250"ndkfs hfhgs "< 
_m(-__-)m_ +|>5**52*0"sbkdkkv'NN "0"D:"0" fudh3gn2ckfmxeyvh eyfmavuwf/m vyru"^0
 2004.5.5  >3^-----------------------------------------------------------------
            <                _v#  <          <         < <  1,_@#-**53+89:_v#:<
<,g\-\-3*99% -2*99\-\*2+29<   1   ^03-*69$\< ^02-*99$\<^ 0-10 $_v#`\*84:<      
^<        @_^#+1<         />69*\`#v_:99*\`#^_:357**\`#^_0^              ^$ <   
v^p*37*4+4< >$:#^_$$:99*2-^^:g\%-2 *99\+*45/-2*99:p*37*48::-*48<>:882**1-`! #v_
#v*47*88p* 37*46*88p*37*45*88<>\ v>48*-\:99*2-/29+2*\-\99*2v   |-"9":_v#-"/":< 
 >37*p:0`#^_^>$$v    >*+9*++,^  <>     v1_v#-"#"g\-\-3*99%-<   >      v        
  >85>*+9*+9*++,>47*v^9+*96172_$^,+%+1*88<>\:48*37*g48*+#v-#\_v       >\:48*37v
>v6 >^>7**67*1+8882v>37*g:88*-^        >#^ #< #v  #<   $v>v+1$<  v-"9":\-*48p*<
#05> 4^v88:g*37*46<>****+\2677****+47*37*g1+^      |!`0:< 1     v_ \::2-"|"v   
 2$| -*<v-*88:g*3<^_v#-*88:g*37*45<_v#-*88g*37*4+4:<    ^ <<    >\4+::3-"^">\:v
 -^<^   _   $^   ^7*>#6$#4<v*37*4+ 4<          $>         ^2v*99\-\*2+92/-2*99<
^>#                    #p #<      ^            < >-\g\$99*-^>2-%99*3-\-\g-!#v_v
$48*+\48*-:99*2-%\99*2-/45*+g99*-2              ^^\-3*99%-2*99\-\*2+92/-2*99< >
-------------------------------------------------------------------------------
i7iKCBi0iiiiiiiY/PIF]bSXd^i'iiii><iM@:?TiiiiiiiiiOD;Ai8NGiLiiiiiiJ^VeWQc"&+ ,2)
.1HR9U#Y=6%Eiiiii    == Befunge-93 interpreter required ==     */\%    [#_^|   
# ##Z \^ ^a`||*;=<:( 5   6    98-"32170     ?  !.>,#4           .),+"~' "   .  
-------------------------------------------------->8------ Cut Here! ----------
  .tokinized 3-set final keyboard translator: by tokigun <zenith@tokigun.net> 

Rule 30 난수 생성기

(2004-05-14, 2004-12-30) Rule 30 셀룰러 오토마타를 사용하여 난수를 생성합니다. 메모리 제약 때문에 실제로 사용하는 셀의 갯수는 32개로 양 옆은 이어져 있다고 가정합니다. (따라서 이 난수 생성기의 주기는 길어야 232입니다.) 난수 생성 전 초기화를 위해 임의의 문자열을 입력할 필요가 있습니다.

" >>"25*".rebmun dees etareneg ot"v .tokinized rule30 random number generator
v"Please input the random string "<  by tokigun, zenith@tokigun.net     ()()
>:v    v             <p00%*48+1g00p3+*59g<  [---****-] may 14, 2004 __m(-_-)m__
^,_000p>~:25*-!#v_2%#^_00g59*+3g99*6+\-00^  [**---**-***--****----*---*-*****]
                >99*5-3g0>:48*\`#v_000p0>00g48*\`#v_:0`#v_0\->25*%"0"+,$$$
0g59*+3g\2g00g95*+3p00g1+^       >\59*\#^-#p3#0v#02#+1g0># #0^#+/3<>59*+0
+p00\/3-\*95g3+*95%*8\4+1:\*2/3-\*95g3+*95:\*4/<  >*00g95*+3g95*\-^^-\7+

바이너리 디코더

(2004-11-10) 코드 공간 안에서 ;로 시작하는 행을 찾아서 여덟 비트씩 묶어 문자로 출력합니다. 다음으로 ;로 시작하는 행에서 끝나며, 0과 1이 아닌 문자와 25행 80열을 넘는 문자는 모두 무시됩니다. (후자는 Befunge-93의 제약이지만...) 본래는 이 글의 답변으로 쓰기 위해 만든 것입니다.

01->1+:0\v>0p020p0 vp01+g01!p00:%-1*99+1g0< 0p02+1<
   |-";"g<0vgg01g00<tokigun.>6# 8# *#<-\2* +20g:7-|
   >1+10p0^>:";"-!#@_:"0"-!#^_:"1"-!#^_$>0^#p020,$<

; start of sequence
011010000110010101101100011011000110111100001010
; end of sequence

유닉스 타임스탬프 변환기

(2004-08-02, 2004-12-05) 주어진 유닉스 타임스탬프 값을 UTC로 출력하는 프로그램입니다. Funge-98이 필요하며 첫 인자는 숫자로만 이루어져야 합니다.

0y6k$5*4+k$k$>_0\:!|!:\+*<
=DADCDCDDCDCD======>'0-\a^
,,00g.'),a,q041205>0g.' ':
.'(,' ,20g.':,' ,1^>' ,30g
0p50g.'-,' ,40g.'-,^>0g1+3
0g\-60p40g1+40v >0g#^`#6_6
>#2b#*<>*-1-:#p6^v41<  <p1
^ 6<!>6^#g1g04<p0<>#^_#^_6
%!#^_50gaa*%!50g4%^>g4aa**
g07g06$<v06:+/a/a/<^05p06-
5+/4g<||>#` #g<>g4^v/a/ag0
5+*50^v>#p7#$0<^05-<>46f**
5+1g05<p070p05+3*f+<^g05p0
*1+f*4+f*2++60p8f*b^>f*3+f
>*/:6a*%10p6a*/:2c*% 20p2v
^6ap00%*6a:g00np00$<^e/*c<

MD5 계산기

(2004-12-28) 표준 입력으로부터 파일을 읽어서 MD5 해시를 계산하는 프로그램입니다. FPDPORTH fingerprint를 지원하는 Funge-98 인터프리터가 필요합니다. 사용되는 거대한 테이블은 프로그램의 첫머리에서 자동으로 계산합니다.

^()() TokigunStudio Funge MD5 Calculator (2004.12.28)
('_') by Kang Seonghoon <tokigun@gmail.com>
============================================================
HMRWFJOUELQXGKPV0123456789abcdef(q),a$<=67Cw6rOg7YyMO+OFgTs=
/**884,g3++88%*28,g3++88/*28:A*f+89<v_^###;v_$#;$#-:#d<!>;:\
0g++30g40g50g20p50p40p30p60g1+60pv;^>1+:0g4>1-\:;/\>70gzk*/3
2p07-g07*84Ag00*kg072kg07g02p07-*3#5 dg3+*4/*28\<\/^2kg071g0
2*%80g*70g+82*%;>pe0g1+ev;2g+++0#j0#9gA20p60g:4%^>g60g1g60g8
bp0aAg00+g02g0a<^0cp0dAg0z0+g05g0dAg 00+g04g0cp\b0Ag00+g03g0
Eg00g05p087p070^#;vvj/$<p>5#;70p380p 30g40gE50gE2^2zEg04Og03
g04Eg00g05p085p071<>30g00gE50gA30g40 gAO070p180p2^2OAg05g03A
0p\2p1+;p03g0bp02g0a$$<^+88g06;v;<p0 60p05g0dp04g0c;>$f0g4+f
0f***;#48<8p0f+3g0f03_^# -*82::<>#0_^>;#\-1p0f-1g0f_^#:\+g2g
v>*b+f*1+f*d+d0p0e0p0f0p>e0g10g-^<tokigun>**5+f*9+f*d+-c0pf8
<^;v*f+8fp0az<;f+8*f+c*f;vzd*f+8*f+1*f+2*af(q#4"ORTH"<;+c*f+
0pv>8+f*3+f*1+f*4+f*2+f*6+f*2+b0p8kf7k*ff^>g2p884**/#$30g1+3
03<p03\*8p01<^d*f+2*f+4*f<>:#;v>#;_:0\2pv<^03%**488:_^#-g02g
>10p#;~10vv;^/*88+*98:g01p02+8<^!-g02:+1<g0<>1p1+:88*-#v_$)0
^+1g01p2g<>10g8+88*%88*\-10g+20p882**10g2p1^^\IMg01g02V BF+<
>"PDPF"4#q(fa+f*2+f*f*d+f*c+f*d+f*8+f*00p2F84*FY10p20p0>::1^

구현 및 유틸리티

"멀쩡한" Befunge-93 및 Funge-98 구현체에 대해서는 PyFunge를 참고하세요.

esotope-minbf93

(2004-06-17) 최소주의적인 Befunge-93 구현체입니다. 최대한 작게 만들어 보려는 집념으로 구현되었지만, 지금 보니 그렇게 작은 편은 아니군요. 그냥 연습용이라고 주장하도록 하겠습니다.

#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,_;int u(int r){s=S;S=
(Z*)malloc(sizeof(Z));S->q=s;return S->p=r;}int main(){while(i<W*H)z[i++]=32;for
(X=R;j<H&&~(r=getchar());Q=r)r==13||(r==10&&Q-13)?_=!++j:_<W?z[j*W+_++]=r:0;for(
srand(time(0));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(0);}

visbef

이 프로그램은 Befunge-93 코드를 넣으면 그 흐름을 이미지로 뽑아 주는 웹 서비스입니다. 기본적으로는 mtve 씨의 Befunge Visualiser를 PHP로 포팅한 것이지만, 각종 기능과 함께 일부 Funge-98 명령도 지원합니다. (TODO)


(rev 1d46270eb038)