Advertisement
deleriumbg

Number Wars

Oct 11th, 2018
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.99 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4.  
  5. namespace Number_Wars
  6. {
  7.     class Program
  8.     {
  9.         private const int maxTurns = 1_000_000;
  10.  
  11.         static void Main(string[] args)
  12.         {
  13.             Queue<string> firstPlayerCards = new Queue<string>(Console.ReadLine().Split());
  14.             Queue<string> secondPlayerCards = new Queue<string>(Console.ReadLine().Split());
  15.  
  16.             int turnCounter = 0;
  17.             bool winnerFound = false;
  18.            
  19.             while (turnCounter < maxTurns && firstPlayerCards.Count > 0 && secondPlayerCards.Count > 0 && !winnerFound)
  20.             {
  21.                 turnCounter++;
  22.                 string firstCard = firstPlayerCards.Dequeue();
  23.                 string secondCard = secondPlayerCards.Dequeue();
  24.                
  25.                 if (GetNumber(firstCard) > GetNumber(secondCard))
  26.                 {
  27.                     firstPlayerCards.Enqueue(firstCard);
  28.                     firstPlayerCards.Enqueue(secondCard);
  29.                 }
  30.                 else if (GetNumber(firstCard) < GetNumber(secondCard))
  31.                 {
  32.                     secondPlayerCards.Enqueue(secondCard);
  33.                     secondPlayerCards.Enqueue(firstCard);
  34.                 }
  35.                 else
  36.                 {
  37.                     List<string> currentHand = new List<string>{ firstCard, secondCard };
  38.  
  39.                     while (!winnerFound)
  40.                     {
  41.                         if (firstPlayerCards.Count >= 3 && secondPlayerCards.Count >= 3)
  42.                         {
  43.                             int firstSum = 0;
  44.                             int secondSum = 0;
  45.  
  46.                             for (int i = 0; i < 3; i++)
  47.                             {
  48.                                 string currentFirst = firstPlayerCards.Dequeue();
  49.                                 string currentSecond = secondPlayerCards.Dequeue();
  50.                                 firstSum += GetChar(currentFirst);
  51.                                 secondSum += GetChar(currentSecond);
  52.                                 currentHand.Add(currentFirst);
  53.                                 currentHand.Add(currentSecond);
  54.                             }
  55.  
  56.                             if (firstSum > secondSum)
  57.                             {
  58.                                 AddCardsToWinner(firstPlayerCards, currentHand);
  59.                                 break;
  60.                             }
  61.                             else if (firstSum < secondSum)
  62.                             {
  63.                                 AddCardsToWinner(secondPlayerCards, currentHand);
  64.                                 break;
  65.                             }
  66.                         }
  67.                         else
  68.                         {
  69.                             winnerFound = true;
  70.                         }
  71.                     }
  72.                 }
  73.             }
  74.  
  75.             string result = string.Empty;
  76.  
  77.             if (firstPlayerCards.Count == secondPlayerCards.Count || turnCounter > maxTurns)
  78.             {
  79.                 result = "Draw";
  80.             }
  81.             else if (firstPlayerCards.Count > 0)
  82.             {
  83.                 result = "First player wins";
  84.             }
  85.             else
  86.             {
  87.                 result = "Second player wins";
  88.             }
  89.  
  90.             Console.WriteLine($"{result} after {turnCounter} turns");
  91.         }
  92.  
  93.         private static void AddCardsToWinner(Queue<string> winnerPlayerCards, IEnumerable<string> currentHand)
  94.         {
  95.             foreach (var card in currentHand.OrderByDescending(GetNumber).ThenByDescending(GetChar))
  96.             {
  97.                 winnerPlayerCards.Enqueue(card);
  98.             }
  99.         }
  100.  
  101.         private static int GetNumber(string card)
  102.         {
  103.             return int.Parse(card.Substring(0, card.Length - 1));
  104.         }
  105.  
  106.         private static int GetChar(string card)
  107.         {
  108.             //a -> 1, b -> 2, c -> 3 etc.
  109.             return card[card.Length - 1] - 96;
  110.         }
  111.     }
  112. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement