مسائل

سلة مشتريات

لديك قائمة بالفواكه وأسعارها.

ولديك سلة مشتريات تريد أن تحسب مجموعها.

fruits = ["apple", "banana", "orange"]
prices = [    1.5,      2.0,      1.0]

اكتب فعلاً يحسب مجموع السلة:

def calculate_total_price(shopping_list: list[str]) -> float:
    """Calculate the total price of the shopping list."""
    pass

الاختبار:

assert calculate_total_price(["apple", "apple", "apple"]) == 4.5
assert calculate_total_price(["banana", "apple"]) == 3.5
assert calculate_total_price([]) == 0.0

متوسط المبيعات اليومية

daily_sales = [
    10, 12, 10, 15, 13, 14, 10,
    19, 14, 12, 8, 10, 11, 12,
    14, 15, 14, 14, 10, 5, 13,
    8, 20, 19, 15, 14, 13, 12,
]

احسب ما يلي:

  • عدد الأيام
    • يمكنك استعمال الفعل len()
  • مجموع المبيعات لكل أسبوع على حدة
    • يمكنك استعمال الفعل sum() واستعمال الإشارة بقطعة [:7] للأسبوع الأول
  • متوسط المبيعات لكل أسبوع على حدة والانحراف المعياري
    • يمكنك استعمال الفعل statistics.mean() و statistics.stdev()
  • متوسط المبيعات خلال الشهر والانحراف المعياري

ضرب متجهين

يوصف ضرب المتجهين بالصيغة:

\[ \vec{u} \cdot \vec{v} = \sum_{i=1}^{n} u_i v_i \]

أي أن كل عنصر من المتجه الأول يضرب في العنصر المناظر له في المتجه الثاني، ويُجْمَعُ ناتج ذلك كله.

def dot_product(v: list[float], u: list[float]) -> float:
    """Calculate the dot product of two vectors."""
    pass

الاختبار:

assert dot_product([1, 2, 3], [4, 5, 6]) == 32
assert dot_product([1, 2, 3], [1, 2, 3]) == 14

توزيع الفرق

بحسب حجم المجموعة

لديك قائمة من الأسماء وتريد توزيعها إلى مجموعات حيث group_size هو حجم المجموعة الواحدة:

def make_groups_by_size(items: list[str], group_size: int) -> list[list[str]]:
    pass

افترض أن هذه القائمة التي لديك:

Ahmad
Mohannad
Mohammed
Salem
Ali
Samir

الاختبارات

g2 = make_groups_by_size([
    "Ahmad",
    "Mohannad",
    "Mohammed",
    "Salem",
    "Ali",
    "Samir",
], group_size=2)
assert len(g2) == 3
assert len(g2[0]) == 2
assert len(g2[1]) == 2
assert len(g2[2]) == 2

بحسب عدد المجموعات

نريد الآن توزيعها بحسب عدد المجموعات group_count:

def make_groups_by_count(items: list[str], group_count: int) -> list[list[str]]:
    pass

الاختبار:

g1 = make_groups_by_count([
    "Ahmad",
    "Mohannad",
    "Mohammed",
    "Salem",
    "Ali",
    "Samir",
], group_count=2)
assert len(g1) == 2
assert len(g1[0]) == 3
assert len(g1[1]) == 3

دمج الاثنين في فعل واحد

هل يمكنك جعل كلا الأمرين في فعل واحد؟ بحيث:

  • لو تم تعيين group_size فإنه يتم توزيع العناصر بحسب حجم المجموعة
  • لو تم تعيين group_count فإنه يتم توزيع العناصر بحسب عدد المجموعات
def make_groups(items: list[str], group_size: int = None, group_count: int = None) -> list[list[str]]:
    pass

ضم الأقران

ماذا لو أردت أن تضم قائمة من الأشخاص بحيث يكون فارق العمر بينهم أقل ما يمكن؟

Ahmad: 24
Mohannad: 17
Mohammed: 16
Salem: 32
Ali: 26
Samir: 31
peers = [
    ("Ahmad", 24),
    ("Mohannad", 17),
    ("Mohammed", 16),
    ("Salem", 32),
    ("Ali", 26),
    ("Samir", 31),
]
def make_pairs_by_age_diff(items: list[tuple[str, int]]) -> list[tuple[str, str]]:
    """Make pairs of people by their age difference minimum."""
    pass

الاختبارات

pairs = make_pairs_by_age_diff(peers)
for p in pairs:
    if "Ahmad" in p:
        assert "Ali" in p
    if "Mohannad" in p:
        assert "Mohammed" in p
    if "Salem" in p:
        assert "Samir" in p