PKU2503 Babelfish (2)

Ozyさんのところでコードが紹介されたので(http://d.hatena.ne.jp/Ozy/20080809#p1)、こちらも晒します。
比較的読みやすい144B。

a[' あ'],*p,s;strcmp();
main(i){
  for(;~scanf("%s%*[ ]%s",p+3,p=a+6*i);)
    !*p?s||qsort(a,i,24,s=strcmp),p=bsearch(p+3,a,i,24,s),puts(p?p+3:"eh")
       :i++;
}

scanf一発で読み込む以外はほとんどOzyさんと同じ。短くしようとすると、同じようなコードに行きつくらしい。

bsearchは引数の数を増やしてもコンパイラに怒られないので、forの中の式は論理を逆転できる。これで143B。

a[' あ'],*p,s;strcmp();
main(i){
  for(;~scanf("%s%*[ ]%s",p+3,p=a+6*i);)
    *p?i++
      :puts((p=bsearch(p+3,a,i,24,s,s||qsort(a,i,24,s=strcmp)))?p+3:"eh");
}

昨日の夜中のsubmit祭りで' あ'を短くしようとしたけど断念。文字コードを調べるところからやったので、すごい手数がかかってしまった。GBKなのでどうあがいても2byteにしかならないようだ。
副産物としてGBKとUnicodeの変換テーブルを見つけた。UnicodeからUTF-8への変換は簡単。これで好きな数値を埋め込める。
http://cs.nyu.edu/~yusuke/tools/unicode_to_gb2312_or_gbk_table.html


(080811追記)
もうね、アホかと。機種依存ってレベルじゃねぇぞ

a[' あ'],*p,s;
main(i){
  for(;~scanf("%s%*[ ]%s",p+3,p=a+6*i);)
    *p?i++:puts((p=bsearch(p+3,a,i,24,s,s||qsort(a,i,24,s=-0x88457a20)))?p+3:"eh");
}

0x88457a20を'[難しい漢字]z 'の形にすると、134B。元の0x77ba85e0をうまく扱えるとさらに縮むのだけど、うまくいかない…