C♯の勉強

C♯4.0 で TopCoder の過去問を解きます。

TopCoder SRM 590:FoxAndChess

  • begin, target の '.' 以外の文字(LR)を左から突き合わせる
  • 文字や長さが一致しなかったら、"Impossible"
  • あとは移動前後の位置関係が矛盾しているかを判定する

本番だと Where(...).Select((c, index) => index) としてしまって、フィルタ後の添え字を返してハマっていた。
こういう添字を返す場合はおとなしく Enumerable.Range を使ったほうがよさそう。

public class FoxAndChess {
    public string ableToMove(string begin, string target) {
        var x = begin;
        int n = begin.Length;
        if (begin.Replace(".", "") != target.Replace(".", "")) return "Impossible";
        string symbols = begin.Replace(".", "");
        var beginPositions = begin.Select((c, index) => index).Where(index => begin[index] != '.').ToArray();
        var targetPositions = target.Select((c, index) => index).Where(index => target[index] != '.').ToArray();
        for (int i = 0; i < beginPositions.Length; i++) {
            char c = symbols[i];
            if (c == 'L' && beginPositions[i] < targetPositions[i]) return "Impossible";
            if (c == 'R' && beginPositions[i] > targetPositions[i]) return "Impossible";
        }

        return "Possible";
    }
}