2012年3月13日火曜日

TopCoder SRM343 Div2 250Pts

このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。画像が問題に含まれるので、問題文を直接見ることを推奨する。では、問題についておおまかに説明する。

8*8のチェスボードは列方向にa~h(左がa、右がh)、行方向に1~8(最下段が1、最上段が8)が割り当てられている。マスは"e4"のように、その行と列の文字から表される。さて、チェスのプログラムに取り組んでいるときに、先述の表記とマスを表す数字とを変換する必要が生じた。数値表現する場合、内部的にはマスを1から64で表している。つまり、a1は1、b1は2、...、h8は64ということになっている。cellというセルを表す文字あるいは数値の文字列が与えられたとき、その表記を変換せよ(文字<->数値の変換を行えということである)。

私の解答はこちら。

public class Chessboard {

 public String changeNotation(String cell) {
  // cellの1文字目が数字か文字列かで変換方法が異なる
  if( Character.isLowerCase(cell.charAt(0)) ){
   return aton(cell);
  }else{
   return ntoa(cell);
  }

 }
 // ascii to number(文字表現を数値に変換)
 private String aton(String c){
  int n = (c.charAt(0)- 'a' + 1) + (c.charAt(1) - '0' - 1) * 8;
  return "" + n;
 }
 // number to ascii(数値表現を文字に変換)
 private String ntoa(String c){
  int n = Integer.parseInt(c);
  char f = (char)((n-1) % 8 + 'a');
  int s = (n-1) / 8 + 1;
  return "" + f + s;
 }
}

得点は204.32/250、中央値は約110点。提出者の正解率約46%。場合分けの方法が1つ目の難関、あとは変換ロジックをそれぞれで書けばよい。思ったより中央値の点数が低い印象です。

0 件のコメント:

コメントを投稿

フォロワー

ブログ アーカイブ

ページビューの合計