ずる
してみた。
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弱くらい。
今回は予定が重なってしまってたんだけど、次の機会があったら出てみたいです。