תרגילים

הקדמה

התרגול השבוע כרוך בהשקעת מאמץ ניכר, ומטרתו לחזור ולחזק את היסודות שנלמדו בשבועות קודמים.
השבוע ניצב בפניכם אתגר חדש: חזקו את יכולות החיפוש שלכם באינטרנט ובתיעוד של פייתון, ונסו למצוא מודולים שיסייעו לכם בפתרון הבעיות.
זוהי יכולת חשובה מאוד עבור מתכנתים, וזהו בהחלט חלק נכבד מהאתגר בתרגילים שמופיעים לפניכם במחברת הזו.

מלחמה וזהו?

פתרו את התרגיל "מלחמה וזהו" משבוע 4, הפעם עם הידע החדש שרכשתם.

כלים שלובים

כתבו פונקציה בשם interleave שמקבלת פרמטר iterable אחד או יותר, ומחזירה רשימה של האיברים שזורים זה בזה.

לדוגמה, עבור הקריאה interleave('abc', [1, 2, 3], ('!', '@', '#')) יוחזר הערך: ['a', 1, '!', 'b', 2, '@', 'c', 3, '#'].

ממשו גרסה של generator ל־interleave.

שובו של קשטן

בחנות של אדון קשטן ישנו מילון המכיל את כל המוצרים בחנות, ואת המלאי של כל מוצר.
רשמו פונקציה שמקבלת את המוצרים שהתקבלו במשלוח האחרון, ומעדכנת את המלאי של אדון קשטן בהתאם לכך.

לדוגמה:

  • עבור הקריאה add_inventory({'cheese': 2, 'milk': 1}, cheese=3, chocolate=5)
    יוחזר המלאי: {'cheese': 5, 'chocolate': 5, 'milk': 1}
  • עבור הקריאה add_inventory({'refrigerator': 7, 'goat': 1}, honey=2)
    יוחזר המלאי: {'honey': 2, 'refrigerator': 7, 'goat': 1}

הארי רציונלי אבל לא נורא

הספרן שהיה בדרכו להביא לי את העותק הנחשק של "הארי פוטר והשיטה הרציונלית" מעד.
הספרים התעופפו ופרקי הספרים התפזרו לכל עבר.
בתיקייה resources מצורף קובץ מכווץ ובו כל פרקי הסיפור, אך למרבה הצער שם הקבצים אינו תואם לתוכן שלהם.
שנו את שמו של כל קובץ כך ששמו החדש יהיה מספר תלתַ־ספרתי שמתאר את מספר הפרק, ואחריו את שם הפרק.
לדוגמה: עבור הפרק הראשון, שם הקובץ צריך להיות 001 A Day of Very Low Probability.
במהלך התרגיל ייתכן שתצטרכו לשלב עבודה עם כמה ספריות, ובהן כאלו שלא למדנו.

  • פתחו את קובץ ה־zip ידנית לפני תחילת העבודה, וחלצו ממנו את כל הפרקים של הספר.
  • כדי לדמות תרגיל מהעולם האמיתי, הושתלו כמה בעיות שבהן תתקלו לאחר שתריצו את התוכנה שלכם. פתרו אותן בעזרת תכנות.

טיפ: גבו את הקבצים לפני שתתחילו לעבוד עליהם.
רמז: אפשר לפתוח קובצי html ידנית, כקובצי טקסט.
רמז 2: כיצד משנים שמות של קבצים באמצעות פייתון?

פרדוקס יום ההולדת

מוצגת להלן אחת מהגרסאות של פרדוקס יום ההולדת:

מה הסיכוי שבכיתה שבה 23 תלמידים (חחחחח) יציינו שני תלמידים יום הולדת באותו תאריך?

הנחות המוצא שלנו בפתירת הבעיה הן כדלהלן:

  • הילודה מפוזרת באופן שווה לאורך השנה (היא לא, אבל נדמיין שכן).
  • כשאנחנו אומרים "תאריך" אנחנו מתכוונים לצירוף של החודש והיום, ללא התייחסות לשנה.
    מי שנולד ב־1 במאי 1992 הוא בעל תאריך יום הולדת זהה למי שנולד ב־1 במאי 1995.

הפתרון של ה"פרדוקס" מפתיע את רוב האנשים ששומעים עליו לראשונה.

כתבו תוכנה שמגרילה תאריכי יום הולדת עבור 10,000 כיתות, שבכל אחת מהן לומדים 23 תלמידים.
מהו אחוז הכיתות שבהן ציינו 2 ימי הולדת באותו תאריך? השוו עם הפתרון המוצג בוויקיפדיה.
דאגו שהפתרון שלכם יתחשב בכך שקיימות שנים מעוברות.

השתמשו בתוכנה שכתבתם כדי לחשב את הסיכויים עבור כיתות שבהן תלמיד אחד, ועד כיתות ישראליות ממוצעות שבהן 366 תלמידים.