אף אחד לא פתר את שאלה 33

עמוד
מוצגות 15 תגובות – 1 עד 15 (מתוך 18 סה״כ)
  • מאת
    תגובות
  • #77742
    CodeGuru
    מנהל בפורום

    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==8)
    for (j=0,m1=0xff,m2=0x101010101010101; j<8; j++,m1<<=8, m2<<=1)
    if (s(i&m1) || s(i&m2)) break;
    return r;
    }

    #80169
    תומר
    משתתף

    כותרת: אפשר בפסקל?

    #80170
    יובל
    משתתף

    כותרת: ערך ההחזרה לא מוגדר. אי אפשר לדעת אם j בהתחלה
    הוא 8 או לא (לא איתחלתם אותו, והוא מתאפס מיד אח"כ. r לא משפיע בשום מקום על התוכנית), ולכן אין אפשרות לדעת מה הוא ערך ההחזרה של התוכנית.

    #80172
    יוני
    משתתף

    כותרת: אני חושב ..
    שזה יחזיר 1.
    ה1 יתקבל כש i = 0x8040201008040201ULL

    #80173
    CodeGuru
    מנהל בפורום

    כותרת: רצ"ב ב-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
    end

    #80174
    אור
    משתתף

    כותרת: אפשר קצת עזרה בלהבין את הקוד?
    לפי מה שאני יודע הסימנים & || ו ! נועדו בשביל להיות משומשים בתנאים…
    אבל מאחר ובמקרה הזה משתמשים בהם על מספרים, הם פה הם מקבילים לפקודות האסמבלי and, or, not?

    #80175
    יוני
    משתתף

    כותרת: תגובה לאור (שריר?)
    מה קורה אור ? =P
    בכל מקרה, הסימנים && || ו! משמשים באמת להתניות.
    הסימנים & | (ובמקרה הזה גם >>) הם האופרטורים הלוגיים. (לא משתמשים כאן בNOT, NOT מסומן ע"י מטילדה ~ )
    כשאתה עושה !n תקבל 1 אם n הוא 0, אחרת תקבל 0.
    כשאתה עושה || על X ו Y תקבל 1 אם X=1 או אם Y=1, אחרת תקבל 0.
    לעומת זאת, כשאתה עושה | על X או Y, הביטים של התוצאה יקבלו 1 או 0 לפי כל ביט של X וY.
    כך גם לגבי && ו &.
    אם אתה צריך עוד הסברים בקשר לקוד, תגיד :-)

    #80176
    יוני
    משתתף

    כותרת: מטילדה = טילדה lol

    #80177
    יוני
    משתתף

    כותרת: מטילדה = טילדה lol

    #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 חייבות להתפזר בצורה שונה בכל בייט.

    #80179
    Olimpus team
    משתתף

    כותרת: 8 עצרת (40320)

    #80180
    CodeGuru
    מנהל בפורום

    כותרת: הפתרון של יבגני נכון
    והשאלה שנותרה היא מה בדיוק מחשבת הפונקציה הזו, ואיך?

    #80181
    Olimpus team
    משתתף

    כותרת: הסבר
    הפונקציה S בודקת האם במספר יש יותר מסיבית אחת או אפס

    הלולאה עם J בודקת:
    1. שכל בית ב i הוא בעל סיבית אחת דלוקה (בעזרת m1
    2. שבכל בית הסיבית הדלוקה היא במיקום שונה (בעזרת m2 )

    ולכן הפונקציה r מוצאת את כל הקומבינציות הללו שמספרן הוא 8 עצרת

    #80182
    אור (שריר)
    משתתף

    כותרת: דווקא כשהתחלתי להתקרב לתשובה…כבר יש פתרון… :(
    תודה יוני על העזרה בתירגום הסימנים…
    גם הוספת הקוד בפסקל עזרה להבהיר לי עוד כמה דברים…
    ושכבר מצאתי באנטרנט משמעות לביטוי (x&(x-1)! (בדיקה אם מספר הוא חזקה של 2, או כמו שנאמר שיש לו ביט אחד דולק)
    בדקתי את הפורום רק כדי לראות אם כבר פתרו את השאלה…

    #80183
    יוני
    משתתף

    כותרת: 8 מלכות bitwise
    מה שצריך להוסיף לקוד כדי לשפר אותו מפיתרון 8 צריחים ל8 מלכות הוא ההבדל בין מלכה לצריח, אכילה באלכסון ..
    לכן נוסיף עוד 2 בדיקות מלבד ה2 שכבר קיימות כרגע (זו שמוודאת כי ישנה מלכה בכל שורה, וזו שמוודאת שהמלכות מפוזרות בטורים שונים), הן יוודאו שהמלכות נמצאות על אלכסונים שונים.
    כדי לעשות זאת, נבדוק – אם ישנה מלכה בטור הראשון בשורה הראשונה – לא תהיה מלכה בטור השני בשורה השנייה, בטור השלישי בשורה השלישית וכו´ (כנ"ל לגבי האלכסון ההפוך).
    לכן מתחילים מערך ההקס 0x8040201008040201 שמוצב ל2 משתנים ובכל תור נזיז כל ביט ימינה עבור אחד, ושמאלה עבור השני.
    הקוד יראה כך: http://www.rafb.net/paste/results/AmLRa918.html

    יכול מאד להיות שיש לי טעויות, אשמח לשמוע תיקונים :)

מוצגות 15 תגובות – 1 עד 15 (מתוך 18 סה״כ)
  • יש להתחבר למערכת על מנת להגיב.