תרגילים נוספים: שבוע 2

תגיות:

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

מחברת 1

תרגיל 1 (נגה אוסין)

קראו את הקוד הבא וענו על השאלות שאחריו:

num = 0
con = num > 1
if con:
    print(num <= 2)
else:
    print(con)
  1. עבור איזה ערך יודפס True?
  2. עבור איזה ערך יודפס False?
  3. האם יכול להיות מודפס 3? למה?

תרגיל 2 (נגה אוסין)

דנה קיפאלי אוהבת רק תפוחים ירוקים.
כתבו עבורה קוד אשר ישאל את הירקן אם יש לו תפוחים היום, ואם כן, ישאל שוב אילו צבעים יש בהיצע.
אם יש לו תפוחים ירוקים, הדפיסו “Shigaon”. אחרת, הדפיסו “Boo”.

לדוגמה:

  • אם לירקן יש תפוחים היום, ובהיצע יש “Red, Yellow, Green” – הדפיסו “Shigaon”.
  • אם לירקן יש תפוחים היום, ובהיצע יש “Pink, Yellow, Red” – הדפיסו “Boo”.
  • אם אין תפוחים, יודפס “Boo” והתוכנה תסתיים.

מחברת 2

תרגיל 1 (נגה אוסין)

ניתן לדרג את רמת הבשלות של בננה במספרים שלמים בין 1 ל־10.

  • כאשר רמת הבשלות הנה בין 1–4 (כולל), זה אומר שהקליפה ירוקה ויש לחכות טרם אכילתה.
  • כאשר רמת הבשלות הנה בין 5–7 (כולל), הקליפה צהובה וניתן לאכול אותה מייד.
  • כאשר רמת הבשלות הנה בין 8–10 (כולל), הבננה כבר בשלה מדי לאכילה אך ניתן לאפות ממנה עוגה טעימה.

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

לדוגמה:

  • עבור קלט 8, יודפס למשתמש שהוא יכול לאפות עוגת בננות.
  • עבור קלט 300, תודפס למשתמש הודעת שגיאה.

תרגיל 2 (עידו אלקבץ)

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

  • במידה והוא עד 100 מטר – הדפיסו “Stay safe!”
  • במידה והוא עד 5000 מטר – הדפיסו “Put on a mask”
  • אחרת – הדפיסו “You’ve been fined for 5,000 shekels”

תרגיל 3 (איתמר רביב)

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

  1. המשטרה מבהירה שאם שניהם ילשינו, שניהם ייכנסו לכלא לחמש שנים.
  2. אם אחד מהם ילשין והשני ישתוק – המלשין יצא לחופשי ואילו השותק ייכנס לכלא ל־15 שנים.
  3. אם שניהם ישתקו, למשטרה לא יהיו מספיק ראיות והם ישתחררו לאחר שנה.

כתבו קוד המקבל את החלטת כל אחד מהאסירים (speak או silent) ומדפיס את גורל כל אחד מהם.

לדוגמה, עבור הקלט:
prisoner one: silent
prisoner two: speak

הפלט הוא:
prisoner one is sentenced to 15 years.
prisoner two goes free.

מחברת 3

תרגיל 1 (ים מסיקה)

  1. כתבו פונקציה ללא פרמטרים, שמטרתה לקבל כקלט (בעזרת input) 3 מספרים מהמשתמש.
  2. כתבו פונקציה נוספת שמקבלת 3 מספרים, ומחזירה את הגדול מביניהם.
  3. כתבו תוכנה שמשתמשת בשתי הפונקציות שבניתם, ומדפיסה את התוצאה של הפונקציה מסעיף 2.

לדוגמה:

  • עבור הקלטים 3, 7 ו־9 התוכנית תדפיס 9.
  • עבור הקלטים 1, 1 ו־1 התוכנית תדפיס 1.

תרגיל 2 (נגה אוסין)

סעיף 1

