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
valerielashvili avatar valerielashvili 38 Точки

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

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