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

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

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

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

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

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

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

    פורסם במקור בפורום 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

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

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

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