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

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

Python
אני אתחיל בהתחלה, אהובת ליבי הנצחית שלעולם לא תהיה לי אחרת במקומה – פייתון.
אין כמו הקלילות והמהירות של כתיבה בפייתון, ואני בהחלט מאמינה שכל הפרויקטים האישיים שלי, והסקריפטים שאני צריכה לכתוב במהירות ימשיכו להיכתב בפייתון.
בפתרון הפייתוני שלי הלכתי על הכפלה של רווחים במספר האיטרציות (במקום להחזיק מחרוזת של רווחים), לא הכי יעיל, אבל מאוד הגיוני ואינטואיטיבי לדעתי.
def hello_world(): space_counter = 0 str = “Hello World” for c in str: print (“ “*space_counter + c) space_counter +=1

Golang
Go היא שפה סופר חביבה. זו לא שפה שיצא לי להתעסק המון איתה, אבל כתבתי בה שני פרויקטים ומאוד נהניתי ממנה, היא עושה את מה שהיא עושה (מקביליות) היטב, ועכשיו אני אראה איך היא מתמודדת עם משימת ה-Hello World שלי.
כבר מהרגע הראשון, ב-go יש קצת יותר כתיבה והגדרות מאשר בפייתון. צריך להכריז על חבילה, ולייבא את החבילה fmt, שממשת פקודות הדפסה ב-go.
כלומר, אם הייתי רוצה לכתוב תוכנית hello world קלאסית בגו, היא הייתה נראית כך –
package main import "fmt" func hello_world() { fmt.Println("Hello World") }
בשלב השני אני רוצה להוסיף לפונקציה שלי לולאה. לגו יש פונקציית range שמאפשרת לרוץ על איברים במבני נתונים (במקרה שלי, מחרוזת).
אני אוסיף את הלולאה לקוד שלי –
func main() { for _, c := range "Hello World" { fmt.Println(string(c)) } }
מעולה! עכשיו, אחרון חביב, להוסיף את האלכסון.
כמו פייתון, גם גו מאפשרת לחבר מחרוזות בתוך פקודת ההדפסה, אז אני יכולה ליצור משתנה שמכיל בתוכו רווחים ולהדפיס אותו לפני כל תו. כיוון שבגו אין דרך קלילה ואלגנטית להכפיל תו במספר, אני פשוט אוסיף למשתנה שלי רווח בכל איטרציה.
func main() { space := "" for _, c := range "Hello World" { fmt.Println(space + string(c)) space += " " } }

HTML
חשבתי לעצמי שאני אתחכם ואבצע את המשימה ב-HTML.
לא נגעתי המון ב-HTML בשנים האחרונות, אבל למיטב זכרוני מגיל 15, כל מה שכותבים בקובץ HTML פשוט מגיע למסך כמו שהוא, לא?
זה היה ניסיון המימוש הראשון שלי ב-HTML –
<html>
<body>
H
e
l
l
o
W
o
r
l
d
</body>
</html>
ובכן… לא.
התוצאה שקיבלתי נראתה כך –

