ichirin2501's diary

いっちりーん。

Smileys Triangle(りべんじ)+α

63byteが最短コードだと思っていた頃がありました。
当時のコードで一度断念したのですが、
googleのコードを縮めた際に知ったテクニックを利用して61byteに到達!
やっぱり「まだ」縮められると分かるだけでも違いますね
出し惜しみしても得られるものなし、という言葉に従ってコード公開して行こうと思います。
ネタバレ迷惑もいいところで申し訳ありません。

google

anarchy golf - google

// 55byte
s;main(){
  printf("g%sgle",memset(&s,'o',atoi(gets())));
}

普通ならgets()関数に引数なしだとSegmentation fault。
しかし、型宣言無視のグローバル変数を定義することによってgets()関数が引数なしでも動作するようになります。
gets()関数に引数を与えない場合、どのアドレスを参照してるのか、ということですが…どこなんでしょう?w
よく分かりません(へーるp。
追記(2010/3/22):
動作チェックしてみたら、動作しなかった。
バージョンが上がったらしく(Debian package: gcc-4.3.3-9)、上記のコードが通らなくなったっぽい。



Smileys Triangle

anarchy golf - Smileys Triangle
今回、Smileys Triangleに利用したテクニックは
・型宣言無視のグローバル変数を文字列格納場所に使う
これによって初期化部分を縮めることが出来ました。

// 61byte
c=58;main(i){
  for(;i+33;strcat(&c,--i?"))"+!~i:"-"))
    puts(&c);
}

初期化が同時に出来れば良いなーと、当時も考えたのですが、配列状態だと初期化が上手くいきませんでした。
・配列ではなく、変数なら初期化が上手くいく
・型宣言無視のグローバル変数は大量に領域確保?と領域内を全て0で初期化(ヌル文字として作用)
こんな感じでしょうか。

わーいわーい、素直に嬉しい。