C♯の勉強

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

TopCoder SRM 583: IDNumberVerification

普通の実装問題。

yyyy/mm/dd が一般的なカレンダーにおいて Valid かどうかは DateTime.DaysInMonth を使うと楽に書ける。

public class IDNumberVerification {
    const string Invalid = "Invalid";

    public bool ValidBirthday(string birthday) {
        int year = int.Parse(birthday.Substring(0, 4));
        int month = int.Parse(birthday.Substring(4, 2));
        int day = int.Parse(birthday.Substring(6, 2));
        if (year < 1900 || 2011 < year) return false;
        if (month < 1 || 12 < month) return false;
        if (day < 1 || DateTime.DaysInMonth(year, month) < day) return false;
        return true;
    }

    public int CheckSum(string s) {
        int x = 0;
        for (int i = 0; i < s.Length - 1; i++) {
            x = x * 2 + (s[i] - '0');
            x %= 11;
        }
        x *= 2;
        x += Char.IsDigit(s.Last()) ? s.Last() - '0' : 10;
        x %= 11;
        return x;
    }

    public string verify(string id, string[] regionCodes) {
        string region = id.Substring(0, 6);
        string birthday = id.Substring(6, 8);
        string code = id.Substring(14, 3);
        char checksum = id.Last();

        if (!regionCodes.Contains(region))
            return Invalid;
        if (!ValidBirthday(birthday))
            return Invalid;
        if (code == "000")
            return Invalid;
        if (CheckSum(id) != 1)
            return Invalid;

        return int.Parse(code) % 2 == 1 ? "Male" : "Female";
    }
}