0.3 P!rates - 05. Programming Fundamentals Final Exam
https://pastebin.com/WAEhBksC
На примерните инпути всичко е вярно, обаче ми дава 58 / 100.
https://pastebin.com/WAEhBksC
На примерните инпути всичко е вярно, обаче ми дава 58 / 100.
Здравей,
За сортирането съм сигурен, че е грешно.
Като гледам имаш my_dict, което е dictionary като value-то е dictionary
За да достъпиш gold стойността с my_dict.items() трябва да го направиш да излежда подобно на:
max_gold = sorted(my_dict.items(), key=lambda x: (x[1].get("gl"), x[0]), reverse=True)
my_dict.items() ще изведеде tuple с първи елемент града и втори елемент dictionary с key gl или pl
с x[1] ще вземеш втората част на tuple, която е речника
с x[1].get("gl") - стойността на gl
След това за да направиш първо descending order на gold и после ascending на града трябва да махнеш reverse=True и да използваш минус за първото, което е int:
max_gold = sorted(my_dict.items(), key=lambda x: (-x[1].get("gl"), x[0]))
Здрвей GeorgiG05,
Моето решение също забива на 58/100.
Ще се радвам ако някой сподели решение 100/100 на въпросната задача.
Ето го и моят код (C#):
https://pastebin.com/YcL15AwV
;-)
using System;
using System.Linq;
using System.Collections.Generic;
namespace pirates
{
class Program
{
static void Main(string[] args)
{
var townList = new Dictionary<string, List<int>>();
string townInput = Console.ReadLine();
while (townInput != "Sail")
{
string[] townSplit = townInput
.Split("||", StringSplitOptions.RemoveEmptyEntries);
if (townSplit.Length == 3)
{
string town = townSplit[0];
int population = int.Parse(townSplit[1]);
int gold = int.Parse(townSplit[2]);
if (!townList.ContainsKey(town))
{
townList[town] = new List<int>();
townList[town].Add(population);
townList[town].Add(gold);
}
else
{
townList[town][0] += population;
townList[town][1] += gold;
}
}
townInput = Console.ReadLine();
}
string commands = Console.ReadLine();
while (commands != "End")
{
string[] cmdSplit = commands
.Split("=>", StringSplitOptions.RemoveEmptyEntries);
string operation = cmdSplit[0];
if (operation == "Plunder")
{
string town = cmdSplit[1];
int population = int.Parse(cmdSplit[2]);
int gold = int.Parse(cmdSplit[3]);
if (townList.ContainsKey(town))
{
Console.WriteLine($"{town} plundered! {gold} gold stolen, {population} citizens killed.");
townList[town][0] -= population;
townList[town][1] -= gold;
if (townList[town][0] <= 0 || townList[town][1] <= 0)
{
Console.WriteLine($"{town} has been wiped off the map!");
townList.Remove(town);
}
}
}
else if (operation == "Prosper")
{
string town = cmdSplit[1];
int gold = int.Parse(cmdSplit[2]);
if (gold < 0)
{
Console.WriteLine("Gold added cannot be a negative number!");
}
else
{
townList[town][1] += gold;
int currentGold = townList[town][1];
Console.WriteLine($"{gold} gold added to the city treasury. {town} now has {currentGold} gold.");
}
}
commands = Console.ReadLine();
}
if (townList.Any())
{
Console.WriteLine($"Ahoy, Captain! There are {townList.Count} wealthy settlements to go to:");
foreach (var (town, data) in townList.OrderByDescending(data => data.Value[1]).ThenBy(name => name.Key))
{
Console.WriteLine($"{town} -> Population: {data[0]} citizens, Gold: {data[1]} kg");
}
}
else
{
Console.WriteLine("Ahoy, Captain! All targets have been plundered and destroyed!");
}
}
}
}
Мерси за кода.
Както обикновено решението ти е отлично.Варианта с един речник е по-добър,a при мен липсваше проверка за златото(if gold<=0).
Thank you so much !