حالت آفلاین — محتوا از حافظهٔ کش نمایش داده می‌شود
آموزش الگوریتم و حل مسئله با پایتون؛ تمرین عملی

رفع باگ جریمه مسابقه در مرتب‌سازی دو معیاره پایتون

پروژه رتبه‌بندی مسابقه با پایتون؛ جدول نتیجه بدون تغییر ورودی · 0٪

✍️ حالا قانون دوم را اضافه می‌کنیم: بین کسانی که تعداد حل یکسان دارند، جریمه کمتر بهتر است. معنی این قانون «اول جریمه» نیست؛ فقط تساوی تعداد حل را می‌شکند. بنابراین کلید باید اول تعداد حل با جهت نزولی و سپس جریمه با جهت صعودی را داشته باشد.

مثلاً آوا با پنج حل و جریمه صد از بهرام با چهار حل و جریمه ده جلوتر است. بین بهرام و سحر که هر دو چهار حل دارند، اگر جریمه سحر پنج باشد، سحر زودتر قرار می‌گیرد. پس نتیجه آوا، سحر، بهرام خواهد بود. یک آزمون خوب باید هم تفاوت تعداد حل و هم تساوی آن را داشته باشد.

کد اولیه هر دو جزء تاپل را منفی کرده و عملاً جریمه بزرگ‌تر را بهتر می‌داند. جهت معیار دوم را اصلاح کن. اگر هر دو فیلد برابر باشند، ترتیب ورودی حفظ می‌شود؛ نام را وارد کلید نکن. خطای رایج، استفاده از reverse=True برای تمام تاپل یا جابه‌جا کردن ترتیب دو فیلد است. این تمرین خروجی نام‌ها را می‌خواهد و داده ورودی باید برای نمایش یا آزمون دوباره دست‌نخورده بماند.

تابع آماده course_check فقط برای ارزیابی است: تابع اصلی را صدا می‌زند و حفظ ورودی را بررسی می‌کند. آن را تغییر نده؛ پاسخ تو همان تابع خواسته‌شده است.

فعالیت شما

تابع rank_by_penalty(players) رکوردهای name رشته و solved/penalty صحیح نامنفی می‌گیرد؛ نام‌ها با solved نزولی و فقط در تساوی با penalty صعودی مرتب شوند. تساوی هر دو معیار ترتیب ورودی را حفظ کند. خالی []، تک‌عضوی همان نام، صفرها معتبر. برای A:(5,100)، B:(4,10)، C:(4,5) خروجی ['A','C','B'] است. ورودی و رکوردها تغییر نکنند. تابع آماده course_check فقط برای ارزیابی است: تابع اصلی را صدا می‌زند و حفظ ورودی را بررسی می‌کند. آن را تغییر نده؛ پاسخ تو همان تابع خواسته‌شده است.

مطالعهٔ این گام برای همه آزاد است

برای پاسخ‌دادن، بررسی پاسخ، ثبت پیشرفت و استفاده از دستیار باید شرایط شرکت در فعالیت‌ها را داشته باشید.

برای انجام فعالیت وارد شوید

برای انجام فعالیت‌ها ابتدا این دوره‌های پیش‌نیاز را تکمیل کنید:

کد اولیهٔ فعالیت

def rank_by_penalty(players):
    ordered = sorted(players, key=lambda p: (-p['solved'], -p['penalty']))
    return [p['name'] for p in ordered]

# این تابع آماده فقط برای ارزیابی است؛ آن را تغییر نده.
def course_check(*args):
    from copy import deepcopy
    before = deepcopy(args)
    result = rank_by_penalty(*args)
    if args != before:
        raise ValueError('ورودی نباید تغییر کند.')
    return result