راه
۷ کیو· سادهمبتدیPYTHON۴ ثانیه · ۲۵۶ مگابایت

پیشنهاد موسیقی

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


📊 داده‌ها

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

ورودی‌ها:

  • نام کاربری (username)
  • سن (age)
  • شهر سکونت (city)
  • لیستی از نام آلبوم‌های خریداری‌شده (albums)
  • اطلاعات همه‌ی کاربران (all_users)

این تابع باید کاربر جدید را به اطلاعات همه‌ی کاربران (all_users) اضافه کند و خروجی‌ای ندارد. به این منظور می‌توانید هر ساختار دلخواه خود را در نظر بگیرید. ساختار all_users در داوری بررسی نخواهد شد.

ورودی‌ها:

  • نام آلبوم (name)
  • نام خواننده (artist)
  • سبک آلبوم (genre)
  • تعداد آهنگ‌های آلبوم (tracks)
  • اطلاعات همه‌ی آلبوم‌ها (all_albums)

این تابع باید آلبوم جدید را به اطلاعات همه‌ی آلبوم‌ها (all_albums) اضافه کند و خروجی‌ای ندارد. به این منظور می‌توانید هر ساختار دلخواه خود را در نظر بگیرید. ساختار all_albums در داوری بررسی نخواهد شد.


📥 درخواست‌ها

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

ورودی‌ها:

  • نام کاربری (username)
  • نام خواننده (artist)
  • اطلاعات همه‌ی کاربران (all_users)
  • اطلاعات همه‌ی آلبوم‌ها (all_albums)

خروجی: تعداد آهنگ‌های خریداری‌شده توسط کاربر با نام کاربری username از خواننده با نام artist.

ورودی‌ها:

  • نام کاربری (username)
  • سبک آلبوم (genre)
  • اطلاعات همه‌ی کاربران (all_users)
  • اطلاعات همه‌ی آلبوم‌ها (all_albums)

خروجی: تعداد آهنگ‌های خریداری‌شده توسط کاربر با نام کاربری username از سبک genre.

ورودی‌ها:

  • سن کاربر (age)
  • نام خواننده (artist)
  • اطلاعات همه‌ی کاربران (all_users)
  • اطلاعات همه‌ی آلبوم‌ها (all_albums)

خروجی: مجموع تعداد آهنگ‌های خریداری‌شده توسط کاربران با سن age از خواننده با نام artist.

ورودی‌ها:

  • سن کاربر (age)
  • سبک آلبوم (genre)
  • اطلاعات همه‌ی کاربران (all_users)
  • اطلاعات همه‌ی آلبوم‌ها (all_albums)

خروجی: مجموع تعداد آهنگ‌های خریداری‌شده توسط کاربران با سن age از سبک genre.

ورودی‌ها:

  • شهر سکونت کاربر (city)
  • نام خواننده (artist)
  • اطلاعات همه‌ی کاربران (all_users)
  • اطلاعات همه‌ی آلبوم‌ها (all_albums)

خروجی: مجموع تعداد آهنگ‌های خریداری‌شده توسط کاربران ساکن شهر city از خواننده با نام artist.

ورودی‌ها:

  • شهر سکونت کاربر (city)
  • سبک آلبوم (genre)
  • اطلاعات همه‌ی کاربران (all_users)
  • اطلاعات همه‌ی آلبوم‌ها (all_albums)

خروجی: مجموع تعداد آهنگ‌های خریداری‌شده توسط کاربران ساکن شهر city از سبک genre.


🎯 نمونه

تست ۱

