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"; } }