Changeset 133:6039f736fa19

mearie.org/current

File projects/strange/whirl.ko.txt

133:6039f736fa19 197:f09883466878
Author:
Kang Seonghoon <public+hg@mearie.org>
Committed on
Permission:
-rw-r--r--

initial batch of /projects/strange/ pages added.

      1 ## vim: syn=mako
      2 <%! title = u'Whirl' %>
      3 
      4 
      5 코드
      6 ====
      7 
      8 
      9 Hello, world!
     10 -------------
     11 
     12 <%text filter="indent">
     13 110011100111000001111100000001000011111000011111100000000010
     14 000011001111100001100010000010011111000100000000000001001111
     15 100000111110001000000000000000001000111110010000001100001111
     16 100011000000000100111110011100111000111000001000111000001111
     17 100000111110010000011111000110011111100001111000001111000001
     18 110011111100001111000110011100000111000100011111000001111100
     19 100000110000000111000001110001111100011111000111000001000001
     20 000011000111110001000001000000011100000111001000111110001111
     21 000001111000011111100001111110000011110000000000000000011110
     22 000011100111000011110011111000111110001111100000100000000000
     23 000000000000111110001110000001110000011100011100111110001000
     24 100000000011100001111100110000000010011111000111100000111100
     25 111100010011100000111110000011111001100111100010001111000000
     26 000001000111110010000010011110011001110001000111110001100000
     27 100011111000011110011100111111000111100000111100011111000000
     28 011110000011100100001111000100011111001100011111000111100000
     29 111001110001100111100100000000000000011111000001111100010010
     30 000011100001111100100000100011100000111000110011110001001111
     31 110001100000111100011111000111100000111001000011110001001111
     32 100000111110000000011110000011110000000000000000111000001110
     33 000011000001100000111000111000001100111110000111111001001110
     34 000011111000001100011000001001111110000011100110011111000000
     35 000111000001110000111100001100 -- by Kang Seonghoon 2005.1.7
     36 </%text>
     37 
     38 <small>(2005-01-07)</small> 본래 Whirl 사이트에 올라와 있던 "Hello, world!" 코드는 명령 수가 2만 5천개가 넘어서 쓸데 없이 길었습니다. 이 코드는 이를 1350개로 줄입니다. (뒤의 서명 부분은 코드에 영향을 미치지 않습니다.) 모든 코드는 손으로 짠 뒤 간단한 후처리 코드를 돌리는 식으로 수행했으며, 필요 없는 명령이라도 코드를 줄이는 데 도움이 되면 추가하는 방법을 썼습니다.
     39 
     40 이 기록이라고 하기에도 민망한 코드는 2007년 들어서 [Anarchy Golf](http://golf.shinh.org/p.rb?hello+world)에 Whirl 언어 지원이 추가되면서 마침내 깨졌습니다. 2010년 2월 현재 최고 기록은 [명령 580개](http://yowaken.dip.jp/tdiary/20071011.html#p02)입니다. 물론 이 사람은 기계적으로 탐색해 나갔습니다만...
     41 
     42 
     43 99 Bottles of Beer
     44 ------------------
     45 
     46 <div class="extrasmall">
     47 <%text filter="indent">
     48                                                                                  1100011001111100011                                                                     1100111110010000010
     49                                                                      0011111000001111100010000010001111100000111                                             1100010000010001111100000111110001000001000
     50                                                              11111000001111100010000010001111100000111110001000001000111                             11000001111100010000010001111100000111110001000001000111110
     51                                                        00001111100010000010001111100000111110001000001000111110000011111000100                 00010001111100111100111000000010000111000001100011100000000000000000000
     52                                                    0000000000000000000000000000011111001111110001111100111000011100000111000001110         0000000000000000000000000000000011000011110001100011100111110000000000000000000
     53                                                0000000000000000000000000000011111000011000011111001111000001110000011100111110001111001100000110000011000011111000111100000111000001110011111000111100110000011000001100001111
     54                                             1000111100000111000001110011111000111100110000111110001111000001110000011100111110001111    00110000011000001100001111100011110000011100000111001111100011110011000011111000111100000
     55                                         1110000011100111110001111001100000110000011000001100000110000011000001100000110000011000            00110000011000001100000110000011000001100000110000011000001100000110000111110001111000001
     56                                       1100000111001111100011110011000001100000110000111110001111000001110000011100111110001111                00110000111110001111000001110000011100111110001111001100000110000011000001100000110000111
     57                                    1100011110000011100000111001111100011110011000001100000110000011000001100001111100011110                      00001110000011100111110001111001100000110000011000011111000111100000111000001110011111000
     58                                 1111001100000110000011000001100000110000011000001100001111100011110000011100000111001111                            10001111001100001111100011110000011100000111001111100011110011000001100000110000011000001
     59                               1000001100000110000011000001100000110000011000011111000111100000111000001110011111000111                                10011000001100000110000011000001100000110000011000001100000110000011000001100001111100011
     60                             1100000111000001110011111000111100110000011000001100000110000011000011111000111100000111                                    00000111001111100011110011000011111000111100000111000001110011111000111100110000011000001
     61                           1000011111000111100000111000001110011111000111100110000011000001100001111100011110000011                                        10000011100111110001111001100000110000011000001100000110000011000001100000110000011000011
     62                         1110001111000001110000011100111110001111001100000110000011000001100000110000011000001100                                            00111110001111000001110000011100111110001111001100000110000011000001100000110000011000001
     63                       1000011111000111100000111000001110011111000111100110000011000001100000110000011000011111                                                00011110000011100000111001111100011110011000001100000110000111110001111000001110000011100
     64                     1111100011110011000011111000111100000111000001110011111000111100110000111110001111000001                                                    11000001110011111000111100110000111110001111000001110000011100111110001111001100001111100
     65                    0111100000111000001110011111000111100110000111110001111000001110000011100111110001111001                                                      10000111110001111000001110000011100111110001111001100001111100011110000011100000111001111
     66                  1000111100110000111110001111000001110000011100111110001111001100001111100011110000011100                                                          00011100111110001111001100001111100011110000011100000111001111100011110011000011111000111
     67                 1000001110000011100011110000111001111100011111000111100011111001111100000111000000000000                                                            01110000000001110000000000000000000000000110000011000111000001110011111100011111000001111
     68               1001111110000000001110000011100000000000000000000000000000000000000000000011000001100011                                                                10000011100111111000111110000011111001111110000000001110000011100000000011100000111000000
     69              0000000000000000000000000000000000011000001100011100000111001111110001111100000111110011                                                                  10000111000001110000000001110000011100000000011100000000011100000000011100000000000000000
     70             0001000001110000011000111000001110011111100011111000111100001000111110010000000011100000                                                                    11100000000000000000000000000000000000000000000000000000000000010000011100000110001110000
     71            0111001111110001111100000111110001111100111110011110000011110001111100010000000011100000                                                                      11100000111000001110000000000000000000000000000000000000000000000000000000001100000110011
     72           1000001110011111100011111000001111100111000011100000000011100000111000000000000000000000                                                                        00000000001110000011100000111110000011111000000000000000000000000000000100000111000001100
     73          0111000001110011111100011111000111100011111001111100000111000001110000011100000000011100                                                                          00011100000000000000000000000111000001110000000001111100000111110001100000110001110000011
     74         1001111110001111100000111110011111100000000000000000000000000000000000000000000000000000                                                                            00000000000000000000110000011000000000000000000000000000000000000000000000000011000001100
     75        0001100000110001110000011100111111000111110001111000111110011111000001110000000000000000                                                                              00000000000000000000000000011100000111000000000111110000011111000000000001100000111000001
     76       1100000110001110000011100111111000111110000011111001110000000011100000000011100000000011                                                                                10000000000000000000000011100000111000000000111110000011111000000000000000000000000000000
     77      0110000011000111000001110011111100011111000001111100111000011100000000000001110000000001                                                                                  11000000000000000000000001110000011100000111110000011111000110000011000001100000110000000
     78      0000000000000000000000000000000000000000000000000000000000110000011000111000001110011111                                                                                  10001111100000111110011100001110000000000000000000000000000000000000000000111000001110000
     79     0000000001111100000111110000000000000001100000110001110000011100111111000111110000011111                                                                                    00111111000000000000011100000111000000000000000000000000000000000000000000000110000011000
     80    0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000                                                                                      00000000000000000000000000000011000001100011100000111001111110001111100000111110011111100
     81    0000000111000001110000011100000000011100000000000000000000000111000001110000000000000000                                                                                      01111100000111110001100000110001110000011100111111000111110000011111001111110000011100000
     82   0000111000001110000000001110000000000000000000000011100000111000001111100000111110000000                                                                                        00000000000000000000110000011000000000000000000000000000000000000000000000000000000000000
     83   0000000000000000000000000000000000000000000000000000011000000000110001110000011100111111                                                                                        00011111000111100011111001100000000000011100000000011100000000000000000000000000011100000
     84  1110000000000000000011111000001111100000000000000000000000000000000001000001110000011000                       T o k i g u n S t u d i o   p r e s e n t s                        11100000111001111110001111100000111110001111100111110011110000011110001111100010000000011
     85  1000000000111000000000000000000000000001110000011100000000000000000000011111000001111100                                                                                          01100000110001110000011100111111000111110000011111001111110000011100000111000001110000011
     86  1000001110000011100000000000000000000000111000001110000000000000000000001111100000111110                             00000000001100    00011000111000                             00111001111110001111100011110001111100111110000011100000111000001110000011100000000011100
     87 0000000000000000000001110000011100000000000000000000011111000001111100000000000000000001                              10000011000111    00000111001111                              11000111110001111000111110011000011100000111000000000111000000000111000000000000000000000
     88 0011100000111000001111100000111110000000000000000000000000000000110000011000000000000000                              0000      0000    0000      0000                              00000000000000000011000000000110000000000000000000000000000000000000110000011000000000000
     89 0000000000000000000000000000000000000000011000001100000000000001100000110001110000011100                              1111      1100    0111      1100                              01111000010001111100100000000010011111000111100000111100011111000100000000000011100000111
     90 0000000000000000001110000011100000000000000000111110000011111000000000000000110000011000                              00000000000000    00000000000000                              00000000000000000000000000000000000000000000001100000110001110000011100111111000111110000
     91 0111110011111100000000000010011111000111100000111100011111000100000000111000001110000000                              00000000000111    00000111000000                              00000000000000000001111100000111110000000000000000000000000000000110000011000111000001110
     92 0111111000111110001111000111110011111000001110000000010011111000111100000111100011111000                                        1000              0000                              01110000011100000000000000000011100000111000000000111110000011111000000000000000110000011
     93 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000                                        0000              0000                              00000000000000000000000000000000000000000000000000000000000000000000000000000000000001100
     94 0000000110001110000011100111111000111110001111000111110011000000001110000011100000111000                              00000011100000    00000000000000                              00001110000011100000000000000000000000000000111110000011111000000000001100000110001110000
     95 0111001111110001111100000111110011111100000111000001110000100111110001111000001111000111                              11000100000000    11100000111000                              00000000000000011100000111000001111100000111110000000000000000000110000000001100000000000
     96 0000000000000000000000000000000000000000000000000000000000000000000000000000000000110000                                                                                            01100000000000000000000000000000000000000000000000000000000000000000000000000000000000000
     97 0000000000000000000000000000000000000000000000011000001100011100000111001111110001111100                               B O T T L E S   O F   B E E R                                00011111001111110000000000000000011100000111000000000000000000000000000111000001110000011
     98 1110000011111000000011000001100000000000000000000000000000000000000000000000000000110000                                                                                            01100000000011000001100000000000000000000000001100000110000000001100000110000000000000110
     99 0000110000000000000000000000000000000000000000000000000000011000001100000000000001100000                                       I N   W H I R L                                      11000000000000000000000110000011000000000000000001100000110000000001100000110001110000011
    100  1001111110001111100011110001111100110000000000000000111000000000111000000000000000000000                                                                                          00111000001110000000000000000011111000001111100000000000000000001100000110000000000000000
    101  0000000000000000011000001100000000000000000000000000000000000000000000000000000000011000                             b y   K a n g   S e o n g h o o n                            00110000000000000000000000000110000011000111000001110011111100011111000001111100111000011
    102  1000000001001111100011110000011110001111100010000000011100000111000000000000000000111000                                                                                          00111000000000000011111000001111100000000000110000011000000000000000000000000000000000000
    103   0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000                                                                                        00000000000000000000000000000000000000000000000001100000110001110000011100111111000111110
    104   0011110000100011111001000000000000010011111000111100000111100011111000100000000111000001                                                                                        11000000000000000000000000000000000000000000000000000000000110000011000000000000011000001
    105    1000000000000000000000000000000000000000000000000011000001100000000000000000000000000000                                                                                      00000000110000011000000000000000000000000000000000000000000000000000000000000000000000000
    106    0000000001100000110000000000000000011000001100000000000000000000000000000000000000000000                                                                                      00000000000001100000110011100000111001111110001111100011110001111100110000111000001110000
    107     1001111100011110000011110001111100010000000011100000111000000000000000000111000001110000                                                                                    00000000000000000000000001111100000111110000000000000000000000000000000000011000001100011
    108      1000001110011111100011111000001111100011111001111100111100000111100011111000100000000010                                                                                  00111110001111000001111000111110001000000001110000011100000000000000000011100000111000000
    109      0000000111110000011111000000000000000000000000000000011000001100000000000000000000000000                                                                                  00000000000000000000000000000000000000000000000000000001100000110000000000000000000001100
    110       0001100000000000000000000000000000000000000000000000000000000011000001100011100000111001                                                                                11111000111110000011111001111110000011100000111000000000111000000000111000000000000000000
    111        0000011100000111000000000000000000000000011111000001111100000001100000110000000000000000                                                                              00000000000000000000000000000000000000000000000000000000011000001100011100000111001111110
    112         0011111000001111100111111000001110000000001110000011100000111000000000000000000000000000                                                                            11100000111000000000000000001111100000111110000000000000000000000000000000110000011000000
    113          0000000000000000000000000000000000000000000000000000000000000001100000110000000000000000                                                                          00000000000000000000000000000000000000000000011000001100011100000111001111110001111100000
    114           1111100111000011100000111000001110000000000000000000000000000000000000000011000001100000                                                                        00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    115            0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000                                                                      00011000001100000000011000001100000000000000000000000000000000000000000000000000000000000
    116             0000000000000000000000000000000000000000000000000000000000000011000001100011100000111001                                                                    11111000111110001111000111110011111000001110000000001110000011100000111000001110000000000
    117              0000000000000111000001110000000000000000000000000000000001111100000111110000000000100000                                                                  11100011100011000111000001111100000111110000000000000000000000000111110010100111110000011
    118               1110000111110000011100000111000011100001111000011111000001110000011100000111110000111000                                                                01111000001111000001111000001111000001111000001111000001111000001111000001111000001111000
    119                 0011110000011110000011110000111110000011111001000011100000110001110011001111111000001111                                                            10000111110000000011110000011110000111000001110000011111000011111000001111100001111100000
    120                  1110000011100000111110000111000011110000011110000011110000011110000011110000011110000011                                                          11000001111000001111000001111000001111000001111000001111000001111000001111000011100000111
    121                    0000011111000011100001111000001111000001111000001111000001111000001111000001111000001111                                                      00000111100000111100000111100000111100000111100000111100000111100000111100000111100000111
    122                     1000001111000001111000001111000001111000001111000001111000001111000001111000001111000011                                                    10000011100000111110000111100000111100001111100000111000001110000011111000011100001111000
    123                       0011110000011110000011110000011110000011110000011110000011110000011110000011110000011110                                                00001111000001111000011111000001111100010000111000001100011100110011111110000011111000011
    124                         1110000000011110000011110000111000001110000011111000011111000001111100001111100000111000                                            00111000001111100001110000111100000111100000111100000111100000111100000111100000111100000
    125                           1111000001111000001111000001111000001111000001111000001111000001111000000001110000011100                                        00011111000011100001111000001111000001111000001111000001111000001111000001111000001111000
    126                             0011110000011110000011110000011110000011110000011110000011110000011110000011110000011110                                    00001111000001111000001111000001111000001111000001111000001111000001111000001111000001111
    127                               0000011110000011110000011110000011110000011110000011110000011110000011110000011110000011                                11000001111000001111000001111000001111000001111000001111000001111000001111000001111000001
    128                                 1110000011110000011110000011110000011110000011110000011110000011110000011110000011110000                            01111000001111000001111000001111000001111000001111000001111000001111000011100000111001111
    129                                    1100111110001111000010000111100000100110010011111001110000000001100001111000001111000001                      10001110001100011111000011111000011111000000001111000001111000001111000001111000011100000
    130                                       1100001111100001111100000111000001110000111000011110000111110000000001110000011100000111                11000001111000001111000001111100000111110000111000011110000011110000011110000011110000011
    131                                         1100000111100000111100000111100000111100000111100000111100000111100000111100001110000011            10011111100111110001111000001001100011100111110000000000000111000001110011000111110001100
    132                                             0111110001111000001100011100110011111110000011111000011111000000001111000001111000011100    00011100000111110000111110000011111000011111000001110000011100000111110000111000011110000
    133                                                0111100000111100000111100000111100000111100000111100000111100000111100000111100000111100000111100000111100000111100000111100001110000011100000111110000111000011110000011110000
    134                                                    0111100000111100000111100000111100000111100000111100000111100000111100000111100         0001111000001111000001111000001111000001111000001111000001111000001111000001111
    135                                                         000001111000001111000001111001111110001111100011110000111110000010000                   111110000111111000010001000111100010011110000100001111001111100011110
    136                                                                0011111000111100000111100000111001111100011000111100000                                 0000111100001110000011100000111110001000111110001110000
    137                                                                        000001100000000111100000110001110011101                                                 00111111100000111100<tokigun@gmail.com>
    138 </%text>
    139 </div>
    140 
    141 <small>(2005-06-20)</small> "99 Bottles of Beer" 노래를 출력하는 명령 15556개짜리 프로그램입니다. 이 프로그램은 반복문과 조건문, 숫자 및 문자열 출력을 테스트하는 데 흔히 쓰입니다. 이 프로그램 역시 대부분을 손으로 짰으며, 처음에 메모리를 적절하게 초기화하는 부분만 기계화했습니다.
    142 
    143 이 프로그램 역시 한동안 가장 큰 Whirl 프로그램이었으며 심지어 [어떤 글](http://cotilliongroup.com/man/aspects/aspects-man.html)에 인용되기까지 했습니다. 물론 이 기록 역시 2008년 9월 누군가가 엄청난 [콰인](http://www.bigzaphod.org/whirl/keymaker/quine.txt) 프로그램을 만들면서 깨졌습니다만.
    144 
    145 
    146 구현 및 유틸리티
    147 ================
    148 
    149 
    150 esotope-whirl
    151 -------------
    152 
    153 <%text filter="indent">
    154 #include/* by Kang Seonghoon <tokigun@gmail.com> */<stdio.h>
    155 FILE*f;int P[99999],*d=P,*p=P,U[99999],*u=U,q,s,t,r[2],v[2],
    156 w[2];int main(int i,char**I){if(i-2)return!puts("TokigunStu\
    157 dio Whirl Interpreter by Kang Seonghoon <tokigun@gmail.com>"
    158 );if(f=**++I-45||1[*I]?fopen(*I,"r"):stdin){while((*d=fgetc(
    159 f))>=0  )*d/2-24  ?0  :(*d  ++      -=      48)  ;for(;p<d;q
    160 =!*p++  &&!q)if(  *p  )v[s  ]=(v  [s]-  r[s  ]+  13)%12;else
    161 #define  O(  n)  ;;}        else  /**/      if(  !(v[s]-n)){
    162 {r[s]^=  2;  if  (q)  {t=w  [s];  if(s  ){;  if  (0){O(1)t=*
    163 u;O(2)*u        =t;O  (3)t  +=*u  O(4)  t*=  *u  O(5)t/=*u;O
    164 (6)t=0;O(  7)  t=t<*  u;O(  8)      t=  t>*  u;       O(9)t=
    165 t==*u;O(10)t=!t;O(11)t=-t;}O(1)return 0;O(2)t=1;O(3)t=0;O(4)
    166 t=*u;O(5)*u=t;O(6)p+=t-1;O(7)u+=t;O(8)t=*u&&t;O(9)p+=*u?t-1:
    167 0;O(10)t?printf("%d",*u):scanf("%d",u);O(11)*u=t?putchar(*u)
    168 :getchar();}w[s]=t;s=!s;if(p<P)p=P;}}fclose(f);}else printf(
    169 "File Not Found: %s\n",*I);return!f;}/*20050617rev3tokigun*/
    170 </%text>
    171 
    172 <small>(2005-01-06, 2005-01-07, 2005-06-17)</small> "WHIRL"이 가운데에 떡하니 박혀 있는 C 인터프리터입니다. 파일 이름을 인자로 주거나, 표준 입력을 사용할 경우 파일 이름을 <`-`>로 줘서 코드를 실행할 수 있습니다. 메모리 셀의 수는 99999개로 고정되어 있습니다.
    173 
    174 
    175 소스-바이너리 변환기
    176 --------------------
    177 
    178 <%text filter="indent">
    179 #include/*tokigun*/<stdio.h>
    180 int p,q;int main(int i,char*
    181 *j){if(i-2)printf("Usage:\n\
    182 \t%s e < plain > binary\n\t\
    183 %s d < binary > plain\n",*j,
    184 *j);else if(**++j==100)while
    185 (~(i=getchar()))for(p=128;p;
    186 p/=2)putchar(i&p?49:48);else
    187 if(**j==101){while(~(i=getc\
    188 har())){if((i|1)==49){p=2*p+
    189 i%2;if(++q>7){putchar(p);p=q
    190 =0;}}}q&&putchar(p<<8>>q|255
    191 >>q);}/*20050108*/return 0;}
    192 </%text>
    193 
    194 <small>(2005-01-08)</small> 이 프로그램은 esotope-whirl의 보조 프로그램으로, Whirl의 개발자가 "귀찮다"는 이유로 만들지 않았다고 주장한 Whirl 프로그램의 바이너리 압축기입니다. 첫 인자가 `e`이면 표준 입력에서 평문을 받아 바이너리로 출력하고, 반대로 `d`이면 역변환을 수행합니다. 바이트 단위로 떨어지지 않을 경우 의도하지 않은 실행을 막기 위해 `1` 명령으로 빈 칸을 패딩합니다.
    195 

Powered by Mercurial