text
>>> add_user("SAliB", 19, "Tehran", ["tekunbede", "barf", "gavazn"], all_users)
>>> add_user("Saeid", 22, "Esfehan", ["eclipse", "barf", "gavazn"], all_users)
>>> add_album("eclipse", "malmsteen", "classic", 10, all_albums)
>>> add_album("barf", "beeptunes", "pop", 22, all_albums)
>>> add_album("tekunbede", "beeptunes", "pop", 14, all_albums)
>>> add_album("gavazn", "sorena", "persian", 18, all_albums)
>>> add_user("Ali", 12, "Bushehr", ["bidad", "blaze"], all_users)
>>> add_album("bidad", "shajarian", "classic", 10, all_albums)
>>> add_album("blaze", "ghorbani", "pop", 9, all_albums)
>>> query_user_artist("Ali", "ghorbani", all_users, all_albums)
9
>>> query_user_genre("Ali", "classic", all_users, all_albums)
10
>>> query_age_artist(12, "shajarian", all_users, all_albums)
10
>>> query_age_genre(12, "pop", all_users, all_albums)
9
>>> query_city_artist("Bushehr", "ghorbani", all_users, all_albums)
9
>>> query_city_genre("Bushehr", "pop", all_users, all_albums)
9

تست ۲

text
>>> add_user("SAliB", 19, "Tehran", ["tekunbede", "barf", "gavazn"], all_users)
>>> add_user("Saeid", 22, "Esfehan", ["eclipse", "barf", "gavazn"], all_users)
>>> add_album("eclipse", "malmsteen", "classic", 10, all_albums)
>>> add_album("barf", "beeptunes", "pop", 22, all_albums)
>>> add_album("tekunbede", "beeptunes", "pop", 14, all_albums)
>>> add_album("gavazn", "sorena", "persian", 18, all_albums)
>>> add_user("Ali", 12, "Bushehr", ["bidad", "blaze"], all_users)
>>> add_album("bidad", "shajarian", "classic", 10, all_albums)
>>> add_album("blaze", "ghorbani", "pop", 9, all_albums)
>>> query_user_artist("SAliB", "sorena", all_users, all_albums)
18
>>> query_user_artist("SAliB", "beeptunes", all_users, all_albums)
36
>>> query_user_genre("SAliB", "pop", all_users, all_albums)
36
>>> query_age_artist(22, "malmsteen", all_users, all_albums)
10
>>> query_age_genre(19, "pop", all_users, all_albums)
36
>>> query_city_artist("Tehran", "sorena", all_users, all_albums)
18
>>> query_city_genre("Tehran", "pop", all_users, all_albums)
36

💡 چالش‌های حل تمرین

💡 چه ساختاری باید برای all_users و all_albums انتخاب شود؟

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

پیشنهاد ما این است که ساختار این دو متغیر را به شکل دیکشنری حفظ کنید. برای مثال، all_users می‌تواند یک دیکشنری شامل تمام کاربران باشد. کلیدهای این دیکشنری، نام کاربری (username) افراد و مقادیر این دیکشنری، خود یک دیکشنری شامل دیگر اطلاعات کاربر است.

مشابه این ساختار را می‌توانید برای all_albums نیز در نظر بگیرید به طوری که کلیدهای آن، نام هر آلبوم و مقادیر آن، دیگر اطلاعات هر آلبوم باشند.

python
all_users = {
    "taha": {
        "age": 22,
        "city": "Tehran",
        "albums": ["Asabani", "Gavazn"]
    },
    "helia": {
        "age": 21,
        "city": "Tehran",
        "albums": ["Amadebash"]
    },
}

⚠️ پاسخ درست است اما تست‌ها را پاس نمی‌کند.

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

در صورتی که ساختار اطلاعات را مطابق پیشنهاد ما پیاده‌سازی کرده باشید و هم‌چنین حلقه‌های for درون هر تابع را به‌درستی نوشته باشید، نیازی به شمردن تعداد دفعات خرید یک آلبوم توسط کاربر نیست و این تعداد خودبه‌خود در محاسبات شما در نظر گرفته می‌شود. اگر نیاز به تابع count() پیدا کردید، احتمالاً حلقه‌های for شما به‌صورت بهینه نوشته نشده‌اند؛ هرچند پاسخ درست باشد.

