ברוכים הבאים לאתר תחרויות קודגורו! › פורומים › אקסטרים › Alef
- This topic has 5 תגובות, 3 משתתפים, and was last updated לפני 15 שנים, 8 חודשים by aantn.
-
מאתתגובות
-
3 במרץ 2009 בשעה 09:31 #76851CodeGuruמנהל בפורום
כפי שאמרתי לפני כמה שעות – מה תעשו אם השורדים היו מבזבזים את הפצצה החכמה שלהם? רצ"ב קוד מקור של אלף
push ds
pop es
int 87h
mov bx,ax
add ax,ax
inc ax
mul bx
mov [00000h],ax
w:
cmp word [bx],'CG'
jne wהשאר (בית עד וו) הם זהים, אלא שהכתובת אפס מתחלפת ב
0ded, 1bda, 29c7, 37b4, 45a1אפשר להרוג את כולם תוך פחות מ200 פקודות.
בהצלחה!3 במרץ 2009 בשעה 13:57 #78120aantnמשתתףכמעט פטרתי את הבעיה היום, אך נגמר לי הזמן. (לא חשבתי על פצצות חכמות)
צריך למצוא פטרון למשוואה הריבועית
2X^2 + X – Aהוא הערך שהסורד כתב אל הכתובת 0 A
אפשר למצוא את הפטרון למשוואה על ידי שימוש בנוסחה:
x1, x2 = (-b +- sqrt(b^2 – 4ac)) / 2a
זאת אומרת, שצריך לכתוב תוכנית אסמבלי מהצורה:
move ax, [0] ; move to ax the value that alef wrote to 0x0
mul 8
add ax, 1
sqrt ax ; (replace the non-existent sqrt opcode with your own code to find a square root)dec ax
mov cl, 4
div clALהפטרון למשוואה נמצאת ב
(אני כמעט בתוח שאין צורך לחשב את הפתרון השני למשוואה [כי הוא יהיה שלילי], אבל לא חשבתי על זה מספיק להיות 100% בתוח)
עוד הערה: כמובן, צריך להחליף את השורה הרביעית במשהו מתאים (אפשר למצוא אלגוריתם למציאת שורש ריבועי על האינטרנת בקלות)
עוד לא בדקתי את התוכנה במחשב, ולכן תרגיש חופשי לתקן אותי אם תעיתי למעלה
4 במרץ 2009 בשעה 11:29 #78119GalDorמשתתףIt's more difficult than that – doing sqrt modulu 0x10000 is not like takinga normal sqrt – and there are no negative numbers, as -x is equivalent to 0x10000-x. Actually, you can't even divide by two – 0x4000*2=0xc000*2=0x8000.
6 במרץ 2009 בשעה 04:05 #78118aantnמשתתףFor an algorithm in assembly to find a square root see http://www.azillionmonkeys.com/qed/sqroot.html.
I'm not sure what you meant about the division.
7 במרץ 2009 בשעה 01:36 #78117GalDorמשתתףThat gives you a non-natural number!
I have managed to prove that the odd numbers with square roots modulo 0x10000 are the numbers of the form 8x+1. If A is a root of 8x+1, then the others are:
-A, 0x8001*A, 0x7FFF*A
And there four roots, not two!
Anyhow, about division, it too has many solutions – division by 2 gives (if A is one solution):
A+0x8000*k
and division by 4:
A+0x4000*k
and so on. The point is, we are dealing with modular arithmatic, not the normal arithmatic, so even though the equation works, your algorithm won't, and you're neglecting a lot of subtleties.7 במרץ 2009 בשעה 12:46 #78115CodeGuruמנהל בפורוםמי שיכתוב שורד שמנצח את ששת השורדים אלף עד וו מוזמן לשלוח כמה פעולות זה לוקח לו (בנתיים אל תשלחו את השורד עצמו, כדי לא לקלקל לאחרים את ההנאה בפתרון).
כאמור, השורד שלי פותר בפחות מ200 צעדים, ואפשר עוד לשפר אותו. -
מאתתגובות
- יש להתחבר למערכת על מנת להגיב.