順調順調

短いコードを書くためのセオリーみたいのを押さえると順調に縮む。
後は良いアルゴリズムを思いつけるかどうか。
もっと頭よくなーれ。

show the way

前回提出したものからせこせこ削って127Bまで短縮できた。
重複している部分を取り除いただけでも短くなったけど、やっぱり配列を廃止できるとぐっと縮む。
int型の変数に1Bづつアクセスしたいならchar型で受け取る関数を使えばいいじゃない。
ということで番号を探すのにstrrchrを使う。
対象が見つかった最後の場所を返してくれるので、最初の1Bを読み飛ばさなくていいのも美味しい。
後はASCIIコードの0〜9の下位4ビットはそのまま数値の0〜9になっているので、ANDを取って下位4ビットだけ取り出す。
普通に計算するコードでは、今のところこれが最短なのではないかなと思うけどどうなんだろう。
ループで探していたときのコードもおまけにぺたっと。


137B版

char m[112];
c, j;

main(i)
{
  for(read(0, m, 111); j < *m - 47;)
    m[i] == j + 48 ? c && puts(c - i > 0 ? c - i > 9 ? "top" : "left" : c - i < -9 ? "bottom" : "right"),
    c = i, i = 1, j++ : i++;
}

127B版

c, j;

main(i, m)
{
  for(read(0, &m, 111); j <= (m & 15); j++ && puts(c - i > 0 ? c - i > 9 ? "top" : "left" : c - i < -9 ? "bottom" : "right"), c = i)
    i = strrchr(&m, j + 48);
}

ちなみに何故か127Bのコードは手元の環境では上手く動かない。
最後の行だけ上手く取得できてないようだ。なんでだろう?