💡 چرا در تمام توابع، ورودی‌های all_users و all_albums وجود دارند؟

این دو متغیر را علی‌رغم global بودن به تمام توابع ورودی داده‌ایم تا در صورت هر گونه تغییر، در هنگام داوری مشکلی ایجاد نشود. نیازی نیست در تمام توابع از هردوی این متغیرها استفاده شود.


💡 راهنمایی نهایی

ساختار پیشنهادی برای all_users و all_albums:

python
all_users = {}
all_albums = {}

# add_user
all_users[username] = {
    "age": age,
    "city": city,
    "albums": albums
}

# add_album
all_albums[name] = {
    "artist": artist,
    "genre": genre,
    "tracks": tracks
}

نمونه‌ی پیاده‌سازی یک تابع query:

python
def query_user_artist(username, artist, all_users, all_albums):
    total_tracks = 0
    for album in all_users[username]["albums"]:
        if all_albums[album]["artist"] == artist:
            total_tracks += all_albums[album]["tracks"]
    return total_tracks

✅ این تمرین را در ویرایشگر خود پیاده‌سازی کنید. به یاد داشته باشید که ساختار all_users و all_albums در داوری بررسی نمی‌شود و فقط خروجی توابع query بررسی می‌شود.

نمونه‌ها

ورودی نمونه ۱
add_user("SAliB", 19, "Tehran", ["tekunbede", "barf", "gavazn"], all_users)
add_user("Saeid", 22, "Esfehan", ["eclipse", "barf", "gavazn"], all_users)
add_album("eclipse", "malmsteen", "classic", 10, all_albums)
add_album("barf", "beeptunes", "pop", 22, all_albums)
add_album("tekunbede", "beeptunes", "pop", 14, all_albums)
add_album("gavazn", "sorena", "persian", 18, all_albums)
add_user("Ali", 12, "Bushehr", ["bidad", "blaze"], all_users)
add_album("bidad", "shajarian", "classic", 10, all_albums)
add_album("blaze", "ghorbani", "pop", 9, all_albums)
query_user_artist("Ali", "ghorbani", all_users, all_albums)
query_user_genre("Ali", "classic", all_users, all_albums)
query_age_artist(12, "shajarian", all_users, all_albums)
query_age_genre(12, "pop", all_users, all_albums)
query_city_artist("Bushehr", "ghorbani", all_users, all_albums)
query_city_genre("Bushehr", "pop", all_users, all_albums)
خروجی نمونه ۱
9
10
10
9
9
9
ورودی نمونه ۲
add_user("SAliB", 19, "Tehran", ["tekunbede", "barf", "gavazn"], all_users)
add_user("Saeid", 22, "Esfehan", ["eclipse", "barf", "gavazn"], all_users)
add_album("eclipse", "malmsteen", "classic", 10, all_albums)
add_album("barf", "beeptunes", "pop", 22, all_albums)
add_album("tekunbede", "beeptunes", "pop", 14, all_albums)
add_album("gavazn", "sorena", "persian", 18, all_albums)
add_user("Ali", 12, "Bushehr", ["bidad", "blaze"], all_users)
add_album("bidad", "shajarian", "classic", 10, all_albums)
add_album("blaze", "ghorbani", "pop", 9, all_albums)
query_user_artist("SAliB", "sorena", all_users, all_albums)
query_user_artist("SAliB", "beeptunes", all_users, all_albums)
query_user_genre("SAliB", "pop", all_users, all_albums)
query_age_artist(22, "malmsteen", all_users, all_albums)
query_age_genre(19, "pop", all_users, all_albums)
query_city_artist("Tehran", "sorena", all_users, all_albums)
query_city_genre("Tehran", "pop", all_users, all_albums)
خروجی نمونه ۲
18
36
36
10
36
18
36

برای نوشتن پاسخ و دریافت امتیاز، ابتدا وارد حساب شوید.

ورود