C# - 7.08.2020 - Final Exam
Здравейте, някой би ли споделил 100 от 100 решения на задачите от финалния изпит? Получавам крайният резултат на първа и втора задача, но не и 100 от 100.
Благодаря предварително!
Здравейте, някой би ли споделил 100 от 100 решения на задачите от финалния изпит? Получавам крайният резултат на първа и втора задача, но не и 100 от 100.
Благодаря предварително!
би трябвало решението на трета задача да изглежда така- с добавяне на проверка за валидност на командите,дори съществува опцията за добавяне на проверка за всички команди извлечени от стринга, който също може да бъде невалиден и програмата да се счупи веднага
без проверка за валидност на а втората команда ми дава 50т.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace regex_demos
{
class Program
{
static void Main(string[] args)
{
int n = int.Parse(Console.ReadLine());
Dictionary<string, List<double>> plants = new Dictionary<string, List<double> >();
for (int i = 0; i < n; i++)
{
string[] input = Console.ReadLine().Split("<->").ToArray();
string plant = input[0];
double rarity = double.Parse(input[1]);
if (!plants.ContainsKey(plant))
{
plants.Add(plant, new List<double>());
plants[plant].Add(rarity);
}
else
{
plants[plant][0] += rarity;//трябва да е само =
}
}
while (true)
{
string input = Console.ReadLine();
if (input == "Exhibition")
{
break;
}
string[] command = input.Split(new char[] { '-', ' ',':' }, StringSplitOptions.RemoveEmptyEntries);
string plant = command[1];
if (!plants.ContainsKey(plant))
{
Console.WriteLine("error");
continue;
}
if (command[0] == "Rate")
{
double rating = double.Parse(command[2]);
plants[plant].Add(rating);
}
else if (command[0] == "Update")
{
double rarity = double.Parse(command[2]);
plants[plant][0] = rarity;
}
else if (command[0] == "Reset")
{
plants[plant].RemoveRange(1, plants[plant].Count - 1);
}
else
{
Console.WriteLine("error");
}
}
foreach (var item in plants)
{
double rarity = item.Value[0];
item.Value.RemoveAt(0);
int count = item.Value.Count;
double sum = item.Value.Sum();
if (sum != 0)
{
sum /= count;
}
item.Value.Clear();
item.Value.Add(rarity);
item.Value.Add(sum);
}
Console.WriteLine("Plants for the exhibition:");
foreach (var item in plants.OrderByDescending(x => x.Value[0]).ThenByDescending(x => x.Value[1]).ToDictionary(x => x.Key,x => x.Value))
{
Console.WriteLine($"- {item.Key}; Rarity: {(int)item.Value[0]}; Rating: {item.Value[1]:f2}");
}
}
}
}
И аз щях да стартитрам такава тема. Благодаря на колегите, че показаха решението на 3та. Може ли да постнете решенията за 1ва и 2ра?
Ето първа за 100/100
Благодаря! Може ли да метнеш едно око на моето решение, понеже мисля, че и аз съм я решил така(една идея по-различно)?
А пък ми даде 66/100.
Благодаря :)
Ето и едно решение на трета, което сглобих от моето и на колегата Ankoun1.
Работи за примерните тестове, джъдж не знам какво би казал :)
zanovasevi дай да видим решението ти на втора, че там съвсем съм се оплел.
Ето моето решение на втора, където излиза резултата, но не и 100 от 100 ...хахаха....
Здравей,
това са решенията ми на първа и втора задача. За съжалние трета не я реших за 100/100, макар с дадените входове работи ок (качвам и нея с надеждата да подскаже поне мъничко на някого или пък на някой му стане интересно и види къде й проблема :D).
1. WorldTour - https://pastebin.com/MnTFJvxW
2.DestinationMapper - https://pastebin.com/Brq79JTZ
Колега , това е моето решение на 3та задача Plant Discovery : https://pastebin.com/Tkj0Mbv0 100/100 надявам се да ти помогне с нещо :), иначе благодаря за решениетоп на 2ра !
Здравей,
Благодаря ти много. Така като гледам твоето решение, явно не съм разбрал правилно забележката в условието(Note: If any of the command is invalid, print "error"). Щом пуснат изпита за практика, ще проверя, но ако наистина е така, то ..ще се гръмна... какъв съм тъпанар! :D :D Аз какво ли не въртях и суках 2 часа над тази задача.
може да се използва и втори празен речник ,в който да се записват промените на данните след манипулация на първия в цикъл и така ми се струва че ще е по-бърза програмата
би трябвало решението на трета задача да изглежда така с добавяне на проверка за валидност на командите
.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace regex_demos
{
class Program
{
static void Main(string[] args)
{
int n = int.Parse(Console.ReadLine());
Dictionary<string, List<double>> plants = new Dictionary<string, List<double> >();
for (int i = 0; i < n; i++)
{
string[] input = Console.ReadLine().Split("<->").ToArray();
string plant = input[0];
double rarity = double.Parse(input[1]);
if (!plants.ContainsKey(plant))
{
plants.Add(plant, new List<double>());
plants[plant].Add(rarity);
}
else
{
plants[plant][0] = rarity;
}
}
while (true)
{
string input = Console.ReadLine();
if (input == "Exhibition")
{
break;
}
string[] command = input.Split(new char[] { '-', ' ',':' }, StringSplitOptions.RemoveEmptyEntries);
string plant = command[1];
if (!plants.ContainsKey(plant))
{
Console.WriteLine("error");
}
else
{
if (command[0] == "Rate")
{
double rating = double.Parse(command[2]);
plants[plant].Add(rating);
}
else if (command[0] == "Update")
{
double rarity = double.Parse(command[2]);
plants[plant][0] = rarity;
}
else if (command[0] == "Reset")
{
plants[plant].RemoveRange(1, plants[plant].Count - 1);
}
else
{
Console.WriteLine("error");
}
}
}
Dictionary<string,List<double>> result = new Dictionary<string,List<double>>();
foreach (var item in plants)
{
double rarity = item.Value[0];
item.Value.RemoveAt(0);
int count = item.Value.Count;
double sum = item.Value.Sum();
if (sum != 0)
{
sum /= count;
}
result.Add(item.Key,new List<double>{rarity,sum});
}
result.ToDictionary(x => x.Key,x => x.Value); //за да се изчисти по бързо паметта от стария речник и да не се товари системата при евентуална следваща манипулация на елементите ,които ще съществуват на две позиции в паметта,докато C# прецени кога да изтрие речник 1
Console.WriteLine("Plants for the exhibition:");
foreach (var item in result.OrderByDescending(x => x.Value[0]).ThenByDescending(x => x.Value[1]).ToDictionary(x => x.Key,x => x.Value))
{
Console.WriteLine($"- {item.Key}; Rarity: {(int)item.Value[0]}; Rating: {item.Value[1]:f2}");
}
}
}
}
- за отрицателните стойности също може да има проблем още при проверка на следващите команди (rarity),(rating)
double(rarity) ако присвоява отрицателна стойност това би трябвало да е грешка , съществува вероятност корекцията да важи и за double(rating)
ако double(rating) приема отрицателни стойности ,тогава листовете може да се напълнят с отрицателни стойности и проверката за(sum) се променя ако операциите за присвояване са валидни
if (sum != 0)
{
sum /= count;
}
- ако се иска да се отпечата "грешка" при отрицателна (sum) на всички(rating) от конкретен plants[plant] лист, когато while цикъла е завършил, тогава проверката за (sum) се променя в следващия цикъл за манипулация на данните sum >= 0 за да е валидна
- може да има и още проблеми с неправилен стринг ,който трябва да се сплитне по командите .Тогава трябва да се наблюдава дължината на последващия масив и съдържанието му за валидност ,което е необходимо за правилно последващо деклариране на променливите и следене за "error", затова задачата наистина може да е доста трудна и часовете да се изнижат
- в такъв случай по-добре да се използва Regex за проверка на валидност на стринга (input) чрез match.Sucses
задачата с регекс
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace regex_demos
{
class Program
{
static void Main(string[] args)
{
int n = int.Parse(Console.ReadLine());
Dictionary<string, List<double>> plants = new Dictionary<string, List<double> >();
for (int i = 0; i < n; i++)
{
string[] input = Console.ReadLine().Split("<->").ToArray();
string plant = input[0];
double rarity = double.Parse(input[1]);
if (!plants.ContainsKey(plant))
{
plants.Add(plant, new List<double>());
plants[plant].Add(rarity);
}
else
{
plants[plant][0] = rarity;
}
}
while (true)
{
string input = Console.ReadLine();
if (input == "Exhibition")
{
break;
}
Match command = Regex.Match(input, @"^([A-Z][a-z]{3,5}): (\w+)( - (\-?\d+))?$");
command.ToString();
if (!command.Success)
{
Console.WriteLine("error");
continue;
}
else
{
string validCommand = command.Groups[1].Value;
string plant = command.Groups[2].Value;
if (!plants.ContainsKey(plant))
{
Console.WriteLine("error");
continue;
}
if (validCommand == "Rate")
{
double rating = double.Parse(command.Groups[4].Value);
plants[plant].Add(rating);
}
else if (validCommand == "Update")
{
double rarity = double.Parse(command.Groups[4].Value);
plants[plant][0] = rarity;
}
else if (validCommand == "Reset")
{
plants[plant].RemoveRange(1, plants[plant].Count - 1);
}
else
{
Console.WriteLine("error");
}
}
}
foreach (var item in plants)
{
double rarity = item.Value[0];
item.Value.RemoveAt(0);
int count = item.Value.Count;
double sum = item.Value.Sum();
if (sum != 0)
{
sum /= count;
}
item.Value.Clear();
item.Value.Add(rarity);
item.Value.Add(sum);
}
Console.WriteLine("Plants for the exhibition:");
foreach (var item in plants.OrderByDescending(x => x.Value[0]).ThenByDescending(x => x.Value[1]).ToDictionary(x => x.Key,x => x.Value))
{
Console.WriteLine($"- {item.Key}; Rarity: {(int)item.Value[0]}; Rating: {item.Value[1]:f2}");
}
}
}
}
Много добро решение колега, аз не успях с тази задача. Една техническа грешка забелязах накрая:
във сортирания foreach трябва да сортираме result, а не plants.
Първа:https://pastebin.com/bWu5wei5
Втора:https://pastebin.com/U7cxu5j5
Няма judge затова незнам дали са на 100%
Ще реша и трета и ще едитна
А може ли от някъде да се видят условията на задачите?
100/100 03. Plant Discovery
https://pastebin.com/psZVpv7w
Здравейте! Аз имах особено затруднение с решението на 3та задача от днес. Поствам моето решение, с което получих 50/100. Много се чудих къде бъркам, но не успях да измисля нищо.
using System;
using System.Collections.Generic;
using System.Linq;
namespace Plant_Discovery
{
class Program
{
static void Main(string[] args)
{
Dictionary<string, Dictionary<string, List<double>>> plantsManager =
new Dictionary<string, Dictionary<string, List<double>>>();
int n = int.Parse(Console.ReadLine());
for (int i = 0; i < n; i++)
{
string[] input = Console.ReadLine()
.Split("<->", StringSplitOptions.RemoveEmptyEntries);
var plant = input[0];
var rarity = double.Parse(input[1]);
if (!plantsManager.ContainsKey(plant))
{
plantsManager.Add(plant, new Dictionary<string, List<double>>
{
{ "rarity", new List<double>() { rarity } },
{ "rating", new List<double>() }
});
}
else if (plantsManager.ContainsKey(plant))
{
plantsManager[plant]["rarity"][0] = rarity;
}
}
string command = Console.ReadLine();
while (command != "Exhibition")
{
var tokens = command.Split(": ");
var plantStats = tokens[1].Split(" - ");
var plant = plantStats[0];
if (tokens[0] == "Rate")
{
var rating = double.Parse(plantStats[1]);
plantsManager[plant]["rating"].Add(rating);
}
if (tokens[0] == "Update")
{
var newRarity = double.Parse(plantStats[1]);
plantsManager[plant]["rarity"][0] = newRarity;
}
if (tokens[0] == "Reset")
{
plantsManager[plant]["rating"].Clear();
}
command = Console.ReadLine();
}
var sorted = plantsManager.OrderByDescending(x => x.Value["rarity"][0])
.ThenByDescending(x => x.Value["rating"].Average());
Console.WriteLine("Plants for the exhibition:");
foreach (var plant in sorted)
{
if (plant.Value["rating"].Count > 0)
{
if (plant.Value["rating"].Count == 1)
{
Console.WriteLine($"- {plant.Key}; Rarity: {plant.Value["rarity"][0]:f0}; " +
$"Rating: {plant.Value["rating"][0]:f2}");
}
else
{
var averageRating = plant.Value["rating"].Average();
Console.WriteLine($"- {plant.Key}; Rarity: {plant.Value["rarity"][0]:f0}; " +
$"Rating: {averageRating:f2}");
}
}
else
{
Console.WriteLine($"- {plant.Key}; Rarity: {plant.Value["rarity"][0]:f0}; " +
$"Rating: 0.00");
}
}
}
}
}
Благодаря, Ankoun1, за отделеното време! След като разгледах внимателно решението ти установих, че проблемът при мен не е от незнание как да напиша кода за решението, а в това че не съм разбрала условието и всичките тези термини rarity, rating, кое какво е, са ме объркали тотално какво точно се изисква.
- за отрицателните стойности също може да има проблем още при проверка на следващите команди (rarity),(rating)
double(rarity) ако присвоява отрицателна стойност това би трябвало да е грешка , съществува вероятност корекцията да важи и за double(rating)
ако double(rating) приема отрицателни стойности ,тогава листовете може да се напълнят с отрицателни стойности и проверката за(sum) се променя ако операциите за присвояване са валидни
if (sum != 0) ако са невалидни още преди тази проверка трябва да се направи друга проверка за (sum)
{
sum /= count;
}
ако се иска да се отпечата "грешка" при отрицателна (sum) на всички(rating) от конкретен plants[plant] лист, когато while цикъла е завършил, тогава проверката за (sum) се променя в следващия цикъл за манипулация на данните sum >= 0 за да е валидна
- може да има и още проблеми с неправилен стринг ,който трябва да се сплитне по командите .Тогава трябва да се наблюдава дължината на последващия масив и съдържанието му за валидност ,което е необходимо за правилно последващо деклариране на променливите и следене за "error", затова задачата наистина може да е доста трудна и часовете да се изнижат