そろそろ限界

今まで解いてきた問題は自分の技術だと、そろそろ縮められる限界点に到達したっぽい。
無駄を省こうにもどうやって省いていいものやら。
アルゴリズムが違うんだろうけど、今より短くできそうなのが思いつかないorz
もっと考えるんだ!俺!

99 shinichiroes of hamaji

前回のものと大して変わりなく。
押し込めるところに押し込んで3B短縮した260B。
単数形と複数形でそれぞれ文字列を持ってるのを解消しない限り、ここから縮みそうにない。
トップはここから60Bも短いんだからそれだけじゃないんだろうけどね。

char *s = " shinichiroes of hamaji", *u = " shinichiro of hamaji", *w = " on the wall";
i = 99;

main()
{
  for(; i;)
    printf("%d%s%s, %d%s.\n%s, %d%s%s.\n\n",
           i--, i > 1 ? s : u, w, i, i > 1 ? s : u,
           i > 1 ? "Take one down and pass it around" : "Go to the store and buy some more",
           i > 1 ? i - 1 : 99, i - 2 ? s : u, w);
}

Smileys Triangle

顔の出力部分を全部配列の中に突っ込んで、初回の出力が終わったら不要な部分をポインターで読み飛ばす。
3B縮んで75B。配列を廃止したいけど中々上手くいかない。
printfにしたら長くなりそうだしなあ・・・

char c[99] = ":\n:-\n:-)";

main(i)
{
  for(; i++ < 33;)
    puts(i < 3 ? c : strcat(c + 5, "))"));
}

tennis

printfを1個にまとめることができた。
後は細々と比較条件を直したりして6B縮んだ。現在161B。
2位集団まで後5Bで手が届きそう。これは凄い!

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 ? 1 : 2 : o, o > 6 | t > 6 ? "wins the set" : "leads",
    o > t ? o : t, o < t ? o : t)
  )
    i % 48 < 2 ? o++ : t++;
}