ページ 11

【雑談】IOCCC のようなコード

Posted: 2010年7月09日(金) 10:43
by 御津凪
IOCCC (国際邪悪なCコードコンテスト)という催しが昔からあるのをご存知でしょうか。

今回は私がそのようなコードを書いてみました。

-------- ここよりコード --------
#include  <stdio.h>
 main( ) { int i,x; for( i
^=i;i [ "]for(i=10;i>0;i+=1"
"){ }["            ] ;++i )
( x=~i,            so( i, i
^i["if"            "(i){so"
"(0,'C"            "');}"],
                  i ["\xac"
                 "\xf4\xea"
                "\xf9\x1b"
              "\x05\x43"
            "\xf1\x19"
           "\xc4\xf5"
          "\xb9\x3b"
          "\xc5\xf4"
          "\xd9\x5f"
          "\xae\x8a"
          "\xb4\xce"
          "\xbe\xee"


          ],i /x /x)
         );} so(j,p,o
         ,s){ putchar
         (o--- +1+- j
         ---s --/ p +
          1- p ) ; }
-------- ここまでコード --------

実行すると、

C言語なんでも質問掲示板

と表示します。
動作確認は VC++ で /Tc オプション(Cコードとしてコンパイルする)を付けた状態で
コンパイルできることを確認しました。

興味のある方は、解読してみたり、 IOCCC のようなコードを書いてみたり、
課題(自由)研究にしてみてもいいかもしれません。

IOCCC でググると、解読してみた記事や、上記のようなもっときれいなアスキーアートなコードを見ることができます。

(ちなみに上記のコードは受賞された作品のコードを参考にしています)

Re:【雑談】IOCCC のようなコード

Posted: 2010年7月09日(金) 10:59
by へろりくしょん
Perlで言うところのJAPHみたいな物ですね。

初めて見た時は本当に感動しました。

Re:【雑談】IOCCC のようなコード

Posted: 2010年7月09日(金) 11:34
by シエル
う…さっぱり意味がわからん。。。
こんなコンテストあったんですね。

Re:【雑談】IOCCC のようなコード

Posted: 2010年7月09日(金) 18:38
by Poco
この手の話なら、ここは必見でしょうね。

http://uguu.org/sources.html

Re:【雑談】IOCCC のようなコード

Posted: 2010年7月09日(金) 21:18
by たいちう
> 興味のある方は、解読してみたり、 IOCCC のようなコードを書いてみたり、

この程度ならば余裕で解読できました。
演算子の優先順位を調べる必要がありましたが。
以前、本家のソースの解読を断念したことがありましたので、
少しは力が付いているのかな。


> この手の話なら、ここは必見でしょうね。

コーディング規約に取り入れると、仕事もより楽しくなるのですが。

Re:【雑談】IOCCC のようなコード

Posted: 2010年7月09日(金) 22:25
by いくせ、ふたたび
はじめまして。

[/url]が演算子だったことを忘れてたのでびっくりしました。

a == b[a]ですね。

Re:【雑談】IOCCC のようなコード

Posted: 2010年7月09日(金) 22:44
by 御津凪
上記のコードを簡単に整形すると、
#include  <stdio.h>

main(){
    int i,x;
    for(i^=i;i["]for(i=10;i>0;i+=1){ }["];++i)
        (x=~i, so(i,
                  i^i["if(i){so(0,'C');}"],
                  i["\xac\xf4\xea\xf9\x1b\x05\x43\xf1\x19\xc4\xf5\xb9\x3b\xc5\xf4\xd9\x5f\xae\x8a\xb4\xce\xbe\xee"],
                  i/x/x));
}

so(j,p,o,s){
    putchar(o---+1+-j---s--/p+1-p);
}
となります。

このコードには無意味な部分が多分に含まれているだけなので、
あとはCの仕様がわかっていれば楽に解読できますね。

逆に #define マクロで埋め尽くされた作品(コード)は目で簡単に追えませんね。
(というかまず無理だと思われる)

> たいちうさん

> 以前、本家のソースの解読を断念したことがありましたので、
> 少しは力が付いているのかな。

私も同じようなクチでした。
とはいっても参考にした元コードのカラクリにはたと気づいたのは昨日なんですけどね;

プログラミングという生産技術にはおおよそ無縁の IOCCC ですが、
こういったものは見ていて刺激されますね。


> > この手の話なら、ここは必見でしょうね。
>
> コーディング規約に取り入れると、仕事もより楽しくなるのですが。

楽しくなる代わりにコーディングに時間がかかって実際のプログラミングの時間が短くなって、間に合わなくなるわけですね。


ちなみに上記の作品は約3時間で作りましたが、そのうち「?」の形に整形するのに2時間かかりました。

Re:【雑談】IOCCC のようなコード

Posted: 2010年7月10日(土) 00:52
by ムンバ
こんばんは。

>>IOCCC (国際邪悪なCコードコンテスト)という催しが昔からあるのをご存知でしょうか。

 知りませんでした。
 これは、ちょっと私には刺激が強すぎます♪
 またまた、C言語(C++をちょっと含む)ゲーム作りから脱線してしまいそうです。
 
Perlでも、できるのですか?(早速、調べ中です。)

今、C の勉強をしてる途中で、何故かPerl(CGI)に脱線しているのですが
「アスキーアートなコード」に、フラフラ~っと、導かれてしまった様な気がします。
余暇でやるのも、いいかもしれませんねっ!
相変わらず、優柔不断な私。(汗