Guest User

RedditDailyProgrammer_GameOfThrones

a guest
Jun 15th, 2012
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 9.12 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text.RegularExpressions;
  5.  
  6. namespace GameOfThrones
  7. {
  8.     public class Program
  9.     {
  10.         public static void Main(string[] args)
  11.         {
  12.             string peopleRawData = @"AA = Rickard Stark (M)        AB = Eddard Stark (M)         AC = Catelyn Tully (F)        
  13. AD = Brandon Stark (M)        AE = Benjen Stark (M)         AF = Jon Snow (M)            
  14. AG = Robb Stark (M)           AH = Sansa Stark (F)          AI = Arya Stark (F)          
  15. AJ = Bran Stark (M)           AK = Rickon Stark (M)         AL = Hoster Tully (M)        
  16. AM = Minisa Whent (F)         AN = Edmure Tully (M)         AO = Lysa Tully (F)          
  17. AP = Jon Arryn (M)            AQ = Robert Arryn (M)         AR = Tytos Lannister (M)      
  18. AS = Tywin Lannister (M)      AT = Joanna Lannister (F)     AU = Kevan Lannister (M)      
  19. AV = Cersei Lannister (F)     AW = Jamie Lannister (M)      AX = Tyrion Lannister (M)    
  20. AY = Robert Baratheon (M)     AZ = Joffrey Baratheon (M)    BA = Myrcella Baratheon (F)  
  21. BB = Tommen Baratheon (M)     BC = Lancel Lannister (M)     BD = Steffon Baratheon (M)    
  22. BE = Stannis Baratheon (M)    BF = Selyse Florent (F)       BG = Shireen Baratheon (F)    
  23. BH = Renly Baratheon (M)      BI = Jaehaerys Targaryen (M)  BJ = Aerys Targaryen (M)      
  24. BK = Rhaella Targaryen (F)    BL = Rhaegar Targaryen (M)    BM = Elia Martell (F)        
  25. BN = Rhaenys Targaryen (F)    BO = Aegon Targaryen (M)      BP = Viserys Targaryen (M)    
  26. BQ = Daenerys Targaryen (F)   BR = Quellon Greyjoy (M)      BS = Balon Greyjoy (M)        
  27. BT = Euron Greyjoy (M)        BU = Victarion Greyjoy (M)    BV = Urrigon Greyjoy (M)      
  28. BW = Aeron Greyjoy (M)        BX = Rodrik Greyjoy (M)       BY = Maron Greyjoy (M)        
  29. BZ = Asha Greyjoy (F)         CA = Theon Greyjoy (M)        CB = Alannys Harlaw (F)";
  30.  
  31.  
  32.             string relationshipsRawData = @"AA->AB, AA->AD, AA->AE, AB->AF, AB->AG, AB->AH, AB->AI, AB->AJ, AB->AK, AC->AG,
  33. AC->AH, AC->AI, AC->AJ, AC->AK, AL->AC, AL->AN, AL->AO, AM->AC, AM->AN, AM->AO,
  34. AO->AQ, AP->AQ, AR->AS, AR->AU, AS->AV, AS->AW, AS->AX, AT->AV, AT->AW, AT->AX,
  35. AU->BC, AV->AZ, AV->BA, AV->BB, AY->AZ, AY->BA, AY->BB, BD->AY, BD->BE, BD->BH,
  36. BE->BG, BF->BG, BI->BJ, BI->BK, BJ->BL, BJ->BP, BJ->BQ, BK->BL, BK->BP, BK->BQ,
  37. BL->BN, BL->BO, BM->BN, BM->BO, BR->BS, BR->BT, BR->BU, BR->BV, BR->BW, BS->BX,
  38. BS->BY, BS->BZ, BS->CA, CB->BX, CB->BY, CB->BZ, CB->CA";
  39.  
  40.  
  41.             CharacterList characters = new CharacterList(peopleRawData, relationshipsRawData);
  42.  
  43.  
  44.             foreach (var item in characters.Ancestors("Daenerys Targaryen"))
  45.                 Console.WriteLine(item.Name);
  46.             Sep();
  47.  
  48.             foreach (var item in characters.Descendants("Jaehaerys Targaryen"))
  49.                 Console.WriteLine(item.Name);
  50.             Sep();
  51.  
  52.             foreach (var item in characters.Brothers("Bran Stark"))
  53.                 Console.WriteLine(item.Name);
  54.             Sep();
  55.  
  56.             foreach (var item in characters.Sisters("Bran Stark"))
  57.                 Console.WriteLine(item.Name);
  58.             Sep();
  59.  
  60.             foreach (var item in characters.Uncles("Bran Stark"))
  61.                 Console.WriteLine(item.Name);
  62.             Sep();
  63.  
  64.             foreach (var item in characters.Aunts("Bran Stark"))
  65.                 Console.WriteLine(item.Name);
  66.            
  67.  
  68.             foreach (var item in characters.Cousins("Bran Stark"))
  69.                 Console.WriteLine(item.Name);
  70.         }
  71.         public static void Sep()
  72.         { Console.WriteLine("--------------------------------"); }
  73.     }
  74.  
  75.     public enum Gender { Male, Female }
  76.     public class Character
  77.     {
  78.         public string ID { get; private set; }
  79.         public string Name { get; private set; }
  80.         public Gender Gender { get; private set; }
  81.         public CharacterList Parents { get; private set; }
  82.         public CharacterList Children { get; private set; }
  83.  
  84.         public Character(string id, string name, Gender gender)
  85.         {
  86.             ID = id;
  87.             Name = name;
  88.             Gender = gender;
  89.             Parents = new CharacterList();
  90.             Children = new CharacterList();
  91.         }
  92.     }
  93.     public class CharacterList : List<Character>
  94.     {
  95.         private const string regexPattern = @"\w{2}\s=\s\w+\s\w+\s\([MF]\)";
  96.  
  97.         #region Constructors
  98.         public CharacterList() { }
  99.         public CharacterList(IEnumerable<Character> list) : base(list) { }
  100.         public CharacterList(string people, string relationships)
  101.         {
  102.             foreach (var item in Regex.Matches(people, regexPattern))
  103.             {
  104.                 string entry = item.ToString();
  105.                 string id = entry.Substring(0, 2);
  106.                 string name = entry.Substring(5, entry.Length - 9);
  107.                 string gender = entry.Substring(entry.Length - 2, 1);
  108.                 Add(new Character(id, name, (gender == "M" ? Gender.Male : Gender.Female)));
  109.             }
  110.             foreach (var item in relationships.Split(new char[] { ',', ' ', '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries))
  111.             {
  112.                 Character parent = GetCharacterByID(item.Substring(0, 2));
  113.                 Character child = GetCharacterByID(item.Substring(4, 2));
  114.                 parent.Children.Add(child);
  115.                 child.Parents.Add(parent);
  116.             }
  117.         }
  118.         #endregion
  119.  
  120.         #region GetCharacter
  121.         public Character GetCharacterByID(string id)
  122.         { return this.Where(c => c.ID == id).SingleOrDefault(); }
  123.         public Character GetCharacterByName(string name)
  124.         { return this.Where(c => c.Name == name).SingleOrDefault(); }
  125.         #endregion
  126.  
  127.         #region Ancestors
  128.         public CharacterList Ancestors(Character character)
  129.         {
  130.             CharacterList output = new CharacterList();
  131.             foreach (Character parent in character.Parents)
  132.             {
  133.                 output.Add(parent);
  134.                 foreach (Character ancestor in Ancestors(parent))
  135.                     output.Add(ancestor);
  136.             }
  137.             return output;
  138.         }
  139.         public CharacterList Ancestors(string name)
  140.         { return Ancestors(GetCharacterByName(name)); }
  141.         #endregion
  142.  
  143.         #region Descendants
  144.         public CharacterList Descendants(Character character)
  145.         {
  146.             CharacterList output = new CharacterList();
  147.             foreach (Character child in character.Children)
  148.             {
  149.                 output.Add(child);
  150.                 foreach (Character descendant in Descendants(child))
  151.                     output.Add(descendant);
  152.             }
  153.             return output;
  154.         }
  155.         public CharacterList Descendants(string name)
  156.         { return Descendants(GetCharacterByName(name)); }
  157.         #endregion
  158.  
  159.         #region Brothers
  160.         public CharacterList Brothers(Character character)
  161.         {
  162.             var query = character.Parents.SelectMany(c => c.Children).Where(c => c != character && c.Gender == Gender.Male).Distinct();
  163.             return new CharacterList(query);
  164.         }
  165.         public CharacterList Brothers(string name)
  166.         { return Brothers(GetCharacterByName(name)); }
  167.         #endregion
  168.  
  169.         #region Sisters
  170.         public CharacterList Sisters(Character character)
  171.         {
  172.             var query = character.Parents.SelectMany(c => c.Children).Where(c => c != character && c.Gender == Gender.Female).Distinct();
  173.             return new CharacterList(query);
  174.         }
  175.         public CharacterList Sisters(string name)
  176.         { return Sisters(GetCharacterByName(name)); }
  177.         #endregion
  178.  
  179.         #region Uncles
  180.         public CharacterList Uncles(Character character)
  181.         {
  182.             var query = from o in character.Parents
  183.                         from p in Brothers(o)
  184.                         select p;
  185.             return new CharacterList(query.Distinct());
  186.         }
  187.         public CharacterList Uncles(string name)
  188.         { return Uncles(GetCharacterByName(name)); }
  189.         #endregion
  190.  
  191.         #region Aunts
  192.         public CharacterList Aunts(Character character)
  193.         {
  194.             var query = from o in character.Parents
  195.                         from p in Sisters(o)
  196.                         select p;
  197.             return new CharacterList(query.Distinct());
  198.         }
  199.         public CharacterList Aunts(string name)
  200.         { return Aunts(GetCharacterByName(name)); }
  201.         #endregion
  202.  
  203.         #region Cousins
  204.         public CharacterList Cousins(Character character)
  205.         {
  206.             var query1 = from o in character.Parents
  207.                          from p in Brothers(o)
  208.                          from q in p.Children
  209.                          select q;
  210.             var query2 = from o in character.Parents
  211.                          from p in Sisters(o)
  212.                          from q in p.Children
  213.                          select q;
  214.             return new CharacterList(query1.Union(query2).Distinct());
  215.         }
  216.         public CharacterList Cousins(string name)
  217.         { return Cousins(GetCharacterByName(name)); }
  218.         #endregion
  219.     }
  220. }
Add Comment
Please, Sign In to add comment