なかなか縮まない

ここ数日、99 shinichiroes of hamajiとSmileys Triangleの短縮に挑んでいた。
263Bと82Bに縮んだけども、どちらも頭打ち感が漂ってきた。
現状のアルゴリズムだとこれが限界なのか、それとも気が付いていない何かがあるのか。
恐らくは後者だ!いや、後者であって下さいorz
多分やり方はどちらも今の方法を発展させるか、変形させればいいんじゃないかと思うんだけど・・・

99 shinichiroes of hamaji

文章を区切る位置の見直しと無駄な配列を作っていたのを消して263B。
配列の宣言をa[]="hoge"から*a="hoge"に変えて、1Bづつ配列の宣言を短縮できたのも大きいかな。
多分どちらも同じ事をしているはず、と思ってやってみたらすんなり上手く行ってくれたから良かった。
実際は違うことしてるのかもしれないけど、動いているからいいのだ。うん。
って結局はそれかよ!

勘違いも甚だしかった。配列の宣言と文字列へのポインターだから違うよ、全然違うよ。
書いてる時点で気が付かないんだから自分のレベルが知れるなorz

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

main()
{
  for(; i; 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

前回のコードの口の部分")"をASCIIコードに変えて1B縮んで82B。
そんだけ。putchar版も書いてみたけど83Bだった。
二重ループの解消と、配列の廃止が短縮の鍵になるんじゃないかと思うんだけど上手くいかない。
せっかく書いたからputchar版83Bコードも貼っておく。

j;

main(i)
{
  for(; i < 66; puts(""), i += i < 3 ? 1 : 2)
    for(j = 0; j < i; j++)
      putchar(j < 1 ? 58 : j < 2 ? 45 : 41);
}