チームラボ天下一武道会に参加した.

参加したって言っていいのかわかんないけど,天下一武道会(http://www.team-lab.com/news/index.php?itemid=581)に参加してきました.
社内外問わず,なんか凄そうな人集めて速かったり短いコードを書いて競おうといった感じのコンテストでした.
今回のお題は,Javaだったので,todesking先生のコード見て勉強したいなーって思って行ったんですが,居ませんでした><


最近コードを殆ど書いてなかったので,久々に考えながら色々出来て楽しかった!
(その多くの時間をJavaのコンテナ検索に使ったとかはおいといて...)
クラスがいっぱいありすぎて,どれを使えばいいのかが3時間では把握しきれなかったですw


答え合わせをdiffを使わず,Excel上で目視して確認してて,最後まで気付かなかったのですが,
提出したコードだと,「0.00」と出力ファイルでは書かれてないといけないのが「0.0」とかになってて,diffするとかなり差が出る結果となってしまいました...
まぁでも,多分答えはあってたはずだからいいやとか自己満足してます.
提出したコード(インデントと改行は削除したものを提出しました):

import java.io.*;
class cosine{
  public static void main(String[] p){
    int u=1002,d=502,i;
    int[][] im=new int[u][d];
    String[] z=new String[d];
    try{
      BufferedReader r=new BufferedReader(new FileReader(p[0]));r.readLine();
      String l="";
      while((l=r.readLine())!=null){String[] el=l.split(",");im[Integer.parseInt(el[0])][Integer.parseInt(el[1])]+=1;}
      r.close();
      PrintWriter o=new PrintWriter(new BufferedWriter(new FileWriter("out.csv")));
      for(int ad=1;ad<d;ad++){
        int as=0;
        for(int bd=1;bd<d;bd++){
          int bs=0,sm=0;
          for(i=0;i<u;i++){
            if(bd==1)as+=im[i][ad]*im[i][ad];
            bs+=im[i][bd]*im[i][bd];
            sm+=im[i][ad]*im[i][bd];
          }
          double s=(sm/(Math.sqrt(as)*Math.sqrt(bs)));
          if(Double.isNaN(s))s=0.0;
          if(z[ad]==null)z[ad]="";
          if(z[ad].length()>0)z[ad]+=",";
          z[ad]+=Math.round(s*100.0)/100.0;
        }
        o.println(z[ad]);
      }
      o.close();
    }
    catch(Exception e){}
  }
}

で,結果発表の後にtanakhさんのコードを見てたら,
実はPrintWriterでprintfが使えたらしい...
ので,その点を修正して正解データ多分出せてたのが以下のコード

import java.io.*;
class cosine{
  public static void main(String[] p) throws Exception{
    int u=1002,d=502,i;
    int[][] im=new int[u][d];
    BufferedReader r=new BufferedReader(new FileReader(p[0]));
    r.readLine();
    for (String l="";(l=r.readLine())!=null;){
      String[] el=l.split(",");
      im[Integer.parseInt(el[0])][Integer.parseInt(el[1])]++;
    }
    r.close();
    PrintWriter o=new PrintWriter(new BufferedWriter(new FileWriter("out.csv")));
    for(int ad=1;ad<d;ad++){
      int as=0;
      for(int bd=1;bd<d;bd++){
        int bs=0,sm=0;
        for(i=0;i<u;i++){
          if(bd==1)as+=im[i][ad]*im[i][ad];
          bs+=im[i][bd]*im[i][bd];
          sm+=im[i][ad]*im[i][bd];
        }
        double s=(sm/(Math.sqrt(as)*Math.sqrt(bs)));
        if(Double.isNaN(s))s=0.0;
        if(bd>1)o.print(",");
        o.printf("%.2f", s);
      }
      o.print("\n");
    }
    o.close();
  }
}


上のソースファイルが800byteで,下のソースファイルが716byteくらいだった.
コンパイルしたら1.4KB前後でした.
実行速度は,コンテストで使われてたマシンだと7秒ちょいでした(全体ではかなり遅い方).


僕のは,変数名とか色々短くして姑息な手段を使ってこのサイズだったのですが,優勝したtanakhさんはインデントとか削除しないで,そのまま書いててクラスファイルが1.37kbくらい?だったので,すげーと関心してました.
しかも綺麗だし.
悔しかったので,次回なんかあったらもっと頑張ろうと思います.



まる.