כתבו פונקציה (תוכלו לקרוא לה foo, אם תרצו) המחזירה ערך מספרי התלוי בתכונותיו של הקלט אותו היא מקבלת, לפי החוקיות הבאה:

  • עבור קלט מסוג int, כפלו אותו בשתיים והחזירו אותו.
  • עבור קלט מסוג string:
    • אם המחרוזת היא בת 5 תווים או פחות, כפלו את אורכה בשתיים והחזירו אותו.
    • אחרת, החזירו את אורך המחרוזת.
  • עבור קלט מסוג bool, קרי ביטוי בוליאני, החזירו את הערך המספרי של הביטוי. (כן כן, נסו את זה!)
  • אחרת, החזירו 1-.

דוגמאות:

  • עבור True או False, הפונקציה תחזיר 1 או 0 (בהתאמה).
  • עבור 5, הפונקציה תחזיר 10.
  • עבור “5”, הפונקציה תחזיר 2.
דוגמה נוספת שעושה קצת ספוילר

עבור {5}, הפונקציה תחזיר 1- .

סעיף 2:

נסו לכתוב את הפונקציה בלי להשתמש ב־elif או ב־else.
רמז: חשבו כיצד תכונותיה של מילת המפתח return תוכלנה לסייע במשימה.

מחברת 4

תרגיל 1 (נגה אוסין)

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

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

הפונקציה תחזיר True אם גב’ קיפאלי תקנה תפוחים באותו יום, ו־False אם לא.

דוגמה:

  • עבור הקלט [yellow’, ‘green’, ‘polka-dot’, ‘red’’] יוחזר True.
  • עבור הקלט [‘blue’, ‘red’, ‘yellow’, ‘green’] יוחזר False.
  • עבור הקלט [‘red’, ‘green’, ‘pink’] יוחזר True (חשבו: באיזה צבע תבחר?).

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

תרגיל 2 (נגה אוסין)

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

הוסיפו כל מספר לרשימה המתאימה לו. בסופו של דבר, צרו רשימה נוספת אשר תכיל את שתי הרשימות הקודמות, והדפיסו אותה למשתמש.

דוגמה:

  • אם המשתמש הזין 33 ואז 3, יודפס: [['3'], ['33']]
  • אם המשתמש הזין 12 ואז 34, יודפס: [[], ['12', '34']]
  • אם המשתמש הזין 4 ואז 2, יודפס: [['4', '2'], []]

רמז: חזרו במיוחד על השמה של רשימות.

מחברת 5

תרגיל 1 (ים מסיקה, איתמר רביב)

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

הטעויות האפשריות שקורות לעתים קרובות הן:

  1. השורה הראשונה (ואולי גם השנייה, וכך הלאה) היא שורה ריקה במקום # Upload
  2. החניך שכח לשים רווח אחרי תו הסולמית.
  3. החניך כתב upload, uPload או כל וריאציה אחרת במקום Upload באותיות גדולות.
  4. הנתון שמופיע לצד המילה Upload אינו מספרי.
  5. השורה # Upload כלל לא מופיעה בקובץ בשום וריאציה הגיונית.

לדוגמה:
עבור הפתרון


#Upload a
a = 5

יודפס:

The # Upload line should be the first line
You forgot to put a space character after the #
‘a’ is not a valid exercise id.

6 לייקים

פתרונות

מחברת 1

תרגיל 1

פתרון
  1. כל ערך int או float שנמצא בין 1 (לא כולל) ל־2 (כולל).
  2. כל ערך שקטן או שווה ל־1, וכל ערך שגדול מ־2 (לא כולל).
  3. לא, מכיוון שבכל אחד מהמצבים של ה־if אנחנו מסיימים בהדפסת תוצאה של ביטוי בוליאני.

תרגיל 2

בלי חומרים מתקדמים
is_any_apples = input("Do you have any apples?")
if is_any_apples == 'yes':
    apples = input("Which apples?")
    if "Green" in apples:
        print("Shigaon!")
    if "Green" not in apples:
        print("Boo")
if is_any_apples == 'no':
    print("Boo")
בונוס – עם חומרים מתקדמים
def is_there_green_apples():
    if input("Do you have any apples?") == 'yes':
        apples = input("Which apples?").split(", ")
        return "Green" in apples
    return False


