using System.Globalization;
using System.Collections.Generic;
public static readonly int YEAR = 2000;
public Zodiac Zodiac {get; private set;}
public ZodiacDateRange(Zodiac zodiac, DateTime start, DateTime end) {
this.Days = (end - start).Days;
public bool Is(DateTime date) {
var start = new DateTime(
date.Year + (Start.Year - R.YEAR),
return date >= start && date <= start.AddDays(Days);
private Dictionary<Zodiac, int> UserCount = new Dictionary<Zodiac, int>();
private readonly List<ZodiacDateRange> ZodiacSigns = new List<ZodiacDateRange>() {
new ZodiacDateRange(Zodiac.Capricorn, new DateTime(R.YEAR - 1, 12, 22), new DateTime(R.YEAR, 1, 19)),
new ZodiacDateRange(Zodiac.Aquarius, new DateTime(R.YEAR, 1, 20), new DateTime(R.YEAR, 2, 18)),
new ZodiacDateRange(Zodiac.Pisces, new DateTime(R.YEAR, 2, 19), new DateTime(R.YEAR, 3, 20)),
new ZodiacDateRange(Zodiac.Aries, new DateTime(R.YEAR, 3, 21), new DateTime(R.YEAR, 4, 19)),
new ZodiacDateRange(Zodiac.Taurus, new DateTime(R.YEAR, 4, 20), new DateTime(R.YEAR, 5, 20)),
new ZodiacDateRange(Zodiac.Gemini, new DateTime(R.YEAR, 5, 21), new DateTime(R.YEAR, 6, 20)),
new ZodiacDateRange(Zodiac.Cancer, new DateTime(R.YEAR, 6, 21), new DateTime(R.YEAR, 7, 22)),
new ZodiacDateRange(Zodiac.Leo, new DateTime(R.YEAR, 7, 23), new DateTime(R.YEAR, 8, 22)),
new ZodiacDateRange(Zodiac.Virgo, new DateTime(R.YEAR, 8, 23), new DateTime(R.YEAR, 9, 22)),
new ZodiacDateRange(Zodiac.Libra, new DateTime(R.YEAR, 9, 23), new DateTime(R.YEAR, 10, 22)),
new ZodiacDateRange(Zodiac.Scorpio, new DateTime(R.YEAR, 10, 23), new DateTime(R.YEAR, 11, 21)),
new ZodiacDateRange(Zodiac.Sagittarius, new DateTime(R.YEAR, 11, 22), new DateTime(R.YEAR, 12, 21))
private Zodiac findZodiac(DateTime date) {
var zodiacRange = ZodiacSigns
.FirstOrDefault(zodiac => zodiac.Is(date));
if (zodiacRange == null) {
return zodiacRange.Zodiac;
private DateTime? parseUserBirthday(String rawUserInfo) {
string[] lineParsed = rawUserInfo.Split(" ".ToCharArray(), 2);
if (lineParsed.Length < 2) {
birthday = DateTime.ParseExact(
CultureInfo.InvariantCulture
} catch (FormatException) {
public void readUserInfo(String rawUserInfo) {
DateTime? birthday = parseUserBirthday(rawUserInfo);
Console.WriteLine("String was not recognized as a valid DateTime.");
Zodiac zodiac = findZodiac((DateTime) birthday);
if (zodiac == Zodiac.Default) {
Console.WriteLine("Cannot find corresponding Zodiac sign.");
if (UserCount.ContainsKey(zodiac)) {
public void writeStatistics(TextWriter writer) {
ZodiacSigns.ForEach(zodiac => {
if (!UserCount.ContainsKey(zodiac.Zodiac)) {
writer.WriteLine(zodiac.Zodiac + " " + UserCount[zodiac.Zodiac]);
public static void Main() {
Console.WriteLine("Input format: <username> <date of birth as DD.MM.YYYY> [Enter]");
Console.WriteLine("Press [Enter] to exit.");
var users = new ZodiacUserStore();
line = Console.ReadLine();
users.readUserInfo(line);
} while (line.Length > 0);
users.writeStatistics(Console.Out);