ברוכים הבאים לאתר תחרויות קודגורו! › פורומים › אקסטרים › האצת זמן
- This topic has 3 תגובות, 2 משתתפים, and was last updated לפני 18 שנים, 10 חודשים by DL!.
-
מאתתגובות
-
29 בינואר 2006 בשעה 13:06 #77103zelcrowמשתתף
האם האצת זמן עובדת כמו שצריך?
ניסיתי להאיץ בלולאה פשוטה(שתי פקודות) עד 1000.
זה אמור לקחת 2000 פקודות. 2000 פקודות זה לכל היותר 2000 סיבובים, כלומר היה יכול לרדת לי לכל היותר 400 אנרגיה
לכן היה צריך להשאר לי לכל הפחות 600. כלמור המהירות היתה אמורה להיות כ-10, אך ראיתי הכפלה רק של כ-2.
מישהו נתקל במשהו דומה? אולי אני לא הבנתי משהו?
29 בינואר 2006 בשעה 13:28 #78571DL!משתתףהמקסימום שאתה יכול לשאוף אליו הוא לקבל אופקוד אחד נוסף בכל סיבוב, ז"א במקרה הטוב ביותר תקבל זמן מעבד כפול מהרגיל.
תקרא שוב את הקטע באתר שמסביר את נושא האצת הזמן…29 בינואר 2006 בשעה 13:55 #78568zelcrowמשתתףבאמת טעות שלי.
אבל יש עדיין משהו שאני לא מבין. ערך המקסימלי של אנרגיה הוא 65535.
לפי הנוסחה
Speed = log2(Energy) + 1
ערך המהירות נע בין 1 ל-17, ולא בין 0 ל-10כיצד בדיוק העסק מחושב?
29 בינואר 2006 בשעה 14:33 #78567DL!משתתף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);
} -
מאתתגובות
- יש להתחבר למערכת על מנת להגיב.