if is_there_green_apples():
    print("Shigaon")
else:
    print("Boo")

מחברת 2

תרגיל 1

בלי חומרים מתקדמים
banana_ripeness = int(input("Please enter the banana ripeness: "))
if not banana_ripeness.isdecimal():
    print("Error :(")
elif 1 <= banana_ripeness <= 4:
    print("The banana is too ripe.")
elif 5 <= banana_ripeness <= 7:
    print("First, you eat the banana.")
elif 8 <= banana_ripeness <= 10:
    print("Your banana is good for cake")
else:
    print("Error :(")
בונוס – עם פונקציות: קצת התחכמתי כדי לגרום לזה להראות טוב, פתרונות פשוטים יותר גם יעבדו
# Define status codes for banana ripeness
RIPE = 1
GOOD = 2
CAKE = 3
ERROR = 4


def normalize_ripeness_level(banana_ripeness):
    if not banana_ripeness.isdecimal():
        return ERROR
    
    if 1 <= banana_ripeness <= 4:
        return RIPE
    elif 5 <= banana_ripeness <= 7:
        return GOOD
    elif 8 <= banana_ripeness <= 10:
        return CAKE
    return ERROR


banana_ripeness = int(input("Please enter the banana ripeness: "))
normalized_ripeness = normalize_ripeness_level(banana_ripeness)
if normalized_ripeness == RIPE:
    print("The banana is too ripe.")
elif normalized_ripeness == GOOD:
    print("First, you eat the banana.")
elif normalized_ripeness == CAKE:
    print("Your banana is good for cake")
else:
    print("Error :(")

תרגיל 2

זו דוגמה לפתרון שפחות התחכמתי בו (זה נראה כמעט אותו דבר בלי פונקציות, אז הרשתי לעצמי :)
def print_message_by_user_distance(distance):
    if 0 <= distance <= 100:
        print("Stay safe!")
    elif 100 < distance <= 5_000:
        print("Put on a mask!")
    else:
        print("You’ve been fined for 5,000 shekels")

distance_from_home = int(input("Please enter your distance from home: "))
print_message_by_user_distance(distance_from_home)

תרגיל 3

פתרון עם פונקציות. ניתן לכתוב בקלות בלי פונקציות עם הרבה שכפול קוד, חשבתי שיהיה נחמד להראות פה מימוש עם פונקציות.
def get_prisoner_years_in_jail(is_prisoner_spoke, is_other_prisoner_spoke):
    if is_prisoner_spoke and is_other_prisoner_spoke:
        return 5
    if is_prisoner_spoke and not is_other_prisoner_spoke:
        return 0
    if not is_prisoner_spoke and is_other_prisoner_spoke:
        return 15
    if not is_prisoner_spoke and not is_other_prisoner_spoke:
        return 1


def print_years_in_jail(prisoner_id, years_in_jail):
    if years_in_jail:
        print("Prisoner " + str(prisoner_id) + " is sentenced to " + str(years_in_jail) + " years in jail.")
    else:
        print("Prisoner " + str(prisoner_id) + " goes free.")    


is_prisoner_1_spoke = input("Prisoner 1: Speak/Silence?: ") == 'Speak'
is_prisoner_2_spoke = input("Prisoner 2: Speak/Silence?: ") == 'Speak'
prisoner_1_years_in_jail = get_prisoner_years_in_jail(is_prisoner_1_spoke, is_prisoner_2_spoke)
prisoner_2_years_in_jail = get_prisoner_years_in_jail(is_prisoner_2_spoke, is_prisoner_1_spoke)
print_years_in_jail(1, prisoner_1_years_in_jail)
print_years_in_jail(2, prisoner_2_years_in_jail)

מחברת 3

שאלה 1:

פתרון
def get_max(a, b, c):
    if a > b and a > c:
        return a
    if b > c:
        return b
    return c


def get_3_numbers_as_input_and_return_max():
    first = input("Please enter the first number: ")
    second = input("Please enter the seocnd number: ")
    third = input("Please enter the third number: ")
    return get_max(first, second, third)
