GammaCyber

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

פרוטוקול תקשורת מומצא

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

T2 · בסיסי200 נק'~15 דק'algorithmic
רגיסטר ביט-פלאגים (Set/Clear/Toggle)
בפרוטוקולים רבים דגלים נשמרים כביטים ברגיסטר יחיד. נתון ערך התחלתי F ורשימת פעולות; כל פעולה היא "SET n" (הדלק את ביט n), "CLR n" (כבה את ביט n), "TOG n" (הפוך את ביט n). החזר את הערך הסופי של F.
דוגמאות
bit_ops(0, ['SET 0','SET 3']) → 9
bit_ops(0b1111, ['CLR 1']) → 13
bit_ops(0, ['TOG 2','TOG 2']) → 0
פתרון-ייחוס רגיסטר ביט-פלאגים (Set/Clear/Toggle) ›
def bit_ops(F: int, ops: list[str]) -> int: for o in ops: cmd, n = o.split(); n = int(n) if cmd == 'SET': F |= (1 << n) # הדלק ביט elif cmd == 'CLR': F &= ~(1 << n) # כבה ביט elif cmd == 'TOG': F ^= (1 << n) # הפוך ביט return F
הפתרון נשמר מקומית אוטומטית.
T3 · בינוני400 נק'~30 דק'algorithmic
פרסור מסגרות פרוטוקול + Checksum
פענח זרם בייטים (רשימת מספרים 0–255) של פרוטוקול ממוסגר. כל מסגרת: בייט התחלה 0x7E, ואז LEN, ואז LEN בייטים של מטען (payload), ואז בייט checksum ששווה ל-XOR של כל בתי המטען. סרוק את הזרם: דלג על בייטים עד 0x7E; קרא מסגרת; אם ה-checksum תקין — אסוף את המטען, אחרת דלג עליה; המשך. עצור אם מסגרת נקטעת (אין מספיק בייטים). החזר את רשימת המטענים התקינים (כרשימות).
דוגמאות
parse_frames([0x7E,3,1,2,3,0]) → [[1, 2, 3]]
parse_frames([0x7E,2,1,9,0]) → [] # xor=8 ≠ 0
פתרון-ייחוס פרסור מסגרות פרוטוקול + Checksum ›
def _xor(payload): c = 0 for b in payload: c ^= b return c def parse_frames(stream: list[int]) -> list[list[int]]: out = []; i = 0; n = len(stream); START = 0x7E while i < n: if stream[i] != START: i += 1; continue # סנכרון על START if i + 1 >= n: break ln = stream[i + 1] if i + 2 + ln + 1 > n: break # מסגרת קטומה payload = stream[i + 2 : i + 2 + ln] chk = stream[i + 2 + ln] if _xor(payload) == chk: out.append(payload) # checksum תקין i = i + 2 + ln + 1 # קדם מעבר לכל המסגרת return out
הפתרון נשמר מקומית אוטומטית.