התגובות שלי בפורום
-
מאתתגובות
-
אורמשתתף
כותרת: אפשר קצת עזרה בלהבין את הקוד?
לפי מה שאני יודע הסימנים & || ו ! נועדו בשביל להיות משומשים בתנאים…
אבל מאחר ובמקרה הזה משתמשים בהם על מספרים, הם פה הם מקבילים לפקודות האסמבלי and, or, not?אורמשתתףכותרת: אולי תעלה את הקובץ לאיזה שהוא שרת?
אורמשתתףכותרת: עכשיו זה הרבה יותר מובן… רק יש לך באג קטן…
אתה צריך לעשות בדיקה שהמספר האחרון מתקשר חזרה ל 0…
אני מניח שבטח הרצת את זה וזה יצא לך בסדר…
אבל זה רק מקרה פרטי שבטח נגרם כתוצאה מבחירה של סדר האפשרויות של הצעדים.למרות שאולי ניתן להוכיח שאם הצלחת למלות את כל הלוח עד כה אז חייב להיות קישור, אבל כל עוד אף אחד לא הציג הוכחה כזאת צריכים לעשות בדיקה…
במיוחד אם תרצה להסב את התוכנית שלך למציאת כל הפתרונות הקיימים…
(ואז גם כמובן להוסיף בדיקה לפתרונות מראה וסימטריה….)אורמשתתףכותרת: הסבר לקוד
אני אתחיל עם המתארים של החוק..
ai(p(Num,X,Y),Board,FinalBoard).
p(Num,X,Y) הוא האיבר האחרון שהכנסתי לרשימה שמתארת את הלוח…
כאשר Num הוא המשפר ויש לו את הקורדינטות X ו Y.
(כעיקרון אני לא באמת צריך 3 מתארים אבל בזמן הכתיבה זה היה לי יותר נוח מאשר לפצל את הרשימה בראש החוק).
Board הוא הלוח אשר בנוי מרשימה של איבר p(Num,X,Y)…
בקריאה הראשונה לחוק צריך לקרוא לו עם המספר 0 ואני בחרתי לצורך הנוחות תמיד למקם את 0 במשבצת 1,1. לכן הקריאה לחוק תיהיה ככה:
a(p(0,1,1),[p(0,1,1)],FinalBoard).
בגוף החוק אני פשוט מוודא שהמספר קטן מ 63 ואז שם ב PNum את המספר העוקב הבא.
אז אני פשוט הבעתי את כל אפשרויות התזוזה בפרולוג כאשר הן מפרדות ב; על מנת שבמקרה ומתישהו והחוק נכשל במציאת מקום למספר כלשהו אז בחזרה תבחר אפשרות אחרת.
אחרי שנבחרת איזו שהיא משבצת, יש בדיקה שהמשבצת לא תפוסה:
not(member(p(_,X,Y),Board)
כלומר שלא קיים איבר ברשימה בעל מיקום X ו Y שתואם את ה X ו Y החדשים.
לאחר מכן אני פשוט מבצע קריאה רקורסיבית לחוק כאשר אני מוסיף לרשימה את המספר החדש עם המיקום שלו.
כלל העצירה של הרקורסיה הוא אחרי שממקימים את המספר 63 ואז נעשית בדיקה שהוא אכן במרחק חמש מ 0…
(למרות שיש לי הרגשה שאולי אם כבר מצליחים למקם את 63 ביחס ל62 אז הוא גם חייב להיות במרחק חמש מ 0.אם משהו עדיין לא מובן, אז יכול להיות זה בגלל חוסר ההכרות עם פרולוג.
היא עובדת הצורה שונה מתכנות רגיל, כך שבמקום להשתמש במשפטי if לולאות וכל מני בדיקות אחרות, פה כל חוק(חוק הוא כמו פרוצדורה אבל לא בדיוק) הוא רצף של "תנאים" אשר אם אחד מהם נכשל אז חוזרים תנאי אחד אחורה ונעשית בדיקה אם יש עוד דבר המקיים את התנאי.
לכן בפרולוג רקורסיה היא הרבה יותר נפוצה בגלל שאין לולאות.מי שמעניין אותו פרולוג, יכול להיכנס לקישור שהבאתי…
זה ספר אלקטרוני מאוד טוב שמסביר לעומק את פרולוג.
ואם מישהו מחפש מפענח(אני לא ממש יודע מה המילה המוסכמת ל interperter) לפרולוג, יש אחד טוב מאוד והוא אף בקוד פתוח.
http://www.swi-prolog.orgאורמשתתףכותרת: אפשר הסבר לקוד הC?
מאחר ואני לא מבין יותר מדי בC… ועוד יותר אני לא מכיר את כל הקיצורים שיש בC…מהמעט שאני יודע אתה יכול להסביר למה בלולאת הfor אין הגדלה של i ואין הגבלה לן?
בנוסף למה למשפט התנאי שבלולאה אין חלק של then …
(אני רק מניח שאולי זה איזה שהוא קיצור שעוצר את הלולאה…)
עוד דבר… אני לא רואה איך במקרה שאין צעד אפשרי תהיה חזרה אחורה ובחירת צעד אחר…אורמשתתףכותרת: סתם מתוך עיניין… איזה נגן mp3 קיבלת?
אורמשתתףכותרת: דאגת לבדוק שהמקירים הם לא סימטרים?
אורמשתתףכותרת: זה דווקא כן 64….
המספר 63 מתחבר גם ל0….אורמשתתףכותרת: רעיון
אני עדיין לא יודע איך אפשר ללא מחשב אבל שמתי לב לכמה דברים שאולי יובילו לתשובה.
אם מסתכלים על המספרים שנמצאים בקצוות אז סיפרת היחידות שלהן בדר"כ(אם זה היה תמיד אולי כבר היה לי כלל לעקוב אחריו)
מתאימה לסיפרת היחידות בקצה לידה…
לדוגמא:
39/49
14/54
37/47
16/56
וכו´..עוד דבר שמתי לב כתוצאה מהראשון שאולי יש איזהשהו עיניין של סכומים או הפרשים בכל אלכסון…
מאחר ויש בהתחלה סידרה של הפרשים שחוזרת על עצמה…
10
40
10
40בנוסף גם שמתי לב שאלכסון אחד במרובע הזה הוא רק מספרים אי זוגים ואלכסון שני הוא רק מספרים זוגיים…
אורמשתתףכותרת: שחכתי להוסיף… זה כמובן לא הפיתרון היחיד…
אורמשתתףכותרת: תוספת קטנה ששכחתי… הקוד…
ai(p(63,X,Y),FinalBoard,FinalBoard):-
last(FinalBoard,p(0,NX,NY)),
(
(abs(NX-X) =:= 3,abs(NY-Y)=:=4)
;
(abs(NX-X) =:= 4,abs(NY-Y)=:)
;
(abs(NX-X) =:= 5,NY=:=Y)
;
(abs(NY-Y) =:= 5,NX=:=X)
).
ai(p(Num,X,Y),Board,FinalBoard):-
Num<63,
PNum is Num+1,
(
( (X=<img src="smileys/heart.gif" width="" height="" alt="<3" title=",NX is X+5,NY is Y) ; (X>=6, NX is X-5,NY is Y) )
;
( (Y=<img src="smileys/heart.gif" width="" height="" alt="<3" title=",NY is Y+5,NX is X) ; (Y>=6,NY is Y-5,NX is X) )
;
( (X==4, NX is X-3) , (Y==5, NY is Y-4))
;
( (X==5,NX is X-4) , (Y==4, NY is Y-3))
),
not(member(p(_,NX,NY),Board)),
ai(p(PNum,NX,NY),[p(PNum,NX,NY)|Board],FinalBoard).כדי לראות בצורה טובה יש להעביר למצב LTR
אורמשתתףכותרת: שלב נוסף?
אתה מוכן לפרט על השלב הנוסף הזה?אורמשתתףכותרת: מה הכוונה הזדמנות נוספת?
גם מי שכבר עשה את המבחן ושלח אותו יכול לעשות את המבחן שוב פעם שניה?אורמשתתףכותרת: איך מתקדם הנושא הזה?
אני לא רוצה להיות נודניק אבל מה קורה עם התמונות והקודים?
למרות שאני מניח שיש לכם עוד דברים על הראש, אבל אני גם לא רואה מה הבעיה בלהעלות לאתר את הקודים של השורדים ומספר תמונות…אורמשתתףכותרת: אני חושב שהוא התכוון למפתח לתוכנה ולא לקוד המקור
-
מאתתגובות