حالا قرارداد کامل جدول مسابقه را در یک تابع مستقل جمع میکنیم. داده از بیرون آماده است؛ مسئولیت تابع، خواندن رکوردها، تعیین ترتیب و تحویل نامهاست. قانون اول تعداد حل بیشتر، قانون دوم جریمه کمتر و قانون سوم حفظ ترتیب ورود در تساوی کامل است. نام افراد معیار رتبهبندی نیست و نباید برای شکستن تساوی استفاده شود.
مثلاً بهترتیب ورود داریم: رها با سه حل و جریمه چهل، علی با چهار حل و جریمه نود، و سارا با سه حل و جریمه بیست. جدول نهایی علی، سارا، رها است. اگر نفر چهارم با همان آمار سارا اضافه شود، بعد از سارا میآید چون دیرتر وارد شده است. اصل فهرست و دیکشنریها باید برای نمایش ترتیب ثبت باقی بمانند.
در این گام تابعهای قبلی حاضر نیستند؛ تمام کد لازم را همینجا بنویس. خروجی همه نامها را میخواهیم، نه فقط چند نفر اول؛ برای نمایش سه نفر اول میتوان بعداً از rank_players(players)[:3] استفاده کرد. خطای رایج، تغییر ورودی با sort، افزودن نام به کلید یا نزولی کردن جریمه است. پیش از ثبت پاسخ، خالی، تکعضوی، همهبرابر و یک نمونه با هر دو معیار متفاوت را بررسی کن. ✍️ تابع کوچک است، ولی قرارداد دقیقش کیفیت راهحل را تعیین میکند.
تابع آماده course_check فقط برای ارزیابی است: تابع اصلی را صدا میزند و حفظ ورودی را بررسی میکند. آن را تغییر نده؛ پاسخ تو همان تابع خواستهشده است.
فعالیت شما
تابع مستقل rank_players(players) بنویس. players فهرست دیکشنریهای دارای name رشته و solved و penalty عدد صحیح نامنفی است؛ نامها ممکن است فارسی یا تکراری باشند و همه رکوردها باید در خروجی بمانند. خروجی فقط فهرست نامهاست: solved نزولی، سپس penalty صعودی؛ اگر هر دو برابرند، ترتیب اولیه همان رکوردها حفظ شود و نام معیار سوم نباشد. خالی []، تکعضوی همان نام، همهبرابر همان ترتیب ورود و solved/penalty صفر معتبرند. فهرست و خود دیکشنریهای ورودی را تغییر نده. برای رها:(3,40)، علی:(4,90)، سارا:(3,20)، خروجی ['علی','سارا','رها'] است. همه نامها را برگردان؛ نمایش برترینها میتواند با برش نتیجه انجام شود. تابع آماده course_check فقط برای ارزیابی است: تابع اصلی را صدا میزند و حفظ ورودی را بررسی میکند. آن را تغییر نده؛ پاسخ تو همان تابع خواستهشده است.