GammaCyber

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

JavaScript מודרני

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

T2 · בסיסי250 נק'~18 דק'algorithmic
EventEmitter — מערכת אירועים
ממש מחלקה EventEmitter המדמה את מערכת האירועים של הדפדפן: on(event, handler) רושם handler · off(event, handler) מסיר · emit(event, *args) קורא לכל ה-handlers של האירוע לפי סדר הרישום ומחזיר רשימה של הערכים שהם החזירו. אירוע לא-מוכר → רשימה ריקה.
דוגמאות
em.on('e', f1); em.on('e', f2); em.emit('e', 10) # f1=x+1, f2=x*2 → [11, 20]
em.off('e', f1); em.emit('e', 10) → [20]
em.emit('unknown') → []
פתרון-ייחוס EventEmitter — מערכת אירועים ›
class EventEmitter: def __init__(self): self._h = {} def on(self, ev, fn): self._h.setdefault(ev, []).append(fn) def off(self, ev, fn): if fn in self._h.get(ev, []): self._h[ev].remove(fn) def emit(self, ev, *args): return [fn(*args) for fn in self._h.get(ev, [])] # לפי סדר הרישום
הפתרון נשמר מקומית אוטומטית.
T3 · בינוני350 נק'~25 דק'algorithmic
Debounce על זרם אירועים
ב-JS משתמשים ב-debounce כדי לא להפעיל handler על כל הקשה. נתונה רשימת אירועים events, כל אחד (t, key), ממוינת לפי t, וחלון w. אירוע 'נורה' אם אין אירוע נוסף *עם אותו key* בתוך w יחידות זמן אחריו (כלומר עבר שקט של יותר מ-w, או שזה האירוע האחרון של אותו key). החזר את האירועים שנורו לפי סדר הופעתם.
דוגמאות
debounce([(0,'a'),(1,'a'),(5,'a')], 2) → [(1, 'a'), (5, 'a')]
debounce([(0,'x'),(1,'x')], 5) → [(1, 'x')]
פתרון-ייחוס Debounce על זרם אירועים ›
def debounce(events, w): fired = [] for i, (t, k) in enumerate(events): nxt = next((t2 for t2, k2 in events[i+1:] if k2 == k), None) if nxt is None or nxt - t > w: # אין אירוע-המשך לאותו מפתח בתוך החלון fired.append((t, k)) return fired
הפתרון נשמר מקומית אוטומטית.