ברוכים הבאים לאתר תחרויות קודגורו! › פורומים › חידות › אף אחד לא פתר את שאלה 33
- This topic has 17 תגובות, 7 משתתפים, and was last updated לפני 19 שנים, 7 חודשים by יוני.
-
מאתתגובות
-
24 באפריל 2005 בשעה 14:03 #77742CodeGuruמנהל בפורום
33. (**) מה תחזיר התוכנית הבאה?
int s(unsigned __int64 x){return (!x || x&(x-1));}
int r()
{
unsigned __int64 i,m1,m2;
int r = 0;
int j;
for (i=1; i; i++,r+=j==
for (j=0,m1=0xff,m2=0x101010101010101; j<8; j++,m1<<=8, m2<<=1)
if (s(i&m1) || s(i&m2)) break;
return r;
}25 באפריל 2005 בשעה 01:52 #80169תומרמשתתףכותרת: אפשר בפסקל?
25 באפריל 2005 בשעה 07:55 #80170יובלמשתתףכותרת: ערך ההחזרה לא מוגדר. אי אפשר לדעת אם j בהתחלה
הוא 8 או לא (לא איתחלתם אותו, והוא מתאפס מיד אח"כ. r לא משפיע בשום מקום על התוכנית), ולכן אין אפשרות לדעת מה הוא ערך ההחזרה של התוכנית.25 באפריל 2005 בשעה 10:38 #80172יונימשתתףכותרת: אני חושב ..
שזה יחזיר 1.
ה1 יתקבל כש i = 0x8040201008040201ULL25 באפריל 2005 בשעה 12:23 #80173CodeGuruמנהל בפורוםכותרת: רצ"ב ב-PASCAL
function s(x:integer64):boolean;
begin
s := (x=0) or ((x and (x-1))!=0)
end;function r:integer;
var r1,j:integer;
i,m1,m2:integer64;
b:boolean;
begin
r1:=0;
for i:=1 to 0 do
begin
m1:=255; m2:=72340172838076673; b:=true;
for j=1 to 8 do
begin
if (s(i and m1) or s(i and m2)) b:=false;
m1 := m1 shl 8; m2:= m2 shl 1;
end;
if (b) r1:=succ(r1)
end;
r:=r1
end25 באפריל 2005 בשעה 12:58 #80174אורמשתתףכותרת: אפשר קצת עזרה בלהבין את הקוד?
לפי מה שאני יודע הסימנים & || ו ! נועדו בשביל להיות משומשים בתנאים…
אבל מאחר ובמקרה הזה משתמשים בהם על מספרים, הם פה הם מקבילים לפקודות האסמבלי and, or, not?25 באפריל 2005 בשעה 13:12 #80175יונימשתתףכותרת: תגובה לאור (שריר?)
מה קורה אור ?
בכל מקרה, הסימנים && || ו! משמשים באמת להתניות.
הסימנים & | (ובמקרה הזה גם >>) הם האופרטורים הלוגיים. (לא משתמשים כאן בNOT, NOT מסומן ע"י מטילדה ~ )
כשאתה עושה !n תקבל 1 אם n הוא 0, אחרת תקבל 0.
כשאתה עושה || על X ו Y תקבל 1 אם X=1 או אם Y=1, אחרת תקבל 0.
לעומת זאת, כשאתה עושה | על X או Y, הביטים של התוצאה יקבלו 1 או 0 לפי כל ביט של X וY.
כך גם לגבי && ו &.
אם אתה צריך עוד הסברים בקשר לקוד, תגיד25 באפריל 2005 בשעה 13:14 #80176יונימשתתףכותרת: מטילדה = טילדה lol
25 באפריל 2005 בשעה 13:14 #80177יונימשתתףכותרת: מטילדה = טילדה lol
25 באפריל 2005 בשעה 14:48 #80178יונימשתתףכותרת: הבנתי את הטעות שלי .. + הסברים
לא יודע למה, אבל משום מה התייחסתי רק למקרה בו הסיבית הדלוקה בבייט הראשון צריכה להיות הראשונה, בבית השני השנייה וכו´, כשבעצם כל מיקום אפשרי כל עוד הם שונים אחד מהשני .
לא ממש הבנתי את השאלות ש"נשארו פתוחות":
מה הפונקציה מחשבת ?
כמו שיבגני אמר, את 8 עצרת – כמה מיקומים שונים אפשריים לסיבית אחת דלוקה בתוך בייט …
איך היא מחשבת ?
כדי שערכו של המונה (r) יעלה, נדרש שj יהיה שווה ל8, זה יקרה רק כאשר לא יופעל הbreak. ( או יופעל הbreak באיטרציה האחרונה של הלולאה, מה שלא יכול לקרות – אם 2 סיביות ממוקמות באותו מקום בתוך הבייטים שלהם, הבעיה תזוהה לפני האיטרציה האחרונה).
משמע 8 פעמים s(i&m1) || s(i&m2) צריך להיות שקרי.
m1 הוא הבייט FF (כולו 1ים), שזז כל איטרציה שמאלה 8 צעדים. כדי שs(i&m1) יחזיר שקר 8 פעמים, נדרשת סיבית אחת (בדיוק) דולקת בכל בייט.
m2 הוא 0x010101… צריך לשים לב שזה בהקס, זה בעצם סיבית אחת דולקת בכל בייט, ובכל איטרציה הסיבית זזה שמאלה צעד אחד. כדי שs(i&m2) יחזיר שקר 8 פעמים, נדרש שבכל איטרציה תחפוף סיבית אחת של m2 לסיבית אחת של i. בגלל שהסיביות של m2 ממוקמות באותו מקום בתוך כל בייט, הסיביות של i חייבות להתפזר בצורה שונה בכל בייט.25 באפריל 2005 בשעה 16:30 #80179Olimpus teamמשתתףכותרת: 8 עצרת (40320)
25 באפריל 2005 בשעה 16:45 #80180CodeGuruמנהל בפורוםכותרת: הפתרון של יבגני נכון
והשאלה שנותרה היא מה בדיוק מחשבת הפונקציה הזו, ואיך?25 באפריל 2005 בשעה 16:56 #80181Olimpus teamמשתתףכותרת: הסבר
הפונקציה S בודקת האם במספר יש יותר מסיבית אחת או אפסהלולאה עם J בודקת:
1. שכל בית ב i הוא בעל סיבית אחת דלוקה (בעזרת m1
2. שבכל בית הסיבית הדלוקה היא במיקום שונה (בעזרת m2 )ולכן הפונקציה r מוצאת את כל הקומבינציות הללו שמספרן הוא 8 עצרת
26 באפריל 2005 בשעה 08:53 #80182אור (שריר)משתתףכותרת: דווקא כשהתחלתי להתקרב לתשובה…כבר יש פתרון…
תודה יוני על העזרה בתירגום הסימנים…
גם הוספת הקוד בפסקל עזרה להבהיר לי עוד כמה דברים…
ושכבר מצאתי באנטרנט משמעות לביטוי (x&(x-1)! (בדיקה אם מספר הוא חזקה של 2, או כמו שנאמר שיש לו ביט אחד דולק)
בדקתי את הפורום רק כדי לראות אם כבר פתרו את השאלה…26 באפריל 2005 בשעה 13:22 #80183יונימשתתףכותרת: 8 מלכות bitwise
מה שצריך להוסיף לקוד כדי לשפר אותו מפיתרון 8 צריחים ל8 מלכות הוא ההבדל בין מלכה לצריח, אכילה באלכסון ..
לכן נוסיף עוד 2 בדיקות מלבד ה2 שכבר קיימות כרגע (זו שמוודאת כי ישנה מלכה בכל שורה, וזו שמוודאת שהמלכות מפוזרות בטורים שונים), הן יוודאו שהמלכות נמצאות על אלכסונים שונים.
כדי לעשות זאת, נבדוק – אם ישנה מלכה בטור הראשון בשורה הראשונה – לא תהיה מלכה בטור השני בשורה השנייה, בטור השלישי בשורה השלישית וכו´ (כנ"ל לגבי האלכסון ההפוך).
לכן מתחילים מערך ההקס 0x8040201008040201 שמוצב ל2 משתנים ובכל תור נזיז כל ביט ימינה עבור אחד, ושמאלה עבור השני.
הקוד יראה כך: http://www.rafb.net/paste/results/AmLRa918.htmlיכול מאד להיות שיש לי טעויות, אשמח לשמוע תיקונים
-
מאתתגובות
- יש להתחבר למערכת על מנת להגיב.