Advertisement
Guest User

Untitled

a guest
Mar 25th, 2019
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.06 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Linq;
  5. using Wintellect.PowerCollections;
  6.  
  7. namespace Posts
  8. {
  9.     class Program
  10.     {
  11.         static Dictionary<string, User> usersByName = new Dictionary<string, User>();
  12.  
  13.         static void Main(string[] args)
  14.         {
  15.             var postNumber = new PostCreationNumberCount();
  16.            
  17.             var sb = new StringBuilder();
  18.  
  19.             int n = int.Parse(Console.ReadLine());
  20.  
  21.             for (int i = 0; i < n; i++)
  22.             {
  23.                 var line = Console.ReadLine().Split();
  24.                 var command = line[0];
  25.  
  26.                 if (command == "add")
  27.                 {
  28.                     var name = line[1];
  29.  
  30.                     AddUser(name);
  31.                 }
  32.  
  33.                 else if (command == "subscribe")
  34.                 {
  35.                     var firstName = line[1];
  36.                     var secondName = line[2];
  37.  
  38.                     var output = SubscribeUser(firstName, secondName);
  39.                     sb.AppendLine(output);
  40.                 }
  41.  
  42.                 else if (command == "post")
  43.                 {
  44.                     string name = line[1];
  45.                     string text = line[2];
  46.                     var output = CreatePost(name, text, postNumber);
  47.                     sb.AppendLine(output);
  48.                 }
  49.  
  50.                 else if (command == "listposts")
  51.                 {
  52.                     string name = line[1];
  53.                     var ouput = ListPostsByUser(name);
  54.                     sb.AppendLine(ouput);
  55.                 }
  56.             }
  57.  
  58.             Console.WriteLine(sb.ToString().TrimEnd());
  59.         }
  60.  
  61.         static void AddUser(string name)
  62.         {
  63.             var user = new User(name);
  64.             usersByName.Add(name, user);
  65.         }
  66.  
  67.         static string SubscribeUser(string firstName, string secondName)
  68.         {
  69.             var secondUser = usersByName[secondName];
  70.             var firstUser = usersByName[firstName];
  71.  
  72.             firstUser.FollowedUsers.Add(secondUser);
  73.  
  74.             return $"{firstName} subscribed to {secondName}";
  75.  
  76.         }
  77.  
  78.         static string CreatePost(string name, string text, PostCreationNumberCount number)
  79.         {
  80.             var user = usersByName[name];
  81.             var post = new Post(text, user, number);
  82.             user.AddPost(post);
  83.  
  84.             return $"{name} created post {post.Order}: {text}";
  85.         }
  86.  
  87.         static string ListPostsByUser(string name)
  88.         {
  89.             var sb = new StringBuilder();
  90.  
  91.             var user = usersByName[name];
  92.  
  93.             var postByUser = user.PostsByUser.ToList();
  94.             var postsByUserFollowers = user.FollowedUsers.SelectMany(x => x.PostsByUser).ToList();
  95.  
  96.             var allPosts = postByUser.Concat(postsByUserFollowers).ToList();
  97.  
  98.             allPosts.Sort();
  99.  
  100.             var result = allPosts.Take(10);
  101.  
  102.             sb.AppendLine( $"{name}: {user.FollowedUsers.Count} subscriptions");
  103.  
  104.             foreach (var item in result)
  105.             {
  106.                 sb.AppendLine(item.ToString());
  107.             }
  108.  
  109.             return sb.ToString().TrimEnd();
  110.         }
  111.     }
  112.  
  113.     public class PostCreationNumberCount
  114.     {
  115.         private int counter;
  116.  
  117.         public PostCreationNumberCount()
  118.         {
  119.             counter = 0;
  120.         }
  121.  
  122.         public int PostNumberCount()
  123.         {
  124.             counter++;
  125.             return counter;
  126.         }
  127.     }
  128.  
  129.     public class User : IComparable<User>
  130.     {
  131.         public OrderedSet<Post> PostsByUser { get; set; }
  132.  
  133.         public List<User> FollowedUsers { get; set; }
  134.  
  135.         public User(string name)
  136.         {
  137.             this.Name = name;
  138.             PostsByUser = new OrderedSet<Post>();
  139.             FollowedUsers = new List<User>();
  140.         }
  141.         public string Name { get; set; }
  142.  
  143.         public void AddPost(Post post)
  144.         {
  145.             if (PostsByUser.Count >= 10)
  146.             {
  147.                 var lastUser = PostsByUser[9];
  148.  
  149.                 PostsByUser.RemoveLast();
  150.                 PostsByUser.Add(post);
  151.             }
  152.  
  153.             else
  154.             {
  155.                 PostsByUser.Add(post);
  156.             }
  157.  
  158.         }
  159.  
  160.         public int CompareTo(User other)
  161.         {
  162.             int compariosn = this.Name.CompareTo(other.Name);
  163.             return compariosn;
  164.         }
  165.  
  166.     }
  167.  
  168.     public class Post : IComparable<Post>
  169.     {
  170.         public Post(string text, User userCreator, PostCreationNumberCount number )
  171.         {
  172.             this.Text = text;
  173.             this.UserCreator = userCreator;
  174.             this.Order = number.PostNumberCount();
  175.         }
  176.  
  177.         public User UserCreator { get; set; }
  178.  
  179.         public string Text { get; set; }
  180.  
  181.         public int Order { get; set; }
  182.  
  183.  
  184.         public override string ToString()
  185.         {
  186.             return $"- Post {Order}: {Text}";
  187.         }
  188.  
  189.         public int CompareTo(Post other)
  190.         {
  191.             int comparison = this.Order.CompareTo(other.Order) * -1;
  192.  
  193.             return comparison;
  194.         }
  195.     }
  196. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement