רובוטים על מסילה

כלמנ

New member
רובוטים על מסילה

_0_ _0_ ---| |--- ---| |--- |___| |___| | | | | ======O=============O============= יש שני רובוטים על מסילה, במרחק לא ידוע אחד מהשני. גם לא ידוע מי מימין ומי משמאל. לפני שהם זזים הם מתיזים כתם שמן על המסילה, שמסמן את מיקומם. ואז הם מתחילים לזוז לפי תוכנית שהכינו להם מראש. בשפת התכנות שלהם יש חמש פקודות: left: זז שמאלה מרווח אחד right: זז ימינה מרווח אחד SkipIf : מדלג על הפקודה הבאה אם הוא נמצא על נקודת שמן goto <Label>l : קופץ לשורת הליבל המתאימה label <Label>l : שורת ליבל הרובוטים מבצעים שורה בשניה. לרובוטים לא חייבת להיות אותה התוכנה מטרה: לכתוב לרובוטים תוכנה שתגרום להם להתנגש
 

Crurifragium

New member
כמה שאלות

1. המסילה, לצורך החידה, היא אינסופית לשני הכיוונים? 2. הם מתיזים שמן כל פעם לפני שזזים, או רק בנקודת ההתחלה לפני התזוזה הראשונה?
 

כלמנ

New member
כן ולא

1 המסילה אינסופית לשני הכוונים כמובן, כמו כל מסילה ממוצעת. 2 מתיזים שמן פעם אחת. לפני שמתחילים לזוז. לפני התזוזה הראשונה.
 

Crurifragium

New member
label

זה מיקום בתוכנית. אם אתה נותן, למשל, את הפקודה left אז הרובוט יזוז שמאלה. ואז ימלא את ההנחיה הבאה. אז בשביל שיזוז שמאלה בלי הפסקה תצטרך תוכנית בגודל אינסופי עם פקודות Left חוזרות. הרעיון של label הוא שאתה נותן שם מסויים לקטע בתוכנית הפעולה, ואז יכול לתת פקודה שמחזירה לאותו קטע. ואז בשביל, למשל, לזוז שמאלה בלי הפסקה, אתה כותב label A left goto A
 

Crurifragium

New member
פתרון אפשרי

לשני הרובוטים אותה תוכנית. מזיזים אותם בכיוון קבוע, בקצב איטי (סימולציה ע"י תנועה חזרה, כי אין פקודה לחכות), לאותו הכיוון. ברגע שאחד מהם הגיע לכתם שמן, זה אומר שהוא בכיוון הנכון אל הרובוט השני (בכיוון התנועה הוא מאחור, ולא מוביל), ואז הוא עובר לתזוזה מהירה (רצוף). במקרה זה אני מזיז את שניהם שמאלה. label slowmove left right left skipif goto slowmove label fastmove left goto fastmove
 

Crurifragium

New member
אבל אני סקרן

אם יש פתרון יותר יעיל. או אם יש הגיון שכדאי לשים לפיו תוכניות שונות לשני הרובוטים.
 

כלמנ

New member
יפה מאוד

זאת התשובה שאני מכיר, לא שמעתי על פתרון אחר (או יותר טוב)
 
עוד פתרון אפשרי

רובוט א' לא זז כלל. רובוט ב' מתעלם מכתמי השמן. הוא זז מקום אחד שמאלה, אח"כ 2 מקומות ימינה, אח"כ 4 מקומות שמאלה, 8 מקומות ימינה, וכו' וכו' - בשלב מסוים הוא יהיה חיב להתנגש ברובוט א'.
 

Crurifragium

New member
לא פתרון טוב, כי

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