דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. ארכיון code613m
  4. להטוטי JS - והפעם לולאות מקוצרות

להטוטי JS - והפעם לולאות מקוצרות

מתוזמן נעוץ נעול הועבר ארכיון code613m
10 פוסטים 5 כותבים 1.0k צפיות 5 עוקבים
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
תגובה
  • תגובה כנושא
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • A
    A
    avr416
    כתב ב נערך לאחרונה על ידי
    #1

    אז הנה להטוט חמוד שיצא לי להכיר היום בJS undefined

    קורה שצריך לפעמים לכתוב לולאה שרצה מהסוף להתחלה (למשל כשרוצים לרוץ על מערך ולחסר ממנו איברים)
    ב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- שזה אמת, והוא היה ממשיך לבצע את הלולאה עד אין סוף למספרים השליליים undefined

    פורסם במקור בפורום CODE613 ב07/11/2017 01:32 (+02:00)

    תגובה 1 תגובה אחרונה
    1
    • א
      א
      אהרן
      כתב ב נערך לאחרונה על ידי
      #2

      @ארכיטקט

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

      פורסם במקור בפורום CODE613 ב07/11/2017 01:59 (+02:00)

      תגובה 1 תגובה אחרונה
      2
      • dovidD
        dovidD
        dovid
        ניהול
        כתב ב נערך לאחרונה על ידי
        #3

        https://en.wikipedia.org/wiki/Code_golf

        בשולי הדברים, אני הייתי כותב בC# ככה:

        for (var i = demo.Count - 1; i > -1; i--)
        

        אגב בשורה6 בקוד C# חסר המינוס 1.

        פורסם במקור בפורום CODE613 ב07/11/2017 02:08 (+02:00)

        • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
        • בכל נושא אפשר ליצור קשר dovid@tchumim.com
        תגובה 1 תגובה אחרונה
        0
        • A
          A
          avr416
          כתב ב נערך לאחרונה על ידי
          #4

          @אהרן

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

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

          if (arr.length) שאם המערך ריק אז התנאי לא יתקיים, ואם הוא מלא - אז כן.
          

          אמנם מי שרגיל לc# או לjava לא יבין מה הולך פה..

          פורסם במקור בפורום CODE613 ב07/11/2017 07:41 (+02:00)

          תגובה 1 תגובה אחרונה
          2
          • dovidD
            dovidD
            dovid
            ניהול
            כתב ב נערך לאחרונה על ידי
            #5

            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)

            • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
            • בכל נושא אפשר ליצור קשר dovid@tchumim.com
            תגובה 1 תגובה אחרונה
            1
            • dovidD
              dovidD
              dovid
              ניהול
              כתב ב נערך לאחרונה על ידי
              #6

              אגב mat הכיר לי את הפורום הזה https://codegolf.stackexchange.com/
              הספורט שם זה למצוא מימוש קצר ביותר לבעיות באיזה שפה שרוצים וגם לעשות דברים בלתי הגיוניים (להוציא מקוד תוצאה זוועתית ביותר), בקיצור להפיק את מיטב הכיף מטריקים.

              פורסם במקור בפורום CODE613 ב07/11/2017 08:51 (+02:00)

              • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
              • בכל נושא אפשר ליצור קשר dovid@tchumim.com
              תגובה 1 תגובה אחרונה
              0
              • M
                M
                magicode
                כתב ב נערך לאחרונה על ידי
                #7

                זה הביצוע הנכון לדעתי.

                [1,2,3,4,5,6,7,8,9,10,11,12,13].filter((a,i) => i % 3 !== 0)
                

                פורסם במקור בפורום CODE613 ב07/11/2017 09:11 (+02:00)

                תגובה 1 תגובה אחרונה
                2
                • נתנאלנ
                  נתנאלנ
                  נתנאל
                  כתב ב נערך לאחרונה על ידי
                  #8

                  אחרי שאתה מתרגל לחשוב בראש של השפה (למשל ש0 זה גם false), אז זה נהיה לך קריא ומובן

                  זה כל כך נכון!! זה ממש ראש אחר, בפרט הקטע עם === שזה באמת חוסך הרבה קוד, שגם , תופס לך undefing 0 "" ו --false ביחד!

                  פורסם במקור בפורום CODE613 ב07/11/2017 09:24 (+02:00)

                  הצטרפות לרשימת התפוצה בעניני תכנות JS , React , Node וכל מיני דברים מענינים כאן :cool:
                  https://programing-tips.web.app/

                  תגובה 1 תגובה אחרונה
                  0
                  • א
                    א
                    אהרן
                    כתב ב נערך לאחרונה על ידי
                    #9

                    מה זה
                    https://codegolf.stackexchange.com/questions/147224/downgrade-to-a-palindrome/147255#147255
                    בינארי?

                    פורסם במקור בפורום CODE613 ב07/11/2017 14:42 (+02:00)

                    תגובה 1 תגובה אחרונה
                    0
                    • dovidD
                      dovidD
                      dovid
                      ניהול
                      כתב ב נערך לאחרונה על ידי
                      #10

                      @אהרן

                      מה זה
                      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)

                      • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
                      • בכל נושא אפשר ליצור קשר dovid@tchumim.com
                      תגובה 1 תגובה אחרונה
                      0

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

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

                      בעזרת התרומה שלך, הפוסט הזה יכול להיות אפילו טוב יותר 💗

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


                      בא תתחבר לדף היומי!
                      • התחברות

                      • אין לך חשבון עדיין? הרשמה

                      • התחברו או הירשמו כדי לחפש.
                      • פוסט ראשון
                        פוסט אחרון
                      0
                      • דף הבית
                      • קטגוריות
                      • פוסטים אחרונים
                      • משתמשים
                      • חיפוש
                      • חוקי הפורום