もっと!もっと短く!

SRM448に間に合わなかったのでanarchy golf。
それなりに短くなってきてるから頑張り甲斐があるというもの。

tennis

2位集団が遂に射程圏内に入った。4B縮んで157B。後2Bだ!
三項演算子の真の場合の値(第二オペランドって書いた方がいいのかな?)を省略すると、より左の値を取って来るのを利用した。
gcc3.x系しか使えなかったような気がするけど、手元の環境もサーバー側もgcc3.x系だったので使えたみたい。よかった。
気のせいだった。サーバー側のgccは4.1.2のようだけど普通に使えた。
gcc3.x系とか関係なく使えるみたいだ。うわー、恥ずかしいー


自分で書いておいて若干意味不明な感じだから、手っ取り早く思い出せるよう簡単な計算の結果を残しておく。こんな感じ。

puts("hoge" ? : "piyo");       //hogeを出力
printf("%d", 100 ? : 10);      //100を出力

滅多に使う機会もないと思うけど・・・
後は2の剰余を求めるだけで入力の値が1か2かを判別できることに気が付いた。

o, t;

main(i)
{
  for(; gets(&i); printf(o - t ? "Player%d %s %d - %d\n" : "Set is tied at %d\n",
    o - t ? o > t ? : 2 : o, o > 6 | t > 6 ? "wins the set" : "leads",
    o > t ? o : t, o < t ? o : t)
  )
    i % 2 ? o++ : t++;
}

delete blank lines

早速三項演算子を論理ANDに置き換えて短縮した。1B縮んで39B。

main(i)
{
  for(; gets(&i);)
    i & 63 && puts(&i);
}

Dancing Kids

メモリ破壊して4B縮んだ。102B。
後はreadで律儀に全部読み込まなくても、入力がrightじゃなければ先頭の文字がlかrかを気にしてるだけなので9文字だけ読むように。
トップまで後7Bだ。こちらもいよいよ最短に近づいてきた感じ。

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