פורסם ב זה רק קוד

שלום עולם 2

קוד: hello_world
זמן קריאה: 4 דקות

היי לכולן!

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


אז, בשבוע הבא אני הולכת להעביר הרצאה באירוע Hello World של Mind The Gap – IL, וזו נראתה לי כמו הזדמנות מצוינת לכתוב פוסט שלום עולם חדש!

למי שלא קראה או הספיקה לשכוח את פוסט שלום עולם הראשון שעשיתי, הרעיון הוא פשוט – לבחור משימה תכנותית קלה, לממש אותה בכמה שיותר שפות וצורות ולראות את ההבדלים. המשימה שבחרתי בה למטרה זו היא להדפיס את המחרוזת "!Hello World" באלכסון.

היום החלטתי שהגיע הזמן לכתוב מימוש בסקאלה!

Scala

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

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

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

הנה הפתרון הרקורסיבי הסקלאיסטי שלי למשימת שלום עולם!

def printDiag(spaces: String, word: String): Unit = {
	if (!word.isEmpty) {
		Console.println(spaces + word.head)
		printDiag(spaces.concat(" "), word.tail)
	}
}

והנה הפתרון הזהה שלי בפייתון!

def print_diag(spaces, word):
	if len(word) > 0:
		print(spaces + word[0])
		print_diag(spaces + " ",word[1:])

אחחחח, אין על הבהירות של פייתון 🙂

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

נכון שרקורסיות זה יפה?


הפתרון הבא הוא פתרון שקיבלתי מקורא!

בפוסט הקודם שלי הצעתי לכל מי שרוצה לשלוח לי מימוש של פתרון למשימה, כדי שאני אוסיף אותו לפוסטים הבאים, וקיבלתי המון קטעי קוד מעניינים! 
אני מתחילה עם המימוש הכי מפתיע שקיבלתי – מימוש במאטלאב מאת הקורא הנחמד אלון.

MATLAB

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

הנה הפתרון הראשון שלו – 

function HelloWorld()
str = 'Hello World!';
for i = 1:length(str)
    disp([repmat(' ', 1, i-1),str(i)]);
end
end

בפתרון הזה ישנה לולאה שרצה על המחרוזת Hello World ומייצרת מטריצה חד מימדית של רווחים (בגובה 1 וברוחב i-1) לפני כל תו במחרוזת.

זה פתרון מצוין, אבל מה שממש הפתיע אותי היה הפתרון הבא שלו. הוא השתמש בפונקציה diag שלוקחת וקטור ומחזירה מטריצה אלכסונית שהווקטור הוא האלכסון שלה! 

function HelloWorld()
str = 'Hello World!';
disp(diag(str))
end

ממש פונקציה שנוצרה בשביל התרגיל הזה 🙂

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

כרגיל, קוד בגיט – https://github.com/mgershovitz/maya_solves/tree/master/hello_world


כל הפוסטים בסדרה:

השאר תגובה