カメヲラボ

主にプログラミングとお勉強全般について書いてます

Ants

  • 変態最短最速省メモリコード

http://d.hatena.ne.jp/Ozy/20070125#p2
のコードはまだ正常だったのかもしれない。上記リンクのコードと今回のコードを見比べれば、その変態っぷりは一目瞭然。変態が極まってしまったのは、kurimuraさんとhinoeさんの変態っぷりとやねさんの煽りのせいです。本当にありがとうございました。
main関数の第2引数以降は大体どこかのアドレスを指している場合が多いので、たまたま\0を指していれば1回目の出力を上手くすり抜けられます。運まかせ。Cの場合は6番目の変数で成功。かと言って変数を6個だけにすると上手くいきません。極めて微妙。この問題はインプットの量が膨大なので、入出力も高速になるような工夫が必要です。scanfの代わりにgets+atoiでややスピードアップ。さらにGCCのfmax/fminは使わずにすべて条件演算子を使い、出力はprintfよりもsprintf+writeを使う。これで高速化だけでなく省メモリも達成される。

main(n,v,a,b,m,t,k)
{
  for(;b=n--?
    a=(k=(k=atoi(gets(v)))>m-k?k:m-k)<a?k:a,b>k?b:k:
    ~scanf(a=t="%d %d\n",&m,&n,write(1,v,sprintf(v,t,m-a,b))););
}

続いて最短コード124B。

main(n,v,a,b,m,k,t)
{
  for(;b=n--?
    a=fmin(a,k=fmax(m-k,k=atoi(gets(v)))),b>k?b:k:
    ~scanf(a=t="%d %d\n",&m,&n,printf(t,m-a,b)););
}

最短コードのためにGCCのfmax/fminを使うのだけど、条件演算子の方が短くなる場合もあるので見逃さずに。GCCでは第7引数のアドレスがヌルポイントでした。

G++では最短が125Bなので、GCCが上回ってしまいました(;´д`)