[C][IOCCC] IOCCC 2015 落選作供養 (2): 実行・連結可能バナー

落選作 2 つめ。実行と連結が可能なバナーを生成するプログラムです。

/**/#/*@*/       include<stdio.h>/*    @@@@*//**/
/**/char*r       ,t[33301]="#ifnde"    "f~x~"/**/
/**/"#inc"       "l"      "u"   "d"    "e~<s"/**/
/**/"td\\"       "~"      "i"   "o"    ".h>~"/**/
/**/"~#de"       "f"      "i"   "n"    "e~x("/**/
/**/"x)\\"       "~"      "p"   "u"    "t##~"/**/
/**/"char"       "("      "x"   ")"    ";~in"/**/
/**/"t~ma"       "i"      "n"   "("    "){~#"/**/
/**/"incl"          "ude~"   "_"       "_FIL"/**/
/**/"E__~"          "retu"   "r"       "n~0;"/**/
/**/"}~#u"                             "ndef"/**/
/**/"~x~#"                             "defi"/**/
/**/"ne~x"                             "(x)~"/**/
/**/"#~el"       "se~x(~%04o"          ")~#~"/**/
/**/"endi"       "f~ROOq))U="          ">ggg"/**/
/**/"RHHg"             "g"   "]"       "[rqk"/**/
/**/"brk1"             "m"   "d"       "o4or"/**/
/**/"_]sf"             "v"      "Z"    "fc>@"/**/
/**/"#e=4"             "X"      "D"    "a;Hg"/**/
/**/"n)%|"             "%"   "X"       "i)'|"/**/
/**/">8#'"             "("   "4"       ",IYk"/**/
/**/"@ca:"       "4mM,N{$e|f"          "gN6,"/**/
/**/"S.0_"       "-Q,{Ii5K-8"          "]8Xi"/**/
/**/"]8)u"                             "c^cu"/**/
/**/"'|]|"                             "'`Ci"/**/
/**/"`UaC"                             "oi#k"/**/
/**/"^jrf"                             "E/|L"/**/
/**/"a$l/"                             "lnl3"/**/
/**/"(M&0"       "WS$(_S3w_5+{&6=E"    "ZDy$"/**/
/**/"&gTo"       "W(_$/9xn$+wso6//"    "E(<#"/**/
/**/"miws"                   "Y"       "003G"/**/
/**/"5=a|"                   "I"       "+.i{"/**/
/**/"+;x9"                "/"          ";g%g"/**/
/**/"n$@g"                "/"          ":_4m"/**/
/**/"{6(("       "E,GA**k>L1|))>G$"    "J<(?"/**/
/**/"(B2y"       ",?cwi'%kaqe]KiVk"    "A%c]"/**/
/**/"1agD"                             "i]e$"/**/
/**/"ogTA"                             "=c;9"/**/
/**/"hVk'"                             "iY(<"/**/
/**/"$,J("                             "sg'k"/**/
/**/"ucBe"                             "q[%?"/**/
/**/"+'8&"       "P9n'o8o3y+'{4{'e"    "%_Q]"/**/
/**/"=@$_"       "Q%_Pq#",*s=t+148,    *p,*q=/**/
/**/t+503,                   a[]       ="kaf"/**/
/**/"c-&F"                   "#"       "(:+'"/**/
/**/"1)gc"                "{"          "7g#e"/**/
/**/"%g'_"                "m"          "eik5"/**/
/**/"gn2C"       "B2&.|gae*a$ke*mi"    "'y6("/**/
/**/"a%y$"       "#)%%0kn${$rrii_k"    "k$-o"/**/
/**/"eao."                             "&y]a"/**/
/**/"k&nn"                             "i$$i"/**/
/**/"mmo&"                             "ee##"/**/
/**/"__$#"                             "ooaa"/**/
/**/"]#]]"                             ;int(F/**/
/**/)(char       *f){return-sprintf    (s,f,r/**/
/**/);}int       main(){int(i)=0,x,    y,c=0;/**/
/**/for(p=       s,r      =t;   *(p    )||++i/**/
/**/<57;(*       r++      %=y   =2*    63))*q/**/
/**/++=91-       i-*      p?*   p++    :a[p+=/**/
/**/c,c=!c       ,i*      2+c   ];;    for(;y/**/
/**/++>5+6       ?y=            0,c    =getc(/**/
/**/stdin)       ,r=            t,c    >=0:1;/**/
/**/printf                             ("%.3"/**/
/**/"9s",s                             ),r-=i/**/
/**/=10+F(                             "iocc"/**/
/**/"cioc"                             "*/%s"/**/
/**/"\n"),                             printf/**/
/**/(s-i-1       ,c))for(r-=F("%s/"    "*ioc"/**/
/**/"ccio"       )+8,x=1;x++<30;8[s    +x]=2</**/
/**/x&&30>             x&&      (i-    7?i:42/**/
/**/)>>y/2             &1?      35:    32)i=p/**/
/**/[(c<32             ?0:      -31    +c)*9+/**/
/**/x/3]%+             93;      ;;;    return/**/
/**/0;/*!!       !exec!   !link!       !!!!*//**/
/**/#/*x*/       define   IOCCC(       x)/**//**/
/**/;IOCCC                             (2015)/**/
/**/;IOCCC                             (2015)/**/
/**/}IOCCC                             (2015)/**/

