2010年11月25日木曜日

TopCoder練習 SRM420 DIV2

250 問題文(要ログイン)
public class DeckRearranging {
 public String rearrange(String deck, int[] above) {
  String a = new String();
  for(int i = 0; i < deck.length(); i++) {
   a = a.substring(0, above[i]) + String.valueOf(deck.charAt(i)) + a.substring(above[i]);
  }
  return a;
 }
}
簡単。
500 問題文(要ログイン)
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;

public class YearProgressbar {
 public double percentage(String currentDate) {
  SimpleDateFormat sdf = new SimpleDateFormat("MMM dd, yyyy HH:mm z", Locale.US);
  Date date = sdf.parse(currentDate + " EST", new ParsePosition(0));
  
  GregorianCalendar current = new GregorianCalendar();
  current.setTime(date);
  
  int year = current.get(GregorianCalendar.YEAR);
  GregorianCalendar start = new GregorianCalendar();
  String s = "January 01, " + Integer.toString(year) + " 00:00 EST";
  start.setTime(sdf.parse(s, new ParsePosition(0)));
  
  GregorianCalendar end = new GregorianCalendar();
  s = "January 01, " + Integer.toString(year + 1) + " 00:00 EST";
  end.setTime(sdf.parse(s, new ParsePosition(0)));
  
  return (double)(current.getTimeInMillis() - start.getTimeInMillis()) / (double)(end.getTimeInMillis() - start.getTimeInMillis()) * 100.0;
 }
}
今までで一番苦労しました。せっかくJavaを使っているんだからってCalendarクラスを使おうとした結果がこれだよ!

もう自分で実装したほうが早かったね・・・

ローカルではTestCaseが通るのに、TopCoder側では通らないという謎。
1時間以上悩んだ結果、原因は「夏時間」。
調べるうちにDateFormatクラスがあるから使ってやんよ、と思ったらこれもまた苦戦。
今度はローカルでSimpleDateFormatが動かない。なぜかTopCoder側で動く。
これは、Localeを指定しないと、月(Mayとか)を正しくとってこられないっぽい。デフォルトのままだと「5月」みたいに日本語表示しか読み取れなかったみたい。
そして、setTime(Date)した後は、setTimeZone(TimeZone)しても適用されていなくて、もうしょうがないから入力テキストにESTって記述してタイムゾーン指定してやったよ!!

他の人の解凍を見るとDateクラスの非推奨のメソッド使うともっと簡単にできたっぽい。もうやだ。

0 件のコメント:

コメントを投稿