האצת זמן

עמוד
מוצגות 4 תגובות – 1 עד 4 (מתוך 4 סה״כ)
  • מאת
    תגובות
  • #77103
    zelcrow
    משתתף

    האם האצת זמן עובדת כמו שצריך?

    ניסיתי להאיץ בלולאה פשוטה(שתי פקודות) עד 1000.

    זה אמור לקחת 2000 פקודות. 2000 פקודות זה לכל היותר 2000 סיבובים, כלומר היה יכול לרדת לי לכל היותר 400 אנרגיה

    לכן היה צריך להשאר לי לכל הפחות 600. כלמור המהירות היתה אמורה להיות כ-10, אך ראיתי הכפלה רק של כ-2.

    מישהו נתקל במשהו דומה? אולי אני לא הבנתי משהו?

     

    #78571
    DL!
    משתתף

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

    #78568
    zelcrow
    משתתף

    באמת טעות שלי.

    אבל יש עדיין משהו שאני לא מבין. ערך המקסימלי של אנרגיה הוא 65535.

    לפי הנוסחה

    Speed = log2(Energy) + 1
    ערך המהירות נע בין 1 ל-17, ולא בין 0 ל-10

    כיצד בדיוק העסק מחושב?

    #78567
    DL!
    משתתף

    Following are the relevant code snippets from the engine:

    /** Maximum possible Warrior speed. */
    private final int MAX_SPEED = 16; // when Energy = 0xFFFF

    /**
     * Returns the warrior's current speed, using the following formula:
     * Speed := Min(MAX_SPEED, 1+Log2(Energy))
     *
     * This formula forces the warrior to put more and more effort in order to
     * increase its speed, i.e. non-linear effort.
     * 
     * @param energy The warrior's Energy value.
     * @return the warrior's current speed,
     */
    private int calculateWarriorSpeed(int energy) {
       if (energy == 0) {
          return 0;
       } else {
          return Math.min(MAX_SPEED, 1 + (int)(Math.log(energy) / Math.log(2)));
       }
    }

    /**
     * Determines whether or not a given warrior deserves an extra opcode,
     * by calculating the warrior's current speed (using its current Energy
     * value), and comparing it against a random value.
     *
     * We use a random-based algorithm (as opposed to a deterministic one) for
     * the following reasons:
     *  a) simple implementation – there is no need to keep record of past
     *     decisions as our algorithm is stateless.
     *  b) we want the warrior's speed to vary between x1.0 to x2.0, and this
     *     solves the issue of determining what to do if the current speed is x1.7 :)
     *
     * @param warrior The warrior.
     * @return true if the warrior deserves an extra opcode, otherwise
     * returns false.
     */
    private boolean shouldRunExtraOpcode(Warrior warrior) {
       int energy = Unsigned.unsignedShort(warrior.getEnergy());
       int speed = calculateWarriorSpeed(energy);
      
       return (rand.nextInt(MAX_SPEED) < speed);
    }

מוצגות 4 תגובות – 1 עד 4 (מתוך 4 סה״כ)
  • יש להתחבר למערכת על מנת להגיב.