GammaCyber

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

סימולציית כנס גאמא — NOVA + CommandBridge

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

T2 · בסיסי250 נק'~15 דק'algorithmic
CommandBridge — סמן על רשת
פרוטוקול CommandBridge שולט בסמן על רשת אינסופית, שמתחיל ב-(0,0). כל פקודה: "MOVE DIR K" כאשר DIR הוא N/S/E/W ו-K מספר צעדים (N=+y, S=-y, E=+x, W=-x). עבד את הפקודות והחזר את המיקום הסופי (x, y).
דוגמאות
run_cursor(['MOVE N 3','MOVE E 2']) → (2, 3)
run_cursor(['MOVE N 1','MOVE S 1']) → (0, 0)
פתרון-ייחוס CommandBridge — סמן על רשת ›
def run_cursor(cmds: list[str]) -> tuple[int, int]: x = y = 0 for c in cmds: _, d, k = c.split(); k = int(k) if d == 'N': y += k elif d == 'S': y -= k elif d == 'E': x += k elif d == 'W': x -= k return (x, y)
הפתרון נשמר מקומית אוטומטית.
T3 · בינוני450 נק'~30 דק'algorithmic
NOVA VM — אוגרים ובקרת זרימה
ממש את מכונת NOVA. תוכנית = רשימת הוראות, מונה-פקודות מתחיל ב-0. אוגרים (כל שם מתחיל ב-0). הוראות: "MOV rX n" (rX=n) · "ADD rX n" · "SUB rX n" · "OUT rX" (הוסף לפלט) · "JNZ rX off" (אם rX≠0 קפוץ יחסית ב-off, אחרת המשך). החזר את רשימת ה-OUT. (המימוש חייב לתמוך בלולאות דרך JNZ; הגן מלולאה אינסופית בתקרת צעדים.)
דוגמאות
run_nova(['MOV r0 3','OUT r0','SUB r0 1','JNZ r0 -2']) → [3, 2, 1] # לולאת ספירה-לאחור
run_nova(['MOV r0 5','OUT r0','ADD r0 2','OUT r0']) → [5, 7]
פתרון-ייחוס NOVA VM — אוגרים ובקרת זרימה ›
def run_nova(program: list[str]) -> list: reg = {}; out = []; i = 0; steps = 0; LIMIT = 10**6 while 0 <= i < len(program): steps += 1 if steps > LIMIT: break # הגנה מלולאה אינסופית p = program[i].split(); op = p[0] if op == 'MOV': reg[p[1]] = int(p[2]); i += 1 elif op == 'ADD': reg[p[1]] = reg.get(p[1], 0) + int(p[2]); i += 1 elif op == 'SUB': reg[p[1]] = reg.get(p[1], 0) - int(p[2]); i += 1 elif op == 'OUT': out.append(reg.get(p[1], 0)); i += 1 elif op == 'JNZ': i += int(p[2]) if reg.get(p[1], 0) != 0 else 1 else: i += 1 return out
הפתרון נשמר מקומית אוטומטית.