Changeset 197:f09883466878

mearie.org/current

File projects/strange/funge.ko.txt

← 133:6039f736fa19 197:f09883466878 198:111012b2f4dd
Author:
Kang Seonghoon <public+hg@mearie.org>
Committed on
Permission:
-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 

Powered by Mercurial