בונוס: למה הפונקציה הזו גרועה מאוד?

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

בונוס: ענו על התרגיל הזה טוב יותר אחרי שסיימתם את מחברות השבוע.
def get_max(a, b, c):
    if a > b and a > c:
        return a
    if b > c:
        return b
    return c


def get_3_numbers():
    first = input("Please enter the first number: ")
    second = input("Please enter the seocnd number: ")
    third = input("Please enter the third number: ")
    return [first, second, third]


numbers = get_3_numbers()
print(get_max(numbers[0], numbers[1], numbers[2]))

תרגיל 2

סעיף 1

פתרון
def foo(data):
    if type(data) == int:
        return data * 2
    elif type(data) == str:
        data_length = len(data)
        if data_length <= 5:
            return data_length * 2
        else:
            return data_length
    elif type(data) == bool:
        return int(data)
    else:
        return -1

סעיף 2:

פתרון
def foo(data):
    if type(data) == int:
        return data * 2
    if type(data) == str:
        data_length = len(data)
        if data_length <= 5:
            return data_length * 2
        return data_length
    if type(data) == bool:
        return int(data)
    return -1

מחברת 4

פתרון
def is_there_good_apples():
    if input("Do you have any apples?").lower() == 'yes':
        apples = input("Which apples?").split(", ")
        return apples[0] == 'Green' or apples[1] == 'Green' or apples[0] == 'Red'
    return False

בונוס:

פתרון
def get_apples_bought():
    if input("Do you have any apples?").lower() == 'yes':
        apples = input("Which apples?").split(", ")
        if apples[0] == 'Green' or apples[1] == 'Green':
            return 'Green'
        if apples[0] == 'Red':
            return 'Red'
    return False

בונוס 2:

פתרון
def get_apples_bought():
    if input("Do you have any apples?").lower() == 'yes':
        apples = input("Which apples?").split(", ")
        if apples[0] == 'Green' or apples[0] == 'Red':
            return apples[0]
        if len(apples) == 1:
            return False
        if apples[1] == 'Green':
            return 'Green'
    return False

תרגיל 2

פתרון
def get_index_to_add(number):
    if len(number) == 1:
        return 0
    return 1
    # Another option: return len(number) - 1

num1 = input("Please enter number 1: ")
num2 = input("Please enter number 2: ")
l = [[], []]
index1 = get_index_to_add(num1)
index2 = get_index_to_add(num2)
l[index1] = l[index1] + [num1]
l[index2] = l[index2] + [num2]
print(l)

מחברת 5

תרגיל 1

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

פתרון
def print_errors(code):
    no_spaces_code = code.replace(' ', '')
    normalized_code = no_spaces_code.lower()
    upload_index = normalized_code.find('#upload')
    valid_upload = True

    if upload_index == -1:
        print("Can't find any variation of '# Upload'. Is it there anyway?")
        valid_upload = False
    if upload_index != 0:
        print("The # Upload line should be the first line.")
        valid_upload = False
    if code[upload_index] == '#' and code[upload_index + 1] != ' ':
        print("You forgot to put a space character after the #.")
        valid_upload = False
    if upload_index != no_spaces_code.find('#Upload'):
        print("The Upload is not capitalized as it should be.")
        valid_upload = False
        
    after_the_upload = normalized_code.split('#upload')[1].split('\n')[0].strip()
    if not after_the_upload.isdecimal():
        print(f"'{after_the_upload}' is not a valid exercise id.")
        valid_upload = False
    
    if valid_upload:
        print("Congratz! This is a valid upload :)")

code = """

#Upload a
a = 5
"""

print_errors(code)

code = """# Upload 5
a = 5
"""

print_errors(code)
2 לייקים

תרגיל 2
בונוס – עם חומרים מתקדמים

היי, רציתי לשאול - למה צריך בפונקציה את ה - split? אני חושבת שניתן למצוא אם יש ירוק גם בלעדיה. בעזרת השורה שאחרי

מעדיף לוודא שזה Green ולא Dark Green או Greenberg Apples