コード例 #1
0
        static void Main(string[] args)
        {
            Bag bag = new Bag();

            long bagCapacity = long.Parse(Console.ReadLine());

            bag.Capacity = bagCapacity;
            bag.CashList = new List <Cash>();
            bag.GemList  = new List <Gem>();
            bag.GoldList = new List <long>();

            string inputItems = Console.ReadLine();

            List <string> inputList = inputItems
                                      .Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
                                      .ToList();

            while (inputList.Count > 1)
            {
                string firstArgument  = inputList[0];
                string secondArgument = inputList[1];

                string lastThreeChars = string.Empty;
                if (firstArgument.Length > 3)
                {
                    int startIndex = Math.Max(0, (firstArgument.Length - 3));
                    lastThreeChars = firstArgument.Substring(startIndex, firstArgument.Length - startIndex);
                }
                if (firstArgument.ToLower() == "gold")
                {
                    long currentGoldAmount = long.Parse(secondArgument);

                    if (bag.Capacity >= currentGoldAmount)
                    {
                        bag.Capacity   -= currentGoldAmount;
                        bag.GoldAmount += currentGoldAmount;
                        bag.GoldList.Add(currentGoldAmount);
                    }
                }
                else if (firstArgument.Length == 3)
                {
                    string currentCurrency   = firstArgument;
                    long   currentCashAmount = long.Parse(secondArgument);

                    if (bag.Capacity >= currentCashAmount && bag.CashAmount + currentCashAmount <= bag.GemAmount)
                    {
                        bag.Capacity   -= currentCashAmount;
                        bag.CashAmount += currentCashAmount;

                        if (!bag.CashList.Any(x => x.Type.Equals(currentCurrency, StringComparison.InvariantCultureIgnoreCase)))
                        {
                            Cash newCash = new Cash
                            {
                                Type     = currentCurrency,
                                Quantity = currentCashAmount
                            };
                            bag.CashList.Add(newCash);
                        }
                        else
                        {
                            bag.CashList.FirstOrDefault(x => x.Type.Equals(currentCurrency, StringComparison.InvariantCultureIgnoreCase)).Quantity += currentCashAmount;
                        }
                    }
                }
                else if (lastThreeChars.ToLower() == "gem")
                {
                    string currentGem       = firstArgument;
                    long   currentGemAmount = long.Parse(secondArgument);

                    if (bag.Capacity >= currentGemAmount && bag.GemAmount + currentGemAmount <= bag.GoldAmount)
                    {
                        bag.Capacity  -= currentGemAmount;
                        bag.GemAmount += currentGemAmount;

                        if (!bag.GemList.Any(x => x.Name.Equals(currentGem, StringComparison.InvariantCultureIgnoreCase)))
                        {
                            Gem newGem = new Gem
                            {
                                Name     = currentGem,
                                Quantity = currentGemAmount
                            };
                            bag.GemList.Add(newGem);
                        }
                        else
                        {
                            bag.GemList.FirstOrDefault(x => x.Name.Equals(currentGem, StringComparison.InvariantCultureIgnoreCase)).Quantity += currentGemAmount;
                        }
                    }
                }
                inputList.RemoveAt(0);
                inputList.RemoveAt(0);
            }
            if (bag.GoldList.Count > 0)
            {
                Console.WriteLine($"<Gold> ${bag.GoldAmount}");
                Console.WriteLine($"##Gold - {bag.GoldAmount}");
            }
            if (bag.GemList.Count > 0)
            {
                Console.WriteLine($"<Gem> ${bag.GemAmount}");
                foreach (var gem in bag.GemList.OrderByDescending(x => x.Name).ThenBy(x => x.Quantity))
                {
                    Console.WriteLine($"##{gem.Name} - {gem.Quantity}");
                }
            }
            if (bag.CashList.Count > 0)
            {
                Console.WriteLine($"<Cash> ${bag.CashAmount}");
                foreach (var cash in bag.CashList.OrderByDescending(x => x.Type).ThenBy(x => x.Quantity))
                {
                    Console.WriteLine($"##{cash.Type} - {cash.Quantity}");
                }
            }
        }