• בלוג
  • שינויים קטנים שעושים את ההבדל

שינויים קטנים שעושים את ההבדל

שתי התוכניות הבאות עושות בדיוק את אותו דבר ונכתבו כדי לפתור את Advent Of Code 2019 Day 2. הראשונה:

mem = [1,9,10,3,2,3,11,0,99,30,40,50]

for i in range(0, len(mem), 4):
    if mem[i] == 1:
        mem[mem[i+3]] = mem[mem[i+1]] + mem[mem[i+2]]
    elif mem[i] == 2:
        mem[mem[i+3]] = mem[mem[i+1]] * mem[mem[i+2]]
    elif mem[i] == 99:
        break
    else:
        raise Exception(f"Invalid cmd #{mem[i]}")

print(mem[0])

וחברתה הארוכה יותר:

from more_itertools import sliced

memory = [1,9,10,3,2,3,11,0,99,30,40,50]

for [opcode,
     input_index_1,
     input_index_2,
     output_index
    ] in sliced(memory, 4):
    if opcode == 1:
        memory[output_index] = memory[input_index_1] + memory[input_index_2]
    elif opcode == 2:
        memory[output_index] = memory[input_index_1] * memory[input_index_2]
    elif opcode == 99:
        break
    else:
        raise Exception(f"Invalid cmd #{memory[i]}")

print(memory[0])

קל לראות שמבחינת מימוש אין הבדל בין שתי התוכניות. גם מבחינת מוכנות לשינויים בעתיד, קלות הבדיקה, יכולת הרחבה, בקיצור בכל הפרמטרים המעניינים שתי התוכניות זהות. מלבד כמובן שמות המשתנים הארוכים יותר בתוכנית השניה.

ולמרות שאני מכיר את התרגיל ואת הפיתרון ועם כל האהבה לקוד קצר - התוכנית הראשונה מצליחה לבלבל אותי כל פעם.

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