カメヲラボ

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

スゴイゼDNA

170台も出たし、もういいかなーと思ったら、なんとhinoeさんが150Bまで短縮してしまいました。

char*q,*r;
i,j,n=6e3,t['~~'];
main(o){
  for(q=gets(t+2*n);j=gets(q);t[++t[n+o]+9*o]=j)
    for(o=0;i=*q++;)for(r=q;*r;)o+=i>*r++;
  for(;i<n;j&&puts(j))j=t[i++];
}

ここまでくると、配列が単なるメモリ領域としか感じられないコードですね。とにかく書き込み時に領域が重ならなければそれでOKなので、無茶なコードも通るようです。ソートされっぷり値の最大値が600強になっているようなので、配列tの0〜5999までは読み込んだ文字列のポインタ、6000〜11999までがソートされっぷりテーブルで、それ以降に文字列が入るデータ構造と、うまく配列を使いこなしている感じですね。私もこれを参考に変数を減らしてみたりいくらかコードを書き換えてみましたが、なんか微妙な感じです。

char*q,*r;
i,j,t['~~'];
main(o){
  for(q=gets(t+9999);j=gets(q);t[++t[6000+o]+9*o]=j)
    for(o=0;i=*q++;)for(r=q;*r;)o+=i>*r++;
  for(;i<6e3;j&&puts(j))j=t[i++];
}

nを消しても変わらず。

char*q,*r;
i,t['~~'];
main(o){
  for(q=gets(t+9999);*t=gets(q);t[++t[6000+o]+9*o]=*t)
    for(o=0;i=*q++;)for(r=q;*r;)o+=i>*r++;
  for(;i<6e3;o&&puts(o))o=t[i++];
}

てなかんじでさらにjを減らしても変わらず。なんとなーく短くできそうでありながら、できない。悩ましい・・・。