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

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

مسیر وراثت


فرض کنید که در یک فایل پایتون چند کلاس وجود دارد و به مجموعه کل آن‌ کلاس‌ها SS می‌گوییم. گراف جهت دار GG را از روی مجموعه SS به این شکل می‌سازیم که راس vv به راس uu یال دارد اگر و فقط اگر کلاس vv از کلاس uu به صورت مستقیم ارث برده باشد. برای مثال به کد زیر دقت کنید:

class A:
    def f(self, a, b):
        return a + b

class B(A):
    def g(self, a):
        return a*10

class C(A):
    def g(self, a):
        return a**2

class D(C, B):
    pass
Python

گراف کلاس‌های بالا:

مثل

در این مثال BB و CC از AA ارث برده‌است و کلاس DD هم از کلاس CC و BB ارث برده است.

حال کد زیر را در نظر بگیرید

d = D()
print(d.f(10, 20)) # 30
Python

کلاس C و B تابع f را از کلاس A به ارث برده‌اند و کلاس D این تابع را از این دو کلاس به ارث برده‌است. پس دو مسیر D-B-A و D-C-A برای صدا شدن تابع f قابل تصور است که در این سوال (مانند قانون خود مفسر پایتون) در ارث‌بری کلاسی که زودتر (چپ‌تر در پرانتز جلوی تعریف کلاس) نوشته شده را مقدم در نظر می‌گیریم. یعنی مسیر D-C-A را برای d.f در نظر می‌گیریم.

در کد زیر برای مثال:

d = D()
print(d.g(20)) # 400
Python

در اینجا تابع g هم در کلاس B و هم در کلاس C وجود دارد ولی طبق مفسر پایتون، مسیر مورد نظر در این سوال مسیر D-C برای d.g است.

حال لیست کلاس‌ها در اختیار شما قرار می‌گیرد و شما باید با ایجاد تغییراتی در کلاس‌ها شرایطی را ایجاد کنید که با صدا کردن هر تابع. مسیر صدا شدن آن تابع در شی کلاس Record که به شما ورودی داده می‌شود ذخیره شود.

این کار در قالب یک تابع به نام rearrange(ls, rec) باید صورت بگیرد که ls لیست کلاس‌هاست و rec آن شی مورد نظر از کلاس Record هست که باید مسیرها در آن ذخیره شود.

  • تضمین می‌شود قبل از صدا کردن هر تابع مسیر rec خالی شود.
  • تضمین می‌شود هیچ کلاسی از دو کلاسی که از هم ارث برده‌اند به صورت مستقیم ارث نبرد.
  • تضمین می‌شود هیچ کلاسی از کلاسی بیرون از لیست داده شده جز object ارث نبرد.
  • دقت کنید که ممکن است توابع تعریف شده همدیگر را صدا کنند. (و این جزو مسیر به شمار نمی‌آید)

برای درک بهتر به کد زیر و خروجی آن دقت کنید.

from record import Record
from solution import rearrange # your implemented function

class A:
    def f(self, a, b):
        return a + b

class B(A):
    def g(self, a):
        return a*10

class C(A):
    def g(self, a):
        return a**2

class D(C, B):
    pass

rec = Record()
rearrange([A, B, C, D], rec)
d = D()
print(d.f(10, 20))
print(rec.get_path_list())
Python

خروجی کد بالا:

30
[<class '__main__.D'>, <class '__main__.C'>, <class '__main__.A'>]
Plain text

کلاس Record:🔗

کد این کلاس در این لینک قرار دارد. (لازم نیست این فایل را همراه راه‌حل ارسال کنید)

این کلاس در کنار فایل ارسالی شما قرار می‌گیرد و شما می‌توانید آن را import کنید. این کلاس دارای سه تابع زیر است.

  • تابع add_node(node): این تابع یک عضو گرفته (که در این سوال باید یک کلاس باشد) و آن را به لیست مسیر اضافه می‌کند.
  • تابع get_path_list(): این تابع لیست مسیر را خروجی می‌دهد.
  • تابع refresh(): این تابع مسیر ذخیره شده را خالی می‌کند.

تابع rearrange(ls, record) را در فایل solution.py پیاده سازی کنید و فایل solution.py را زیپ کرده و ارسال کنید.

نمره‌دهی:🔗

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

ارسال پاسخ برای این سؤال
در حال حاضر شما دسترسی ندارید.