Два речника или един с лист в него?
Привет, както се разбира от въпроса ми , затруднявам се да се ориентирам от условието на задачата, дали да ползвам два речника или един с List в него? Например , опитвам се да реша задача, която я имплементирам с един речник ето така :
Dictionary<string, List<int>> cityParameters = new Dictionary<string, List<int>>(); и стигам до невъзможност да обработя параметрите по условието. В решенията на същата виждам, че е решена с два отделни речника:
Dictionary<string, int> allCitiesGold = new Dictionary<string, int>();
Dictionary<string, int> allCitiesPopulation= new Dictionary<string, int>();
Прилагам и самото условие на задачата:
Until the "Sail" command is given you will be receiving:
- Cities that you and your crew have targeted, with their population and gold, separated by .
- If you receive a city which has been already received, you have to increase the population and gold with the given values.
After the "Sail" command, you will start receiving lines of text representing events until the "End" command is given.
Events will be in the following format:
- "Plunder=>{town}=>{people}=>{gold}"
- You have successfully attacked and plundered the town, killing the given number of people and stealing the respective amount of gold.
- For every town you attack print this message:
- If any of those two values (population or gold) reaches zero, the town is disbanded.
- You need to remove it from your collection of targeted cities and print the following message: "{town} has been wiped off the map!"
- There will be no case of receiving more people or gold than there is in the city.
- "Prosper=>{town}=>{gold}"
- There has been a dramatic economic growth in the given city, increasing its treasury by the given amount of gold.
- The gold amount can be a negative number, so be careful. If a negative amount of gold is given print:
- If the given gold is a valid amount, increase the town's gold reserves by the respective amount and print the following message:
Input
- On the first lines, until the "Sail" command, you will be receiving strings representing the cities with their gold and population, separated by "||"
- On the next lines, until the "End" command, you will be receiving strings representing the actions described above, separated by "=>"
Output
- After receiving the "End" command if there are any existing settlements on your list of targets, you need to print all of them, sorted by their gold in descending order, then by their name in ascending order, in the following format:
Може ли за малко инфо как мога да се ориентирам по-добре кога/дали да ползвам един речник или два отделни?
Това ми костваше решението на задачата от изпита.
Благодаря предварително!
Поздрави!
Привет, да , аз точно така съм почнал да го правя, но в един момент зациклих и не знаех как да продължа. Ето ми кода , който бях направил:
https://pastebin.com/J52Du76P
Точно това, правя , което и ти си писал, но в края на краищата не работи.
Поздрави
Разплетох ти кода...не мога да го тествам но смятам, че щеше да даде 100/100...сравни го и виж разликите. Като съвет - повече вниквай в условието, беше сложил двата while един в друг, което е излишно, също така това няма как да стане >>cityParameters[city][population] += population;<< мъчиш се да достъпиш интов масив по стрингова стойност..малко странно. Идеята ти е правилна, но с# не работи така..Следващият път като зацепиш някаде просто дебъгвай и виж кое и къде не се получава.
using System;
using System.Collections.Generic;
using System.Linq;
namespace _3._Pirates
{
class Program
{
static void Main(string[] args)
{
Dictionary<string, List<int>> cityParameters = new Dictionary<string, List<int>>();
while (true)
{
string input = Console.ReadLine();
if (input == "Sail")
{
break;
}
string[] citySplit = input.Split("||").ToArray();
string city = citySplit[0];
int population = int.Parse(citySplit[1]);
int gold = int.Parse(citySplit[2]);
if (!cityParameters.ContainsKey(city))
{
cityParameters.Add(city, new List<int>()); //като вариант става и така => cityParameters.Add(city, new List<int>() { 0, 0 });
cityParameters[city].Add(population); // cityParameters[city][0]= (population);
cityParameters[city].Add(gold); // cityParameters[city][1]= (gold);
}
else
{
cityParameters[city][0] += population;
cityParameters[city][1] += gold;
}
}
while (true)
{
string input = Console.ReadLine();
if (input == "End")
{
break;
}
string[] action = input.Split("=>").ToArray();
string command = action[0];
if (command.Equals("Plunder"))
{
string cityToBePlundered = action[1];
int peopleKilled = int.Parse(action[2]);
int goldStolen = int.Parse(action[3]);
Console.WriteLine($"{cityToBePlundered} plundered! {goldStolen} gold stolen, {peopleKilled} citizens killed.");
if (cityParameters.ContainsKey(cityToBePlundered))
{
cityParameters[cityToBePlundered][0] -= peopleKilled;
cityParameters[cityToBePlundered][1] -= goldStolen;
if (cityParameters[cityToBePlundered][0] <= 0 || cityParameters[cityToBePlundered][1] <= 0)
{
cityParameters.Remove(cityToBePlundered);
Console.WriteLine($"{cityToBePlundered} has been wiped off the map!");
}
}
}
else if(command.Equals("Prosper"))
{
string cityToBePlundered = action[1];
int gold = int.Parse(action[2]);
if (gold < 0)
{
Console.WriteLine($"Gold added cannot be a negative number!");
}
else
{
cityParameters[cityToBePlundered][1] += gold;
Console.WriteLine($"{gold} gold added to the city treasury. {cityToBePlundered} now has {cityParameters[cityToBePlundered][1]} gold.");
}
}
}
if (cityParameters.Count > 0)
{
Console.WriteLine($"Ahoy, Captain! There are {cityParameters.Count} wealthy settlements to go to:");
foreach (var (cityName, stats) in cityParameters.OrderByDescending(x=>x.Value[1]).ThenBy(x=>x))
{
Console.WriteLine($"{cityName} -> Population: {stats[0]} citizens, Gold: {stats[1]} kg");
}
}
else
{
Console.WriteLine($"Ahoy, Captain! All targets have been plundered and destroyed!");
}
}
}
}
Благодаря. Парадокса е, че бях го направил с два отдели външни while-a , но после не знаех как да достъпя параметрите от Листа- population и gold. А това - >cityParameters[city][population] += population;<< също бях го направил както теб. Просто [0] и [1] ги именувах за да е по чсно четимо. При дебъга ми се виждаше, че сработва и вкарва данните в речника. Всъщност първата част на while-a ми работеше, но посел не знаех как да продължа и направих това като вложих другия while, очевидно грешен подход. Много ти благодаря за помощта.