ずる

してみた。
http://d.hatena.ne.jp/tanakh/20100330
どこまで細かい規定があるかわからないので、とりあえずなんでもありなら、ということで勝手にちょっと弄ってみた。

アセンブルすると、どうせ使わないattributeやらなんやらが山のようにはいっていたので、
これを落としちゃえば1Kは切れると信じてやってみた。
たぶん評価サーバがあるということだったので、本番では使えなかったんじゃないかなぁ、という意味でズルです、はい。。。

import java.io.PrintWriter;
import java.io.File;
import java.util.Scanner;

class Code extends File {
    Code() { super("[^0-9]+"); }
    public static void main(String[] a) throws Exception{
        int i, j, k;
        Scanner s;
        (s = new Scanner(new File(a[0]))).useDelimiter("[^0-9]+");
        PrintWriter pw = new PrintWriter("output.csv");
        double[][] tbl = new double[1024][512];

        while (s.hasNextInt()) {
            tbl[s.nextInt()][s.nextInt()]++;
        }

        for (i=0; i<512; i++){
            double ni=0;
            for (k=0; k<1024; k++) {
                ni += tbl[k][i]*tbl[k][i];
            }
            if (ni>0){
                int t=0;
                for (j=0; j<512; j++){
                    double nj=0, nc=0;
                    for (k=0; k<1024; k++){
                        nj += tbl[k][j]*tbl[k][j];
                        nc += tbl[k][i]*tbl[k][j];
                    }
                    if (nj>0){
                        if (t!=0) pw.print((char)44);
                        t=1;
                        pw.print(nc/Math.sqrt(ni*nj));
                    }
                }
                pw.print((char)10);
            }
        }
        pw.close();
    }
}

コンパイルは、

javac -target 1.5 -g:none Code.java

ただしsample inputがないので、動くかどうかは不明(酷)。。。
細かい変更は、

  • BufferedReader -> Scanner に変更。Integerとかもいらなくなる、、、はず。おそいけど、1万くらいなら大丈夫だろうと予想(データないとなぁ...)
  • printf -> print(char/double) に変更。primitive の signature は小さいし、boxingもいらなくなるので。
  • class名をCodeに。余計な文字列は削除削除。
  • File を継承 + Constructorの追加. -> java.lang.Objectの消去
  • i,j,k と、sを先に宣言。 iload_{1,2,3} は他(4以上)と比べて命令長が短いので、若干有利

849 bytes。もう数bytesはなんとかなるとは思う。
javacってほとんど最適化とかなにもしてくれないので、classファイル直接いじりたくなるなぁ(特にdupとか)。。。
そして何よりもコンパイルオプションがでかいのがなんとも。。。
ちなみに、オプションなしだと、関数本体の改行を消して(linenumbertableを小さくするため)1200 bytes弱くらい。

今回は予定が重なってしまってたんだけど、次の機会があったら出てみたいです。