配列のサイズ

配列のサイズは省略しても結構動くみたい。
省略すると確保されるメモリの量がわからないから使ってなかったけど、今のところ動いてしまっているから使うことにした。
ここが省略できるとゴルフ的には結構おいしいと思う。
なんで動くのかわからないのは気持ち悪いけど。

Smileys Triangle

いつの間にか日記に多数登場することになっていた因縁のスマイリー。
配列のサイズを省略したのと、最初から文字コードを入れておくことで4B短縮できた。69B。
ついにねんがんの70B切りコードをてにいれたぞ!
しかしこれより更に短縮しようとするとアルゴリズムも違ってくるだろうし、アクロバティックなコードになりそう。
そんなん書けるかなあ。

c[]={58};

main(i)
{
  for(; i++ < 35; strcat(c, i < 3 ? "-" : i < 4 ? ")" : "))"))
  puts(c);
}

提出したのは上のだけど、手元の環境では終了時に強制終了するコードだった。
配列の要素数を省略しているけど、58を入れてるから要素数が1個の配列と扱われたせいだと思う。
メモリを開放するタイミングで変な事になっているんじゃないかなーと。
アセンブリコードとかほとんど読めないから憶測にすぎないのが情けない・・・
で、強制終了はまずかろうということで直したのが下のコード。

c[];

main(i)
{
  for(*c = 58; i++ < 35; strcat(c, i < 3 ? "-" : i < 4 ? ")" : "))"))
  puts(c);
}

こっちなら配列のサイズは不定のままのようだから強制終了はしないようだ。コード量も変わらない。
しかしサイズが不定なままだとメモリの開放時に変なことにならないだろうか・・・
コンパイルとかリンクの段階での話なのかな?わからないことが多い。
sizeofしてみたら前者のは4が返ってきて、後者のはsizeofできないと言われコンパイルが通りませんでした。当然か。

delete blank lines

配列のサイズを削っただけ。2B短縮して42B。

c[];

main()
{
  for(; gets(c);)
    *c & 63 ? puts(c) : 0;
}

Dancing Kids

同じく配列のサイズを削っただけ。1B短縮して106B。

c[];

main()
{
  puts(read(0, c, 11) - 5 ? *c & 2 ? "\\('-')/\n  |_|" : " ('-')/\n /|_|" : "\\('-')\n  |_|\\");
  puts("  | |");
}