להטוטי JS - והפעם לולאות מקוצרות
-
אז הנה להטוט חמוד שיצא לי להכיר היום בJS
קורה שצריך לפעמים לכתוב לולאה שרצה מהסוף להתחלה (למשל כשרוצים לרוץ על מערך ולחסר ממנו איברים)
בC# היינו כותבים את הקוד ככה:var demo = new List<int> { 1,2, 3, 4,5, 6, 7, 8, 9, 10, 11, 12, 13 }; for (var i = demo.Count; i > 0; i--) { Console.WriteLine(demo[i-1]); if (demo[i - 1] % 3 == 0) demo.Remove(demo[i]); }
כלומר, הלולאה כוללת 3 חלקים, אינדקס, תנאי שכל זמן שהוא מתקיים הלולאה תתבצע, ופקודה שמתבצעת בסיום כל איטרציה --i.
כמו כן, כדי לגשת לאינדקס הנכון במערך אנו כותבים i-1 כיון שהאינדקסים מתחילים מ0, והcount מחזיר לנו את הכמות שהיא מבוססת על 1.אולם, בJS אפשר לכתוב את אותו קוד בצורה כזו:
var arr = [1,2,3,4,5,6,7,8,9,10,11,12,13] for(var i = arr.length; i--;){ console.log(arr[i]) if(arr[i]%3 ===0) arr.splice(i) }
הטריק כאן הוא בשורה ה2 וה3
והוא בנוי על 2 הנחות בJS:
0 זה שווה גם לשקר - false (אא"כ כותבים ===),
ולכן בלולאה מספיק לכתוב רק 2 פרמטרים מתוך 3, וזה לא זורק שגיאה, כי בעצם אנו גם מגדירים תנאי (דהיינו כל זמן שi הוא לא שקר, דהיינו לא 0. וגם מפחיתים כל פעם את המונה ישירות, כי ברגע שהוא בודק את התנאי הוא כבר מפחית אותו, ולא רק כשהוא מסיים לבצע את הלולאה, וכאן אנו מגיעים לשורה ה3 שאנו יכולים להתייחס לאינדקס ישירות כפחות 1, ולא צריכים להפחית ממנו 1 כמו שעשינו בC#. (שהרי האורך של המערך גדול ב1 מהאינדקס, כיון שהאינדקס מתחיל מ0).
צריך לשים לב, שאם היינו כותבים
i-- ולא כמו שכתבנו, זה היה יכול לגרום ללולאה אין סופית, כיון שבמידה והערך הההתחלתי היה 0, הוא היה קודם מבצע את ההשמה, ואז היה לו 1- שזה אמת, והוא היה ממשיך לבצע את הלולאה עד אין סוף למספרים השלילייםפורסם במקור בפורום CODE613 ב07/11/2017 01:32 (+02:00)
-
מנהג מגונה נוסף בקרב מתכנתים מסויימים, הוא השימוש הנכלולי בטיפוסיות החלשה של השפה על מנת "לחסוך בקוד" ולבצע להטוטים "עילויים" להגיע לתוצאות מבריקות. מבלי להשקיע שבריר של מחשבה על מי יתחזק את הזבל הזה שהוא מותיר אחריו.
פורסם במקור בפורום CODE613 ב07/11/2017 01:59 (+02:00)
-
@ארכיטקט
מנהג מגונה נוסף בקרב מתכנתים מסויימים, הוא השימוש הנכלולי בטיפוסיות החלשה של השפה על מנת "לחסוך בקוד" ולבצע להטוטים "עילויים" להגיע לתוצאות מבריקות. מבלי להשקיע שבריר של מחשבה על מי יתחזק את הזבל הזה שהוא מותיר אחריו.בכוונה השתמשתי בכותרת בלשון "להטוטי" כדי שיהיה מובן שזה המשך לדברי ארכיטקט.
עקרונית, אני מסכים איתו. אם כי, אחרי שאתה מתרגל לחשוב בראש של השפה (למשל ש0 זה גם false), אז זה נהיה לך קריא ומובן, וממילא גם אין בעיה לתחזק את זה..
למשל: הרבה פעמים תמצא שכתוב משהו כמוif (arr.length) שאם המערך ריק אז התנאי לא יתקיים, ואם הוא מלא - אז כן.
אמנם מי שרגיל לc# או לjava לא יבין מה הולך פה..
פורסם במקור בפורום CODE613 ב07/11/2017 07:41 (+02:00)
-
avr416 הדוגמא השניה שהבאת היא קריאה לחלוטין, ואילו הראשונה לא.
בגלל שכשאתה קורא את כותרת הfor אתה רואה קוד "לא מתאים", ובמקום לקרוא מה התכוון המתכנת אתה "לומד" מה הקוד שלו יבצע - ואינך משוכנע שלכך הוא התכוון! כי זה לא שפת התבטאות זה שפת תוצאה.
בגלל שזה גם לא חוסך שום ביצועים ואפי' לא שורות קוד, זה נחשב עבירה לשמה כזאת לולאה...בwhile זה היה עולה בשורה נוספת אך מובן בהרבה. גם בC# בכאלה מקרים לפעמים לולאה סטנדרטית טובה יותר.
var i = demo.Count; while (i-- > 0) if (demo[i] % 3 == 0) demo.Remove(demo[i]);
אבל עדיין לוקח יותר זמן לקורא את הwhile החכם הזה מfor.
אפרופו להטוטי JS, זה לא קשור להבדל בן השפות, גם בC# יש מקום להתגדר בטריקים שהורסים את הקריאות, אלא שבJS אפשר להתדרדר לזה בקלות רבה, ובJS המון המון מפתחים לא "בקטע" של תכנות נכון כלל.
נ.ב. בsplice יש להוסיף פרמטר שני, ערך אחד 1, אחרת הוא מסיר כל מה שלמעלה ממנו.
פורסם במקור בפורום CODE613 ב07/11/2017 08:21 (+02:00)
-
אגב mat הכיר לי את הפורום הזה https://codegolf.stackexchange.com/
הספורט שם זה למצוא מימוש קצר ביותר לבעיות באיזה שפה שרוצים וגם לעשות דברים בלתי הגיוניים (להוציא מקוד תוצאה זוועתית ביותר), בקיצור להפיק את מיטב הכיף מטריקים.פורסם במקור בפורום CODE613 ב07/11/2017 08:51 (+02:00)
-
-
מה זה
https://codegolf.stackexchange.com/questions/147224/downgrade-to-a-palindrome/147255#147255
בינארי?פורסם במקור בפורום CODE613 ב07/11/2017 14:42 (+02:00)
-
מה זה
https://codegolf.stackexchange.com/questions/147224/downgrade-to-a-palindrome/147255#147255
בינארי?שפת תכנות jelly: https://github.com/DennisMitchell/jelly
פורסם במקור בפורום CODE613 ב07/11/2017 14:55 (+02:00)