שינויים קטנים שעושים את ההבדל
17/09/2020
שתי התוכניות הבאות עושות בדיוק את אותו דבר ונכתבו כדי לפתור את 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])
קל לראות שמבחינת מימוש אין הבדל בין שתי התוכניות. גם מבחינת מוכנות לשינויים בעתיד, קלות הבדיקה, יכולת הרחבה, בקיצור בכל הפרמטרים המעניינים שתי התוכניות זהות. מלבד כמובן שמות המשתנים הארוכים יותר בתוכנית השניה.
ולמרות שאני מכיר את התרגיל ואת הפיתרון ועם כל האהבה לקוד קצר - התוכנית הראשונה מצליחה לבלבל אותי כל פעם.
שם נותן היגיון, הוא מסדר את המחשבות ועוזר לנו לקרוא את הקוד כשנצטרך. והיום עם השלמה אוטומטית בעורכי הטקסט שלכם, לכתוב שם ארוך אפילו לא לוקח יותר מדי מאמץ.