[אתגר קשה] כל הקומבינציות

כתבו פונקציה בשם combinations שמקבלת שני פרמטרים בלבד – רשימת איברים (items), ואורך כל תוצאה (n).
הפונקציה תחזיר רשימה של רשימות, בה כל רשימה פנימית תכלול קומבינציה אפשרית של האיברים ברשימה items באורך n.

לדוגמה:

combinations([1, 2, 3], 2)

תחזיר:

[[1, 2], [1, 3], [2, 3]]

בונוסים:

  1. דאגו שהפונקציה תוכל לפעול גם על מחרוזות
  2. החזירו טאפלים כאיברים הפנימיים במקום רשימות

לדוגמה:

combinations('abcde', 3)

תחזיר:

[(‘a’, ‘b’, ‘c’),
(‘a’, ‘b’, ‘d’),
(‘a’, ‘b’, ‘e’),
(‘a’, ‘c’, ‘d’),
(‘a’, ‘c’, ‘e’),
(‘a’, ‘d’, ‘e’),
(‘b’, ‘c’, ‘d’),
(‘b’, ‘c’, ‘e’),
(‘b’, ‘d’, ‘e’),
(‘c’, ‘d’, ‘e’)]

מוזמנים ומוזמנות לפרסם פה את הפתרונות שלכם :slight_smile:

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

2 לייקים

הכל בפונקציה אחת או שמותר לחלק לכמה פונקציות?

לייק 1

מותר לעשות מה שאתה רוצה כל עוד combinations עובדת בדיוק כמו שהיא הוגדרה בתרגיל, וכל עוד התרגיל נפתר רק באמצעות חומר שלמדנו.

האם על הפונקציה להחזיר, לדוגמה- גם את 1,2 וגם את 2,1?

ראה דוגמאות, התשובה היא לא

האתגר הזה מבאס אותי על כך שדחיתי את פתירת המחברת האחרונה למחר־כך, ועד שאני אסיים להגיש אותה ולהתפנות אליו, אורפז כבר תהרוס לכולנו. :upside_down_face:

2 לייקים

אתה יכול להאשים רק את עצמך :stuck_out_tongue:

בסדר! בסדר!

-הלכתי להזכר איך מחשבים מקדם בינומי. :joy:

לייק 1

או בקיצור:

לייק 1
def combinations(items, n):
    combs_list = []
    create_combs(items, n, combs_list, [], 0)
    return combs_list


def create_combs(items, n, combs_list, comb, index):
    if n == 0:
        combs_list.append(tuple(comb))
        return

    while index < len(items):
        comb_c = comb.copy()
        comb_c.append(items[index])
        create_combs(items, n - 1, combs_list, comb_c, index + 1)
        index = index + 1

    return combs_list
2 לייקים

לייק 1

דווקא זה מסוג התרגילים שאני מסתבכת איתם כל פעם מחדש אפילו כשמותר לי לולאת for :see_no_evil: :speak_no_evil:
חוץ מזה בלי תירוצים, גם לי יש את רוב מחברת 6 ועוד מלא ש"ב מהאוניברסיטה

2 לייקים

לא מצליח :frowning:
אני יודע מזה זה בינום ואני מכיר את הנוסחה.
למעשה אני יודע לחשב את כמות הצירופים שאני אמור לקבל.

אבל לא מצליח להרכיב את הקוד לאלגוריתם שממש מחזיר אותם =\

עריכה: נראה לי עליתי על משהו עם עצמי. חוזר לנסות שוב
עריכה 2: הרמתי ידיים :frowning:

לייק 1

אני אהיה בוגרת ואתאפק ואסתכל על זה רק אחרי שאסיים את התרגילים להגשה :disappointed_relieved:

3 לייקים

אני באתגר אחר כרגע - מתאפק לא להסתכל בתשובות :slight_smile:

קשה… עליתי על זה אבל אני לא מצליחה לחשוב על תנאי שיגרום לקוד להישאר אלגנטי וגם שכל המקרי קצה יעבדו

שובר על זה את הראש כבר חצי יום ועדיין לא מצליח.

לייק 1

הזהרתי שזה אחד קשה :slight_smile:

3 לייקים

עריכה: הפתרון שכתבתי כאן לא מכסה את כל המקרים, מקווה להעלות בהמשך פתרון נכון יותר

לייק 1