✍️ پروژه را از شکل داده شروع میکنیم. هر شرکتکننده یک رکورد دیکشنری دارد: name نام، solved تعداد مسئلههای حلشده و penalty جریمه زمانی است. اسم کلیدها بخشی از قرارداد است؛ score از بخش قبلی اینجا استفاده نمیشود. در این گام هنوز رتبهبندی نداریم و فقط باید مطمئن شویم داده مورد نیاز را درست میخوانیم.
مثلاً رکورد {'name':'مینا','solved':3,'penalty':90} یعنی مینا سه مسئله را حل کرده و جریمهاش نود است. اگر کنار آن رکورد آراد با صفر حل باشد، خلاصه ما همچنان هر دو را به ترتیب ورودی نگه میدارد. صفر بودن تعداد حل به معنی حذف شرکتکننده نیست.
تابع ناقص، فهرست خلاصههای [name,solved] را میسازد؛ فقط فیلدهای لازم را استخراج کن و به خروجی اضافه کن. رکورد اصلی را با pop یا حذف کلید تغییر نده، چون در مرحله بعد جریمه هم لازم میشود. خطای رایج، برگرداندن فقط شرکتکنندههای دارای حل یا استفاده از نام کلیدهای تمرین قبلی است. این قدم کوچک، مرز بین آمادهسازی داده و تصمیم رتبهبندی را روشن میکند و آزمون مستقل خودش را دارد.
تابع آماده course_check فقط برای ارزیابی است: تابع اصلی را صدا میزند و حفظ ورودی را بررسی میکند. آن را تغییر نده؛ پاسخ تو همان تابع خواستهشده است.
فعالیت شما
تابع player_summaries(players) فهرست دیکشنریهای دارای name رشته، solved عدد صحیح نامنفی و penalty عدد صحیح نامنفی میگیرد؛ خروجی فهرست [name,solved] برای تکتک رکوردها با ترتیب اصلی است. فعلاً مرتب نکن و هیچ رکوردی، حتی solved=0، را حذف نکن. خالی [] و تکعضوی یک خلاصه میدهد؛ [{'name':'مینا','solved':3,'penalty':90}] به [['مینا',3]] تبدیل شود. ورودی و رکوردها تغییر نکنند. تابع آماده course_check فقط برای ارزیابی است: تابع اصلی را صدا میزند و حفظ ورودی را بررسی میکند. آن را تغییر نده؛ پاسخ تو همان تابع خواستهشده است.