Avital-Pikovsky / Itertools

Itertools - range, accumulate, filterfalse, compress - fifth assignment in C++ course.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

דמויי-מיכלים

המטלה נכתבה בהשראת ספריית itertools של פייתון: https://docs.python.org/3/library/itertools.html כדי להראות שאפשר לכתוב ב-++C באותה רמת נוחות שיש בפייתון (עם קצת הכנה מוקדמת).

במטלה זו נלמד לבנות מבנים "דמויי-מיכלים", שאפשר לרוץ עליהם בלולאה למרות שאינם תופסים מקום בזיכרון. השם הרשמי של מבנה מסוג זה הוא iterable. נבנה חמישה דמויי-מיכלים (מהקל אל הקשה):

א. range – מקבל כקלט שני מספרים שלמים, ומייצג את כל המספרים שבין הראשון לאחרון, כולל הראשון ולא כולל האחרון. לדוגמה, range(5,9) מייצג את המספרים 5,6,7,8. ניתן להניח שהפרמטר האחרון גדול או שווה לראשון; אם הפרמטרים שווים אז הטווח ריק.

ב. accumulate - מקבל כקלט מיכל או דמוי-מיכל כלשהו. מחזיר דמוי-מיכל חדש הכולל סכומים חלקיים. לדוגמה, accumulate(range(5,9)) מייצג את המספרים 5, 11, 18, 26 (5, 5+6, 5+6+7, 5+6+7+8). וכך גם accumulate(vector({5,6,7,8})).

ג. accumulate - גירסה נוספת יכולה לקבל פרמטר נוסף שהוא פונקטור בינארי (עם שני ארגומנטים), ולהשתמש בו במקום חיבור. למשל: accumulate(range(5,9), [](int x, int y){return x*y;}) מייצג את המספרים 5, 30, 210, 1680 (5, 5*6, 5*6*7, 5*6*7*8).

ד. filterfalse - מקבל כקלט שני פרמטרים: הראשון הוא פונקטור בוליאני המייצג תנאי, והשני הוא מיכל או דמוי-מיכל. מחזיר דמוי-מיכל חדש, הכולל רק את האיברים בדמוי-המיכל הנתון, שאינם מקיימים את התנאי. לדוגמה: filterfalse([](int i){return i%2==0;}, range(5,9)) מייצג את המספרים האי-זוגיים בטווח הנתון, כלומר: המספרים 5, 7 בלבד.

ה. compress – מקבל כקלט שני מיכלים או דמויי-מיכלים, שחייבים להיות באותו אורך. הראשון כולל עצמים מסוג כלשהו, והשני חייב לכלול עצמים מסוג בוליאני. מחזיר דמוי-מיכל חדש שבו מופיעים איברים מהדמוי-מיכל הראשון, שהאיבר המתאים להם בדמוי-מיכל השני הוא true. לדוגמה, הביטוי compress(range(5,9),vector({true,true,false,true})) מייצג את המספרים 5, 6, 8; compress(string("abcd"),vector({true,true,false,true})) מייצג את האותיות a, b, d.

דגשים:

  • יש לפתור כל סעיף ע"י פונקציה אחת המטפלת בכל סוגי-הנתונים – מספרים, תוים, מחרוזות, וקטורים, וכו' (למשל בסעיף ב, יש לכתוב רק פונקציה accumulate אחת – אין לכתוב פונקציות שונות לוקטורים ול-range).
  • סיבוכיות הזיכרון של כל המבנים צריכה להיות O(1) . למשל, range(1,5) ו range(1,50000) צריכים לתפוס את אותו מקום בזיכרון! אין לשמור 50000 מספרים בערימה.

כתבו חמישה איטרטורים בסגנון האיטרטורים הבאים של פייתון:

  • accumulate
  • cycle
  • filter_false
  • permutation
  • zip_longest

About

Itertools - range, accumulate, filterfalse, compress - fifth assignment in C++ course.


Languages

Language:C++ 99.1%Language:Shell 0.8%Language:Makefile 0.1%