63byteが最短コードだと思っていた頃がありました。
当時のコードで一度断念したのですが、
googleのコードを縮めた際に知ったテクニックを利用して61byteに到達!
やっぱり「まだ」縮められると分かるだけでも違いますね
出し惜しみしても得られるものなし、という言葉に従ってコード公開して行こうと思います。
ネタバレ迷惑もいいところで申し訳ありません。
// 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で初期化(ヌル文字として作用)
こんな感じでしょうか。
わーいわーい、素直に嬉しい。