Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text.RegularExpressions;
- namespace GameOfThrones
- {
- public class Program
- {
- public static void Main(string[] args)
- {
- string peopleRawData = @"AA = Rickard Stark (M) AB = Eddard Stark (M) AC = Catelyn Tully (F)
- AD = Brandon Stark (M) AE = Benjen Stark (M) AF = Jon Snow (M)
- AG = Robb Stark (M) AH = Sansa Stark (F) AI = Arya Stark (F)
- AJ = Bran Stark (M) AK = Rickon Stark (M) AL = Hoster Tully (M)
- AM = Minisa Whent (F) AN = Edmure Tully (M) AO = Lysa Tully (F)
- AP = Jon Arryn (M) AQ = Robert Arryn (M) AR = Tytos Lannister (M)
- AS = Tywin Lannister (M) AT = Joanna Lannister (F) AU = Kevan Lannister (M)
- AV = Cersei Lannister (F) AW = Jamie Lannister (M) AX = Tyrion Lannister (M)
- AY = Robert Baratheon (M) AZ = Joffrey Baratheon (M) BA = Myrcella Baratheon (F)
- BB = Tommen Baratheon (M) BC = Lancel Lannister (M) BD = Steffon Baratheon (M)
- BE = Stannis Baratheon (M) BF = Selyse Florent (F) BG = Shireen Baratheon (F)
- BH = Renly Baratheon (M) BI = Jaehaerys Targaryen (M) BJ = Aerys Targaryen (M)
- BK = Rhaella Targaryen (F) BL = Rhaegar Targaryen (M) BM = Elia Martell (F)
- BN = Rhaenys Targaryen (F) BO = Aegon Targaryen (M) BP = Viserys Targaryen (M)
- BQ = Daenerys Targaryen (F) BR = Quellon Greyjoy (M) BS = Balon Greyjoy (M)
- BT = Euron Greyjoy (M) BU = Victarion Greyjoy (M) BV = Urrigon Greyjoy (M)
- BW = Aeron Greyjoy (M) BX = Rodrik Greyjoy (M) BY = Maron Greyjoy (M)
- BZ = Asha Greyjoy (F) CA = Theon Greyjoy (M) CB = Alannys Harlaw (F)";
- string relationshipsRawData = @"AA->AB, AA->AD, AA->AE, AB->AF, AB->AG, AB->AH, AB->AI, AB->AJ, AB->AK, AC->AG,
- AC->AH, AC->AI, AC->AJ, AC->AK, AL->AC, AL->AN, AL->AO, AM->AC, AM->AN, AM->AO,
- AO->AQ, AP->AQ, AR->AS, AR->AU, AS->AV, AS->AW, AS->AX, AT->AV, AT->AW, AT->AX,
- AU->BC, AV->AZ, AV->BA, AV->BB, AY->AZ, AY->BA, AY->BB, BD->AY, BD->BE, BD->BH,
- BE->BG, BF->BG, BI->BJ, BI->BK, BJ->BL, BJ->BP, BJ->BQ, BK->BL, BK->BP, BK->BQ,
- BL->BN, BL->BO, BM->BN, BM->BO, BR->BS, BR->BT, BR->BU, BR->BV, BR->BW, BS->BX,
- BS->BY, BS->BZ, BS->CA, CB->BX, CB->BY, CB->BZ, CB->CA";
- CharacterList characters = new CharacterList(peopleRawData, relationshipsRawData);
- foreach (var item in characters.Ancestors("Daenerys Targaryen"))
- Console.WriteLine(item.Name);
- Sep();
- foreach (var item in characters.Descendants("Jaehaerys Targaryen"))
- Console.WriteLine(item.Name);
- Sep();
- foreach (var item in characters.Brothers("Bran Stark"))
- Console.WriteLine(item.Name);
- Sep();
- foreach (var item in characters.Sisters("Bran Stark"))
- Console.WriteLine(item.Name);
- Sep();
- foreach (var item in characters.Uncles("Bran Stark"))
- Console.WriteLine(item.Name);
- Sep();
- foreach (var item in characters.Aunts("Bran Stark"))
- Console.WriteLine(item.Name);
- foreach (var item in characters.Cousins("Bran Stark"))
- Console.WriteLine(item.Name);
- }
- public static void Sep()
- { Console.WriteLine("--------------------------------"); }
- }
- public enum Gender { Male, Female }
- public class Character
- {
- public string ID { get; private set; }
- public string Name { get; private set; }
- public Gender Gender { get; private set; }
- public CharacterList Parents { get; private set; }
- public CharacterList Children { get; private set; }
- public Character(string id, string name, Gender gender)
- {
- ID = id;
- Name = name;
- Gender = gender;
- Parents = new CharacterList();
- Children = new CharacterList();
- }
- }
- public class CharacterList : List<Character>
- {
- private const string regexPattern = @"\w{2}\s=\s\w+\s\w+\s\([MF]\)";
- #region Constructors
- public CharacterList() { }
- public CharacterList(IEnumerable<Character> list) : base(list) { }
- public CharacterList(string people, string relationships)
- {
- foreach (var item in Regex.Matches(people, regexPattern))
- {
- string entry = item.ToString();
- string id = entry.Substring(0, 2);
- string name = entry.Substring(5, entry.Length - 9);
- string gender = entry.Substring(entry.Length - 2, 1);
- Add(new Character(id, name, (gender == "M" ? Gender.Male : Gender.Female)));
- }
- foreach (var item in relationships.Split(new char[] { ',', ' ', '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries))
- {
- Character parent = GetCharacterByID(item.Substring(0, 2));
- Character child = GetCharacterByID(item.Substring(4, 2));
- parent.Children.Add(child);
- child.Parents.Add(parent);
- }
- }
- #endregion
- #region GetCharacter
- public Character GetCharacterByID(string id)
- { return this.Where(c => c.ID == id).SingleOrDefault(); }
- public Character GetCharacterByName(string name)
- { return this.Where(c => c.Name == name).SingleOrDefault(); }
- #endregion
- #region Ancestors
- public CharacterList Ancestors(Character character)
- {
- CharacterList output = new CharacterList();
- foreach (Character parent in character.Parents)
- {
- output.Add(parent);
- foreach (Character ancestor in Ancestors(parent))
- output.Add(ancestor);
- }
- return output;
- }
- public CharacterList Ancestors(string name)
- { return Ancestors(GetCharacterByName(name)); }
- #endregion
- #region Descendants
- public CharacterList Descendants(Character character)
- {
- CharacterList output = new CharacterList();
- foreach (Character child in character.Children)
- {
- output.Add(child);
- foreach (Character descendant in Descendants(child))
- output.Add(descendant);
- }
- return output;
- }
- public CharacterList Descendants(string name)
- { return Descendants(GetCharacterByName(name)); }
- #endregion
- #region Brothers
- public CharacterList Brothers(Character character)
- {
- var query = character.Parents.SelectMany(c => c.Children).Where(c => c != character && c.Gender == Gender.Male).Distinct();
- return new CharacterList(query);
- }
- public CharacterList Brothers(string name)
- { return Brothers(GetCharacterByName(name)); }
- #endregion
- #region Sisters
- public CharacterList Sisters(Character character)
- {
- var query = character.Parents.SelectMany(c => c.Children).Where(c => c != character && c.Gender == Gender.Female).Distinct();
- return new CharacterList(query);
- }
- public CharacterList Sisters(string name)
- { return Sisters(GetCharacterByName(name)); }
- #endregion
- #region Uncles
- public CharacterList Uncles(Character character)
- {
- var query = from o in character.Parents
- from p in Brothers(o)
- select p;
- return new CharacterList(query.Distinct());
- }
- public CharacterList Uncles(string name)
- { return Uncles(GetCharacterByName(name)); }
- #endregion
- #region Aunts
- public CharacterList Aunts(Character character)
- {
- var query = from o in character.Parents
- from p in Sisters(o)
- select p;
- return new CharacterList(query.Distinct());
- }
- public CharacterList Aunts(string name)
- { return Aunts(GetCharacterByName(name)); }
- #endregion
- #region Cousins
- public CharacterList Cousins(Character character)
- {
- var query1 = from o in character.Parents
- from p in Brothers(o)
- from q in p.Children
- select q;
- var query2 = from o in character.Parents
- from p in Sisters(o)
- from q in p.Children
- select q;
- return new CharacterList(query1.Union(query2).Distinct());
- }
- public CharacterList Cousins(string name)
- { return Cousins(GetCharacterByName(name)); }
- #endregion
- }
- }
Add Comment
Please, Sign In to add comment