Joro_Paspalev 23 Точки

## 2. Race C# - Задача от Exercise: Regular Expressions

Здравейте, колеги,

задачата я решавам и Judge ми връща 100/100, но искам да попитам дали има някакъв "по-културен" начин за принтиране на топ 3 състезателите, без да използвам три пъти if и counter?

Ето го условието

Write a program that processes information about a race.

On the first line you will be given list of participants separated by ", ".

On the next few lines until you receive a line "end of race" you will be given some info which will be some alphanumeric characters. In between them you could have some extra characters which you should ignore. For example: "G!32e%o7r#32g\$235@!2e". The letters are the name of the person and the sum of the digits is the distance he ran. So here we have George who ran 29 km.

Store the information about the person only if the list of racers contains the name of the person. If you receive the same person more than once just add the distance to his old distance. At the end print the top 3 racers ordered by distance in descending in the format:

"1st place: {first racer}

2nd place: {second racer}

3rd place: {third racer}"

 Input Output Comment George, Peter, Bill, Tom G4e@55or%6g6!68e!!@ R1@!3a\$y4456@ B5@i@#123ll G@e54o\$r6ge# 7P%et^#e5346r T\$o553m&6 end of race 1st place: George 2nd place: Peter 3rd place: Tom On the 3rd input line we have Ray. He is not in the list, so we do not count his result. The other ones are valid. George has total of 55 km, Peter has 25 and Tom has 19. We do not print Bill because he is on 4th place.

Ето го и моя код: https://pastebin.com/94dSEqEG

Благодаря!

Тагове:
0
knoteva 1081 Точки

Здравей,

Аз съм го направила така:

var result = dict.OrderByDescending(x => x.Value).Take(3);

int count = 1;

foreach (var item in result)
{
string place = count == 1 ? "st" : count == 2 ? "nd" : "rd";
Console.WriteLine(\$"{count}{place} place: {item.Key}");
count++;
}

1
knoteva 1081 Точки

Без каунт може да се направи във фор цикъл:

var result = dict.OrderByDescending(x => x.Value).Take(3).ToList();

for (int i = 1; i <= result.Count; i++) // или i <= 3. Take(3) става излишен
{
string place = i == 1 ? "st" : i == 2 ? "nd" : "rd";
Console.WriteLine(\$"{i}{place} place: {result[i - 1].Key}");
}

0
29/07/2019 08:53:55
Iv_Konov 383 Точки

Здравей,

.. и един алтернативен вариант:

===

dict =  dict.OrderByDescending(kvp => kvp.Value).ToDictionary(kvp => kvp.Key, kvp => kvp.Value);

Console.WriteLine(\$"1st place: {dict.Keys.ElementAt(0)}");
Console.WriteLine(\$"2nd place: {dict.Keys.ElementAt(1)}");
Console.WriteLine(\$"3rd place: {dict.Keys.ElementAt(2)}");

===

Поздрави,

Иван

0
Joro_Paspalev 23 Точки

Здравей, Иван,

този израз не съм го виждал -  {dict.Keys.ElementAt(0)} и незнам какво прави затова ще питам?

Предполагам, че с него мога да достъпя директно елементите по индекс както при масивите, само че се използва за речници!

И си е стандартен синтаксис -.Keys // .ElementAt(index)?

Така ли е?

Поздрави,

0
Iv_Konov 383 Точки

Здравей,

Да, точно..., но по-скоро е метод към System.Linq, а не специално за речниците - работи и при масиви/листове. Наистина, нямаше го в курса - вероятно защото няма голямо приложение... или знанията са ми малко и не знам къде другаде може да се  ползва удобно.

Аз съм си го търсил този метод - очаквах, че трябва да има вариант при речниците да достъпиш елемент (Key/Value) по номер на индекс - не помня дали беше от нет-а или форума. Вероятно е било точно за тази задача... Бях намерил и други "странни"  решения във форума - принтираш .First(), триеш го, принтираш отново .First() и продължаваш по същия начин.

А относно четене - примерно VS/F12 казва:

"Returns the element at a specified index in a sequence."

или от нет-а:

https://stackoverflow.com/questions/4227/accessing-a-dictionary-keys-key-through-a-numeric-index

Разбира се, съкратеният запис на if-else-if е много готоно приложение точно в тази задача...

Ползваш, това което ти е лесно и удобно.

Поздрави,

Иван :)

0
Joro_Paspalev 23 Точки

Много благодаря,

отивам да тествам че изпита иде :)

Поздрави,

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.