この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 件のコメント:
コメントを投稿