שאלות ממבחני עבר#
23-24, סמסטר ב’, מועד ב’ שאלה 2.ד#
בסעיף זה נממש פונקציה המאפשרת לנו להשוות בין שני רצפים גנטיים. רצף גנטי הוא מחרוזת המכילה אך ורק את התווים `ACGT?`.
הפונקציה תקבל שתי מחרוזות באותו אורך, ותחילה תוודא אם שתי המחרוזות מהוות רצפים גנטיים תקינים. אם אחד הרצפים לא תקין, הפונקציה תדפיס הודעת שגיאה ותחזיר `None`. אחרת, הפונקציה תשווה בין הרצפים הגנטיים, ותחזיר `True` אם הם שווים (או `False` אם אינם שווים).
שני רצפים גנטיים ייחשבו **לא שווים** אך ורק אם במיקום מסוים כל רצף מכיל תו שונה שאינו `?`. למשל, אם נשווה בין שני הרצפים `GTG?A` ו-`G?CCA` נראה שהם אינם שווים, שכן במיקום `2` בשני הרצפים תו שונה - `G` באחד, `C` בשני. נבחין כי במיקום `1` שני הרצפים מכילים תווים שונים, אך אחד מהתווים הוא `?`, ולכן לא גורם לכך שלא יהיו שווים.
def sequence_compare(a, b):
pass # fill function implementation here
פתרון
def sequence_compare(a, b):
gc = "ACGT?"
for i in range(len(a)):
if (a[i] not in gc) or (b[i] not in gc):
print("Error!")
return
for i in range(len(a)):
if (a[i] != '?') and (b[i] != '?') or (a[i] != b[i]):
return False
# why not use else: return True?
return True
23-24, סמסטר ב’, מועד ג’ שאלה 1.ב#
בשאלה זו נממש פונקציה המקבלת רשימה, ומחזירה רשימה מקוננת המכילה את כל זוגות האיברים ברשימה המקורית, ללא כפילויות.
כלומר, אם נקבל את הרשימה המקורית ['a', '3', '5'] נרצה להחזיר רשימה מקוננת המכילה את האיברים:
[['a', 3'], ['a', '5'], ['3', 'a'], ['3', '5'], ['5', 'a'], ['5', '3']]
def get_all_pairs(l):
pass # fill function implementation here
פתרון
def get_all_pairs(l):
pairs = []
for i in range(l):
for j in range(l):
if i == j:
continue # In some simple cases, a continue can be replaced with an if statement. Here too.
pairs.append([[l[i], l[j]]])
return pairs
למעשה, בשאלה המקורית הסטודנטים התבקשו לפתור את השאלה מבלי להשתמש ב-`if`. ננסה לפתור את השאלה כעת עם ההגבלה הזו:
def no_cond_pairs(l):
pass # fill function implementation here
פתרון
def no_cond_pairs(l):
pairs = []
for i in range(len(l)):
for j in list(range(i)) + list(range(i + 1, len(l))):
pairs.append([l[i], l[j]])
return pairs
# Another option:
def no_cond_pairs(l):
pairs = []
for i in range(len(l)):
lcopy = l[:] # list[:] is a useful copying mechanic, what would happen if we just use `lcopy = l`?
lcopy.pop(i)
for second_item in lcopy:
pairs.append([l[i], second_item])
return pairs
23-24, סמסטר א’, מועד א’ שאלה 1.ד#
בשאלה זו הפונקציה תקבל רשימה מקוננת של מספרים, המייצגת תוצאות של תמונה im בנקודות שונות במרחב.
מטרת הפונקציה היא לחשב את האינטגרל על התמונה כולה, בהתאם לנוסחא הבאה.
\[
I(x, y) = im[x][y] + I(x-1, y) + I(x, y-1) - I(x-1, y-1)
\]
כדי לחשב תוצאה זו בקוד, מומלץ לאתחל רשימה מקוננת אפסים כדי לשמור את התוצאות, ולאחר מכן יש לעבור על הערכים לפי הסדר ולמלא את הטבלה.
def intergral_im(im):
pass # fill function implementation here
פתרון
def intergral_im(im):
out = [[0] * len(im) for i in range(len(im))]
for i in range(len(im)):
for j in range(len(im)):
out[i][j] = im[i][j]
if i > 0:
out[i][j] += out[i - 1][j]
if j > 0:
out[i][j] += out[i][j - 1]
if i > 0 and j > 0:
out[i][j] -= out[i - 1][j -1]
return out
23-24, סמסטר ב’, מועד א’ שאלה 3.ה.#
בשאלה זו יש לממש את הפונקציה months_in_range, אשר מקבלת שנת התחלה ואינדקס חודש התחלה, וכן שנת סיום ואינדקס חודש סיום.
על הפונקציה להחזיר רשימה עם טווח החודשים בין ההתחלה לסיום כולל, בפורמט הבא: “MON YYYY”.
ניתן להשתמש בתוך הפונקציה ברשימה months המכילה את שמות החודשים.
months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
def months_in_range(start_year, start_month, end_year, end_month):
pass # fill function implementation here
פתרון
months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
def months_in_range(start_year, start_month, end_year, end_month):
cur_month = start_month
cur_year = start_year
result = []
while cur_year < end_year or (cur_year == end_year and cur_month <= end_month):
result.append(months[cur_month] + " " + str(cur_year))
cur_month += 1
if cur_month >= len(months):
cur_month = 0
cur_year += 1
return result
שאלת בונוס#
בשאלה זו נממש את "הנפה של ארטוסתנס", אלגוריתם למציאת כל המספרים הראשוניים עד המספר n. אלגוריתם הנפה מאתחל רשימה עם טווח המספרים אותם רוצים לבדוק, ומניח תחילה שכל המספרים ראשוניים (אולי פרט ל-1 ו-0).
כעת, בכל שלב נמצא את המספר הבא הקטן ביותר שעדיין מסומן כראשוני, ונסמן את כל הכפולות שלו כמספרים לא ראשוניים. נמשיך כך עד שעברנו על הכפולות של כל מספר ברשימה.

def all_primes(n):
pass # fill function implementation here
פתרון
def all_primes(n):
marked_prime = [False, False] + [True] * (n - 2)
for prime in range(2, int(n**0.5 + 1)):
if marked_prime[prime]:
for check in range(prime ** 2, n, prime):
marked_prime[check] = False
return [m for m in range(len(marked_prime)) if marked_prime[m]]