אז, כן, שכחתי ש-HTML לא סתם חוזר על כל מה שיש בקובץ, שזה מאוד הגיוני כשאני חושבת על זה.
אז אם אני רוצה רווחים וירידות שורה, כדאי שאני אגיד לו את זה.
אני זוכרת שהסינטקס לירידת שורה הוא <br>, אז אני אוסיף אותו לקוד.
<html>
<body>
H<br>e<br>l<br>l<br>o<br>w<br>o<br>r<br>l<br>d
</body>
</html>
עכשיו, מה לגבי רווחים?
ובכן, html מכניס רווח אחד בלבד בין כל שתי מילים, לא משנה כמה רווחים הכנסתן, ולכן יש תו מיוחד שמכריח את html להכניס רווחים נוספים –
אז הניסיון הבא שלי הוא הזוועה הזו –
<html>
<body>
H<br> e<br> l<br> l<br> o<br> <br> w<br> o<br> r<br> l<br> d
</body>
</html>
כן, זה עובד, אבל אוי ואבוי כמה שזה נראה נורא.
כבר עמדתי לומר נואש, ואז מצאתי את הפתרון הנחמד הבא – להשתמש ב- <pre>.
<pre> הוא תג שמשמש להצגה של טקסט בדיוק כמו שהוא נמצא בקוד (קיצור של preformatted).
כך שבעזרתו אני יכולה להשתמש בפיתרון הראשוני שלי –
<html>
<body>
<pre>
H
e
l
l
o
W
o
r
l
d
</pre>
</body>
</html>
מגניב, למדתי משהו חדש!
זהו להיום.
יש לי עוד כמה שפות בקנה שיצטרפו בקרוב, ובתקווה אני אזכה לקבל מכן כמה פתרונות בעוד שפות מעניינות.
כרגיל, קוד בגיט – https://github.com/mgershovitz/maya_solves/tree/master/hello_world
את מכירה במקרה את הפרויקט הנפלא הזה:
https://github.com/gothinkster/realworld
?
אני מאוד התלהבתי, גיליתי אותו לפני כמה ימים בפודקאסט של מתכנתים חסרי תרבות
לא הכרתי, אני אסתכל!
רעיון חמוד מאוד!
הנה מימוש אחד במטלב:
function HelloWorld()
str = ‘Hello World!’;
for i = 1:length(str)
disp([repmat(‘ ‘, 1, i-1),str(i)]);
end
end
הפונקציה repmat משכפלת מטריצה. הארגומנטים האחרים שהיא מקבלת הם 1 ו-i-1, כי אנחנו רוצים לשכפל את המחרוזת ‘ ‘ פעם אחת לגובה ו-i-1 פעמים לרוחב.
אבל אז חשבתי, אם אנחנו גם ככה מתייחסים למחרוזת שלנו כמטריצה, בואי ניקח את זה עד הסוף, וכתבתי את המימוש
function HelloWorld()
str = ‘Hello World!’;
disp(diag(str))
end
הפונקציה diag מקבלת וקטור ומחזירה מטריצה אלכסונית, עם אותו וקטור כאלכסון.
מגניב מאוד, איזו פונקציה שימושית ומעניינת!
אם מתאים לך שאני אוסיף את הקוד שלך לפוסט הבא שלח לי בבקשה הודעה למייל 🙂
maya.solves@gmail.com
היי מאיה, בלוג מעולה.
הנה המימוש שלי בפאסקל (יעבוד גם בדלפי כמובן):
Program HelloWorld(output);
var
i: integer;
C: Char;
space: String;
S : String;
begin
space := ‘ ‘;
S := ”;
for C in ‘Hello World’ do
begin
S := S + space;
writeln(S + C);
end;
end.
כמו בפייתון הלולאה רצה על התווים בעצמה אז רק צריך להגדיל את הרווח בכל איטרציה.
מגניב!
תודה רבה רבה!
רעיון מגניב (וכתוב יפה). הנה הגרסה שלי בסקאלה. בלי לולאות, אלא עם מיפוי של כל תו לצמד של התו והמקום שלו, ואז מיפוי של הצמד למחרוזת עם ההזחה המתאימה, ואז איחוד של המחרוזות עם מפריד של שבירת שורה.
println(“hello, world!”.zipWithIndex.map( p => ” “*p._2+p._1 ).mkString(“\n”))
הי,
ולי יש אחד באליקסיר – דומה לקוד של מיכאל אבל עם reduce במקום אינדקסים…
“`
“Hello World”
|> String.graphemes
|> Enum.map(fn char -> char “\n” end)
|> Enum.reduce(
{ “”, “” },
fn next_char, { spaces, text } ->
{ spaces ” “, text spaces next_char }
end
)
|> elem(1)
|> IO.puts
“`
לגבי HTML ניתן לכתוב סימן רווח באמצעות הקוד שלu
סימן & ואחריו nbsp ולסיום ;
כתבתי כך, כי אין לי מושג אם זה לא יהפוך לרווח ואז לא יראו כלום