SRM member pilot2 DIV2

topcoder2回目。
300点問題をsubmitした時点で残り時間が5分しかなかった。時間かかりすぎ……。
116.71ptもらって、600点問題を開いて終了。

300点問題

import java.util.*; 

public class Xosceles{ 
  public String[] draw(int xCount){ 
    String[] result; 
    ArrayList<Integer> al = new ArrayList<Integer>(); 
    int t=2; 
    for(int i=4; t<2550;i+=2){ 
      t += i; 
      al.add(t); 
    } 
    for(int i=2; i<51;i++ ){ 
      if(i*i==xCount){ 
        result = new String[i]; 
        int end = ((int)Math.sqrt(xCount))-1; 
        for(int j=0;j<result.length ;j++){ 
          StringBuffer sb = new StringBuffer(50); 
          for(int k=0;k<end;k++){ 
            sb.append("."); 
          } 
          for(int k=0;k<j*2+1;k++){ 
            sb.append("X"); 
          } 
          for(int k=0;k<end;k++){ 
            sb.append("."); 
          } 
          result[j]=sb.toString(); 
          end--; 
        } 
        return result; 
      } 
    } 
    if(al.contains(xCount)){ 
      int elnum = al.indexOf(xCount)+2; 
      result = new String[elnum]; 
      for(int i=0; i<result.length; i++){ 
        StringBuffer sb = new StringBuffer(50); 
        for(int j=0; j<elnum-1; j++){ 
          sb.append("."); 
        } 
        for(int j=0; j<(i+1)*2; j++){ 
          sb.append("X"); 
        } 
        for(int j=0; j<elnum-1; j++){ 
          sb.append("."); 
        } 
        result[i] = sb.toString(); 
        elnum--; 
      } 
      return result; 
    } 
    return new String[0]; 
  } 
}


xCountがn^2になってる場合はすぐ分かったけど、階差数列になってる場合の判定がよく分からなかったので、Listに数列全部ぶちこんでcontainsで判断。なんてむりやりなんだ。
いつ撃墜されるかびくびくしてたけど、撃墜はされなかった。


チャレンジフェーズが終わった頃、同室の人に「君のコード、2でtestしたときおかしいよ」と指摘された。英語で。英語怖い。
えっと思ってテストしてみると、1のとき{X}、2のとき{XX}と表示されず空白が返っていた。3〜2550を入れたときのことしか考えてなかった……。
SystemTestは無事通ったけどエレガントなコードにはほど遠い。もっとがんばるぞ。

反省

  • わざわざStringBuffer使わなくてもStringに+=使えばおkだった
  • 数学勉強しろ
  • 英語勉強しろ