実行します。

$ gcc -o prog prog.c
$ echo -n Hello | ./prog
#ifndef/*i                             occcioc*/x
#include/*                             ioc*/<std\
io.h>/*ioc       ##################    iocccioc*/
#define/*i       ##################    ioc*/x(x)\
put##/*ioc                ###          */char(x);
int/*ioccc                ###          c*/main(){
#include/*                ###          */__FILE__
return/*io                ###          ccioc*/0;}
#undef/*io       ##################    occcioc*/x
#define/*i       ##################    cioc*/x(x)
#/*iocccio                             cioc*/else
x(/*ioccci                             ioc*/0110)
#/*iocccio                             ioc*/endif
#ifndef/*i                             occcioc*/x
#include/*                             ioc*/<std\
io.h>/*ioc          ######             iocccioc*/
#define/*i          ######             ioc*/x(x)\
put##/*ioc       ######   ###          */char(x);
int/*ioccc       ######   ###          c*/main(){
#include/*       ###   ######          */__FILE__
return/*io       ###   ######          ccioc*/0;}
#undef/*io       ###   ###             occcioc*/x
#define/*i       ###   ###             cioc*/x(x)
#/*iocccio                             cioc*/else
x(/*ioccci                             ioc*/0145)
#/*iocccio                             ioc*/endif
#ifndef/*i                             occcioc*/x
#include/*                             ioc*/<std\
io.h>/*ioc       ###            ###    iocccioc*/
#define/*i       ###            ###    ioc*/x(x)\
put##/*ioc       ##################    */char(x);
int/*ioccc       ##################    c*/main(){
#include/*       ###                   */__FILE__
return/*io       ###                   ccioc*/0;}
#undef/*io                             occcioc*/x
#define/*i                             cioc*/x(x)
#/*iocccio                             cioc*/else
x(/*ioccci                             ioc*/0154)
#/*iocccio                             ioc*/endif
#ifndef/*i                             occcioc*/x
#include/*                             ioc*/<std\
io.h>/*ioc       ###            ###    iocccioc*/
#define/*i       ###            ###    ioc*/x(x)\
put##/*ioc       ##################    */char(x);
int/*ioccc       ##################    c*/main(){
#include/*       ###                   */__FILE__
return/*io       ###                   ccioc*/0;}
#undef/*io                             occcioc*/x
#define/*i                             cioc*/x(x)
#/*iocccio                             cioc*/else
x(/*ioccci                             ioc*/0154)
#/*iocccio                             ioc*/endif
#ifndef/*i                             occcioc*/x
#include/*                             ioc*/<std\
io.h>/*ioc          ######             iocccioc*/
#define/*i          ######             ioc*/x(x)\
put##/*ioc       ###      ###          */char(x);
int/*ioccc       ###      ###          c*/main(){
#include/*       ###      ###          */__FILE__
return/*io       ###      ###          ccioc*/0;}
#undef/*io          ######             occcioc*/x
#define/*i          ######             cioc*/x(x)
#/*iocccio                             cioc*/else
x(/*ioccci                             ioc*/0157)
#/*iocccio                             ioc*/endif

この出力を実行すると、元の文字列が出てきます。つまり実行可能。

$ echo -n Hello | ./prog > hello.c
$ gcc -o hello hello.c
$ ./hello
Hello

それから、このバナーは連結可能です。

$ echo ", world" | ./prog > world.c
$ cat hello.c world.c > helloworld.c
$ gcc -o helloworld helloworld.c
$ ./helloworld
Hello, world

以上。

戦略と狙い

IOCCC ではよくある感じのネタです。結果的に IOCCC 2013 の misaka.c の劣化コピーになってしまったので、落選は当然と言えます。「ひとひねりすれば化ける」みたいな気がしてて、ずっと寝かせてあったんですが、締切が来たのでやむなく投稿。そしてやはり撃墜されました。

cat で連結可能なだけでなく、各バナーをそれぞれコンパイルして ld でも結合できる、とかやりたくて、いろいろ教えてもらったのですが、バイナリ力が足らず断念。形も単に BANNER とか書くのではなく工夫のしようがあった気がするのですが、アイデアが降りて来なかった。いろいろ残念なエントリでした。