f09883466878projects/strange/funge.ko.txt← 133:6039f736fa19 |
197:f09883466878 |
198:111012b2f4dd → |
-rw-r--r--strange codes: moved descriptions to the front and gave unique ids for external link.
1 ## vim: syn=mako 2 <%! title = u'비펀지·펀지' %> 3 4 5 코드 6 ==== 7 8 아래 코드 중 Funge-98이 필요한 코드의 대부분은 초기 개발 단계의 PyFunge에서 테스트되었기 때문에 완벽하게 표준을 따르는 Funge-98 구현체에서는 정확히 동작하지 않습니다. (가장 큰 문제로 당시에는 <`k`>의 구현이 완전히 틀렸습니다.) 따라서 이들 프로그램이 제대로 작동하는 마지막 PyFunge 버전은 [rev `d28ef2b01345`](http://hg.mearie.org/pyfunge/rev/d28ef2b01345)입니다. 언젠가 심심하면 돌아가도록 고칠 지도 모릅니다... 9 10 11 로또 번호 생성기 12 ---------------- 13 14 <small id="lottery-number-generator">(2004-03-21)</small> 한국의 로또 6/45를 위한 랜덤한 숫자를 생성합니다. 아마도 처음으로 짠 비펀지 (정확히는, Befunge-93) 프로그램이 아닐까 싶습니다. 15 16 <%text filter="indent"> 17 6v v< +1_v#< 18 >:#v_>:95*-#v_$@>"z"- ^ 19 ^ <1 >v >:7g^ >1v >v 20 + >-06>:|>1-\4*#v?2v "\ 21 7 p^>$$$^v<tokigun\>3v z> 22 :1v ^$$$$$20040321<\+<>"" 23 $^>+.1+v >95*%:7g"z"- #^_ 24 </%text> 25 26 27 세벌식 자판 입력 변환기 28 ----------------------- 29 30 <small id="sebul-converter">(2004-05-05)</small> 고정된 문자열을 출력하는 프로그램입니다. 고정된 문자열은 코드 오른쪽 위에 세벌식 최종 자판의 영문 입력(엄밀히는 쿼티 자판)으로 인코딩되어 있으며, 따라서 세벌식 최종을 안다면 손쉽게 문자열을 고칠 수 있습니다. 0은 한영 전환을 위해 쓰이며 두 개의 0은 입력의 끝을 알립니다. 31 32 이 프로그램은 엄밀히 말하면 <`,`> 명령이 유니코드로 출력을 해야 하기 때문에 올바른 Befunge-93 프로그램이 아니며, 오히려 Funge-98에 가까운 코드입니다. (그러나 Funge-98은 128 이상의 문자 코드를 허용하되 정의는 하지 않으므로 여전히 올바르다고 할 수는 없습니다.) 대부분의 자바스크립트 Befunge-93 구현, 이를테면 [요런 것](http://www.quirkster.com/js/befunge.html)은 이 조건을 만족합니다. 33 34 <%text filter="indent"> 35 988*45*37*pv|>*0"-\ .fudh3djsbkdkkv' ,4jcnfmaehsfj"052*:"tneserp dezinikot." v 36 vp*37*46*88<|^250"j9tsyrhgs lvz pea;tzmfs kgwjgw nngkv ndQjt2hgsuc iv hdzjd "< 37 >88*47*37*pv|>"kvygp"0"-_-"0"dk3ej sghfydj"0"39-egnufeB"0" tnenfmxvorl bkkfl"^ 38 ()() 8|^"gyrida jtsjtyv kgwjgw nngkc u/djt2ng3hduf."0*250"ndkfs hfhgs "< 39 _m(-__-)m_ +|>5**52*0"sbkdkkv'NN "0"D:"0" fudh3gn2ckfmxeyvh eyfmavuwf/m vyru"^0 40 2004.5.5 >3^----------------------------------------------------------------- 41 < _v# < < < < 1,_@#-**53+89:_v#:< 42 <,g\-\-3*99% -2*99\-\*2+29< 1 ^03-*69$\< ^02-*99$\<^ 0-10 $_v#`\*84:< 43 ^< @_^#+1< />69*\`#v_:99*\`#^_:357**\`#^_0^ ^$ < 44 v^p*37*4+4< >$:#^_$$:99*2-^^:g\%-2 *99\+*45/-2*99:p*37*48::-*48<>:882**1-`! #v_ 45 #v*47*88p* 37*46*88p*37*45*88<>\ v>48*-\:99*2-/29+2*\-\99*2v |-"9":_v#-"/":< 46 >37*p:0`#^_^>$$v >*+9*++,^ <> v1_v#-"#"g\-\-3*99%-< > v 47 >85>*+9*+9*++,>47*v^9+*96172_$^,+%+1*88<>\:48*37*g48*+#v-#\_v >\:48*37v 48 >v6 >^>7**67*1+8882v>37*g:88*-^ >#^ #< #v #< $v>v+1$< v-"9":\-*48p*< 49 #05> 4^v88:g*37*46<>****+\2677****+47*37*g1+^ |!`0:< 1 v_ \::2-"|"v 50 2$| -*<v-*88:g*3<^_v#-*88:g*37*45<_v#-*88g*37*4+4:< ^ << >\4+::3-"^">\:v 51 -^<^ _ $^ ^7*>#6$#4<v*37*4+ 4< $> ^2v*99\-\*2+92/-2*99< 52 ^># #p #< ^ < >-\g\$99*-^>2-%99*3-\-\g-!#v_v 53 $48*+\48*-:99*2-%\99*2-/45*+g99*-2 ^^\-3*99%-2*99\-\*2+92/-2*99< > 54 ------------------------------------------------------------------------------- 55 i7iKCBi0iiiiiiiY/PIF]bSXd^i'iiii><iM@:?TiiiiiiiiiOD;Ai8NGiLiiiiiiJ^VeWQc"&+ ,2) 56 .1HR9U#Y=6%Eiiiii == Befunge-93 interpreter required == */\% [#_^| 57 # ##Z \^ ^a`||*;=<:( 5 6 98-"32170 ? !.>,#4 .),+"~' " . 58 -------------------------------------------------->8------ Cut Here! ---------- 59 .tokinized 3-set final keyboard translator: by tokigun <zenith@tokigun.net> 60 </%text> 61 62 63 Rule 30 난수 생성기 64 ------------------- 65 66 <small id="rule30-rng">(2004-05-14, 2004-12-30)</small> Rule 30 셀룰러 오토마타를 사용하여 난수를 생성합니다. 메모리 제약 때문에 실제로 사용하는 셀의 갯수는 32개로 양 옆은 이어져 있다고 가정합니다. (따라서 이 난수 생성기의 주기는 길어야 2<sup>32</sup>입니다.) 난수 생성 전 초기화를 위해 임의의 문자열을 입력할 필요가 있습니다. 67 68 <%text filter="indent"> 69 " >>"25*".rebmun dees etareneg ot"v .tokinized rule30 random number generator 70 v"Please input the random string "< by tokigun, zenith@tokigun.net ()() 71 >:v v <p00%*48+1g00p3+*59g< [---****-] may 14, 2004 __m(-_-)m__ 72 ^,_000p>~:25*-!#v_2%#^_00g59*+3g99*6+\-00^ [**---**-***--****----*---*-*****] 73 >99*5-3g0>:48*\`#v_000p0>00g48*\`#v_:0`#v_0\->25*%"0"+,$$$ 74 0g59*+3g\2g00g95*+3p00g1+^ >\59*\#^-#p3#0v#02#+1g0># #0^#+/3<>59*+0 75 +p00\/3-\*95g3+*95%*8\4+1:\*2/3-\*95g3+*95:\*4/< >*00g95*+3g95*\-^^-\7+ 76 </%text> 77 78 79 바이너리 디코더 80 --------------- 81 82 <small id="bin2char">(2004-11-10)</small> 코드 공간 안에서 <`;`>로 시작하는 행을 찾아서 여덟 비트씩 묶어 문자로 출력합니다. 다음으로 <`;`>로 시작하는 행에서 끝나며, 0과 1이 아닌 문자와 25행 80열을 넘는 문자는 모두 무시됩니다. (후자는 Befunge-93의 제약이지만...) 본래는 [이 글](http://www.likejazz.com/29500.html)의 답변으로 쓰기 위해 만든 것입니다. 83 84 <%text filter="indent"> 85 01->1+:0\v>0p020p0 vp01+g01!p00:%-1*99+1g0< 0p02+1< 86 |-";"g<0vgg01g00<tokigun.>6# 8# *#<-\2* +20g:7-| 87 >1+10p0^>:";"-!#@_:"0"-!#^_:"1"-!#^_$>0^#p020,$< 88 89 ; start of sequence 90 011010000110010101101100011011000110111100001010 91 ; end of sequence 92 </%text> 93 94 95 유닉스 타임스탬프 변환기 96 ------------------------ 97 98 <small id="unix-timestamp-converter">(2004-08-02, 2004-12-05)</small> 주어진 유닉스 타임스탬프 값을 UTC로 출력하는 프로그램입니다. Funge-98이 필요하며 첫 인자는 숫자로만 이루어져야 합니다. 99 100 <%text filter="indent"> 101 0y6k$5*4+k$k$>_0\:!|!:\+*< 102 =DADCDCDDCDCD======>'0-\a^ 103 ,,00g.'),a,q041205>0g.' ': 104 .'(,' ,20g.':,' ,1^>' ,30g 105 0p50g.'-,' ,40g.'-,^>0g1+3 106 0g\-60p40g1+40v >0g#^`#6_6 107 >#2b#*<>*-1-:#p6^v41< <p1 108 ^ 6<!>6^#g1g04<p0<>#^_#^_6 109 %!#^_50gaa*%!50g4%^>g4aa** 110 g07g06$<v06:+/a/a/<^05p06- 111 5+/4g<||>#` #g<>g4^v/a/ag0 112 5+*50^v>#p7#$0<^05-<>46f** 113 5+1g05<p070p05+3*f+<^g05p0 114 *1+f*4+f*2++60p8f*b^>f*3+f 115 >*/:6a*%10p6a*/:2c*% 20p2v 116 ^6ap00%*6a:g00np00$<^e/*c< 117 </%text> 118 119 120 MD5 계산기 121 ---------- 122 123 <small id="md5-calculator">(2004-12-28)</small> 표준 입력으로부터 파일을 읽어서 MD5 해시를 계산하는 프로그램입니다. <`FPDP`> 및 <`ORTH`> fingerprint를 지원하는 Funge-98 인터프리터가 필요합니다. 사용되는 거대한 테이블은 프로그램의 첫머리에서 자동으로 계산합니다. 124 125 <%text filter="indent"> 126 ^()() TokigunStudio Funge MD5 Calculator (2004.12.28) 127 ('_') by Kang Seonghoon <tokigun@gmail.com> 128 ============================================================ 129 HMRWFJOUELQXGKPV0123456789abcdef(q),a$<=67Cw6rOg7YyMO+OFgTs= 130 /**884,g3++88%*28,g3++88/*28:A*f+89<v_^###;v_$#;$#-:#d<!>;:\ 131 0g++30g40g50g20p50p40p30p60g1+60pv;^>1+:0g4>1-\:;/\>70gzk*/3 132 2p07-g07*84Ag00*kg072kg07g02p07-*3#5 dg3+*4/*28\<\/^2kg071g0 133 2*%80g*70g+82*%;>pe0g1+ev;2g+++0#j0#9gA20p60g:4%^>g60g1g60g8 134 bp0aAg00+g02g0a<^0cp0dAg0z0+g05g0dAg 00+g04g0cp\b0Ag00+g03g0 135 Eg00g05p087p070^#;vvj/$<p>5#;70p380p 30g40gE50gE2^2zEg04Og03 136 g04Eg00g05p085p071<>30g00gE50gA30g40 gAO070p180p2^2OAg05g03A 137 0p\2p1+;p03g0bp02g0a$$<^+88g06;v;<p0 60p05g0dp04g0c;>$f0g4+f 138 0f***;#48<8p0f+3g0f03_^# -*82::<>#0_^>;#\-1p0f-1g0f_^#:\+g2g 139 v>*b+f*1+f*d+d0p0e0p0f0p>e0g10g-^<tokigun>**5+f*9+f*d+-c0pf8 140 <^;v*f+8fp0az<;f+8*f+c*f;vzd*f+8*f+1*f+2*af(q#4"ORTH"<;+c*f+ 141 0pv>8+f*3+f*1+f*4+f*2+f*6+f*2+b0p8kf7k*ff^>g2p884**/#$30g1+3 142 03<p03\*8p01<^d*f+2*f+4*f<>:#;v>#;_:0\2pv<^03%**488:_^#-g02g 143 >10p#;~10vv;^/*88+*98:g01p02+8<^!-g02:+1<g0<>1p1+:88*-#v_$)0 144 ^+1g01p2g<>10g8+88*%88*\-10g+20p882**10g2p1^^\IMg01g02V BF+< 145 >"PDPF"4#q(fa+f*2+f*f*d+f*c+f*d+f*8+f*00p2F84*FY10p20p0>::1^ 146 </%text> 147 148 149 구현 및 유틸리티 150 ================ 151 152 "멀쩡한" Befunge-93 및 Funge-98 구현체에 대해서는 [PyFunge](/projects/pyfunge/)를 참고하세요. 153 154 155 esotope-minbf93 156 --------------- 157 158 <small>(2004-06-17)</small> 최소주의적인 Befunge-93 구현체입니다. 최대한 작게 만들어 보려는 집념으로 구현되었지만, 지금 보니 그렇게 작은 편은 아니군요. 그냥 연습용이라고 주장하도록 하겠습니다. 159 160 <%text filter="indent"> 161 #include<stdio.h> 162 #include<stdlib.h> 163 #include<time.h> 164 #define C :Q==38 165 #define R !(X=Y=0) 166 #define U (_=r,S?r=S->p,s=S->q,free(S),S=s,r:(r=0)) 167 #define Z struct c 168 #define B (i=U,j=U)%W==j&&i%H==i?z[W*i+j] 169 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= 170 (Z*)malloc(sizeof(Z));S->q=s;return S->p=r;}int main(){while(i<W*H)z[i++]=32;for 171 (X=R;j<H&&~(r=getchar());Q=r)r==13||(r==10&&Q-13)?_=!++j:_<W?z[j*W+_++]=r:0;for( 172 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 173 &&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? 174 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 175 &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) 176 C-2?U C+8?printf("%d ",U)C+6?putchar(U)C+88?u(getchar())C?scanf("%d",&i),u(i)C+ 177 65?u(B:32)C+74?B=U:U:0;while(S)U;exit(0);} 178 </%text> 179 180 181 visbef 182 ------ 183 184 이 프로그램은 Befunge-93 코드를 넣으면 그 흐름을 이미지로 뽑아 주는 웹 서비스입니다. 기본적으로는 mtve 씨의 [Befunge Visualiser](http://frox25.no-ip.org/~mtve/code/eso/bef/bef_vis/)를 PHP로 포팅한 것이지만, 각종 기능과 함께 일부 Funge-98 명령도 지원합니다. (TODO) 185