GammaCyber

כתיבת קוד — שיעור 10

התנעת פרויקט הדגל — Git, PRD, MVP

כל 2 משימות הקוד שנשמרו מהשיעור מופיעות כאן, עם דרישות, דוגמאות וקוד פתיחה. אפשר לכתוב פתרון בעורך המקומי וללחוץ על „בדיקת AI” לקבלת ציון, רמזים והערות.

T2 · בסיסי200 נק'~12 דק'algorithmic
השוואת גרסאות סמנטיות (SemVer)
בפרויקט הדגל אתם מתייגים גרסאות. נתונות שתי מחרוזות גרסה a ו-b, כל אחת סדרת מספרים שלמים אי-שליליים מופרדים בנקודה (למשל "1.2.10"). החזר 1 אם a>b, -1 אם a<b, 0 אם שוות. ההשוואה מספרית מקטע-אחר-מקטע; מקטעים חסרים נחשבים 0 (כך ש-"1.2" שווה ל-"1.2.0").
דוגמאות
compare_versions('1.2.10', '1.2.9') → 1
compare_versions('1.2', '1.2.0') → 0
compare_versions('1.0.0', '1.0.1') → -1
פתרון-ייחוס השוואת גרסאות סמנטיות (SemVer) ›
def compare_versions(a: str, b: str) -> int: pa = [int(x) for x in a.split('.')] pb = [int(x) for x in b.split('.')] n = max(len(pa), len(pb)) pa += [0] * (n - len(pa)); pb += [0] * (n - len(pb)) # חלקים חסרים = 0 return (pa > pb) - (pa < pb)
הפתרון נשמר מקומית אוטומטית.
T3 · בינוני350 נק'~25 דק'algorithmic
התאמת תבנית גלוב (.gitignore-style)
ב-.gitignore משתמשים בתבניות עם תווים כלליים. ממש glob_match(p, s) המחזיר True אם התבנית p תואמת את המחרוזת s במלואה, כאשר '*' תואם רצף כלשהו (כולל ריק) ו-'?' תואם תו יחיד בדיוק; כל תו אחר מילולי. חובה יעילות O(|p|+|s|) (two-pointer): מימוש רקורסיבי תמים שמפצל על כל '*' הוא אקספוננציאלי ויתקע ב-timeout.
דוגמאות
glob_match('*.txt', 'file.txt') → True
glob_match('a?c', 'ac') → False
glob_match('a*c', 'abbbc') → True
פתרון-ייחוס התאמת תבנית גלוב (.gitignore-style) ›
def glob_match(p: str, s: str) -> bool: i = j = 0; star = -1; mark = 0 # two-pointer עם backtrack ל-'*' האחרון while j < len(s): if i < len(p) and (p[i] == s[j] or p[i] == '?'): i += 1; j += 1 elif i < len(p) and p[i] == '*': star = i; mark = j; i += 1 elif star != -1: # התאמה נכשלה — הרחב את ה-'*' האחרון i = star + 1; mark += 1; j = mark else: return False while i < len(p) and p[i] == '*': i += 1 return i == len(p)
הפתרון נשמר מקומית אוטומטית.