Loading...
zh.yordanova avatar zh.yordanova 8 Точки

10. *SoftUni Exam Results

Здравейте, колеги. Имам нужда от помощ. Подходих малко усложнено към задачата, създавайки речник в речника. Проблемът е, че не успявам да намеря начин как да направя последната си сортировка, която трябва да преброи, колко пъти всеки език е бил подаден. Ще съм много благодарна ако ми помогнете да намеря правилното решение. 

Условие на задачата: https://pastebin.com/QbBYYxPJ

Линк към Judge: https://judge.softuni.bg/Contests/Compete/Index/1737#9

Моето решение: https://pastebin.com/iVVD7AxZ

 

Много благодаря на всеки, които отдели от времето си и погледне кода ми.

Тагове:
0
Python Fundamentals
MartinBG avatar MartinBG 4803 Точки

Структурата, която използвате (речник в речника) е подходяща за първата част от задачата, но за втораа (сорирането на изпити по брой събмити) не е приложима, защото не пазите броя събмити (един човек може да има повече от един събмит за даден изпит) към всеки изпит, а само най-високия резултат за всеки човек.

Най-лесно ще е просто да добавите още един речник, в който да пазите изпититие и броя събмити към всеки.

Пишете, ако не успеете да го направите и по-късно ше кача решение.

 

ПП

Грешката, която ви дава е заради знакa - пред x[1]['language'] -  той може да се използва за обръщане на сортировката на числа, но не и за стрингове или други структури. За тези цели има параметър reverse=reverse към sort

0
22/11/2020 15:16:35
zh.yordanova avatar zh.yordanova 8 Точки

Здравейте MartinBG. Благодаря, че отново погледнахте кода ми и отделихте от свободното си време за да отговорите на въпросът ми. Принципно видях решение на задачата, която създава два отделни речника, единият от които е 'language', и пази подадения език като key и самият код автоматично пресмята, колко пъти той се появява като value.

Просто ми беше интересно дали има начин и при моето решение, което да пресмята и сортира. 

Премахна знака - както ми казахте, но видях че кода минава през целия речник, заедно с вложения речник и не може или аз поне не успях да го накарам да пресметне събмитите.

0
MartinBG avatar MartinBG 4803 Точки

@zh.yordanova

Както писах и по-горе, няма как да се извлече броя събмити към всеки език от речника, тъй като той не съдържа тази информация.

Може да добавите нов ключ във вложения речник, който да пази събмитите на човека за езика и да го използвате за втората част на задачата, но - според мен, това е ненужно усложнение. От друга страна, изглежда като добро упражнение за работа с вложени речници ;)

0
Fenrir07 avatar Fenrir07 0 Точки

Привет! Дали бихте могли да разгледаде и моя случай. Получавам 90/100, а наистина не стигам до проблема. Благодаря предварително!
Линк: https://pastebin.com/HZRJSm6g

0
dobys avatar dobys 1 Точки

Python Fundamentals , решение 100/100

Dictionaries - Exercise, 12. SoftUni Exam Results, Линк: https://pastebin.com/5UU5mUe5

0
21/11/2023 19:51:04
valerielashvili avatar valerielashvili 41 Точки

Ако все пак някой иска да види как тази задача се решава с вложени речници и лист със всичките оценки на ученика предлагам решението по-долу:

from typing import Tuple


def split_input(input_ln: str) -> Tuple[str, str, int | None]:
    """Split user input and cast 'score' to int if provided."""
    tokens = input_ln.split('-') + [None]
    user, lang, score = tokens[:3]
    if lang != 'banned':
        score = int(tokens[2])
    return user, lang, score


def submit_result(user: str, lang: str, score: int, results: dict) -> dict:
    """Save user submissions with their points."""
    if lang not in results.keys():
        results[lang] = {user: [score]}
    elif user not in results[lang].keys():
        results[lang].update({user: [score]})
    else:
        results[lang][user].append(score)
    return results


def ban_user(user: str, results: dict) -> dict:
    """Set the ban flag if received."""
    for lang in results.keys():
        if user in results[lang]:
            results[lang][user].append('ban')
    return results


def format_results(results: dict) -> str:
    """Format exam results by pupil."""
    output = "Results:\n"
    for user in results.values():
        for name, scores in user.items():
            if scores[-1] != 'ban':
                output += f"{name} | {max(scores)}\n"
    return output


def format_submissions(results: dict) -> str:
    """Format total submissions by language"""
    output = "Submissions:\n"
    for lang in results.keys():
        nested_cnt = sum(
            1 for scores in results[lang].values()
            for score in scores
            if score != 'ban'
            if isinstance(scores, list)
        )
        output += f"{lang} - {nested_cnt}\n"
    return output


exam_results = {}

while (line := input()) != 'exam finished':
    username, language, points = split_input(line)

    if language == 'banned':
        exam_results = ban_user(username, exam_results)
    else:
        exam_results = submit_result(username, language, points, exam_results)

exam_stats = format_results(exam_results) + format_submissions(exam_results)
print(exam_stats)

Също така искам да обърна вниманието на администрацията, че тази формулировка от условието е много объркваща: If a student has two or more submissions for the same language, save only his maximum points. Само от примерите за изхода става ясно, че трябва да се пазят всичките оценки.

Има и още една неяснота в условието, как трябва да форматираме изхода в случая ако един и същи ученик има два положени изпита? Тоест получава две оценки за два различни програмни езика. Ще взема втория примерен вход и само ще махна командата за бан на Кати:

Peter-Java-91
George-C#-84
Katy-Java-90
Katy-C#-50
exam finished

При този вход изходът е следния:

Results:
Peter | 91
Katy | 90
George | 84
Katy | 50
Submissions:
Java - 2
C# - 2

Както виждаме принтираме и двете оценки на Кати защото те са от двата различни изпита. Щом решението дава 100/100 точки или точно това се очаква, или пък този случай не е предвиден. Липсата на конкретни изисквания може да доведе до големи мъки. :)

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