אתגר (כי הופאק כתב שישמח לאחד)

אתגר (כי הופאק כתב שישמח לאחד)

נתון "לוח שח מט" (64 משבצות). מישהו פיזר 64 מטבעות על המשבצות, כך שחלקם במצב "ראש" (1) וחלקם במצב "עץ" (0) באקראי.

הוכנס אדם א' למול הלוח, נאמר לו מספר שלם כלשהו בין 1 ו-64. מותר לאותו אדם להפוך מטבע יחיד על הלוח (מותר, לא חייב) והוא מורחק מהמקום.
מוכנס אדם ב' למול הלוח, ועליו להגיד מה המספר שנאמר לאדם הראשון.

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

הנה "שלד" לתחילת הפתרון (כמובן שלא חייבים להשתמש בו).

קוד:
<!doctype html>
<html>
    <head>
        <meta charset='utf8'>
        <title>CALC ...</title>
        <style type='text/css'>
            span.crc { background-color:yellow; }
            span.on { background-color:yellow; }
        </style>
        <script type='text/javascript'>
            'use strict';
            var m_Bits = [];
            var m_BitSpans = [];
            var c_MaxByte = 64;
            function Init() {
                var i;
                for (i = 1; i < c_MaxByte; i++) {
                    m_Bits[i] = document.getElementById('chk'+i);
                    m_BitSpans[i] = document.getElementById('sp'+i);
                    m_Bits[i].onclick = function() {CalcCs();};
                }
            }
           
            function MakeRandom() {
                var i;
                var stam;
                for (i in m_Bits) {
                    stam = Math.random();
                    if (0.5 > stam) {
                        m_Bits[i].checked = true;
                        m_BitSpans[i].className = 'on';
                    } else {
                        m_Bits[i].checked = false;
                        m_BitSpans[i].className = 'bit';
                    }
                }
                CalcNumber();
            }
           
            //Calculate this yourself 
            function CalcCs() {
                var val = 0;
                document.getElementById('spValue').innerHTML = val;
                return 0;
            }
           
           
            //Calculate this yourself 
           function CalcBitToChange(wishedVal) {
               var ans = 0;
               
               document.getElementById('spChangeBit').innerHTML = "toggle bit " + ans;
               return ans;
           }
           
        </script>
    </head>
    <body onload = 'Init();'>
        <script type='text/javascript'>
            var f_Str = "<span class='bit' id='sp$i' title='$i'><input type='checkbox' id='chk$i'></span>";
            var f_Line = '';
            var i = 0;
            for (i =1; i<=c_MaxByte; i++) {
                f_Line = f_Str;
                while (f_Line.indexOf('$i') >= 0) {
                    f_Line = f_Line.replace ("$i",i).replace ("$i",i)
                    
                }
                document.write (f_Line);
        &nbsp
 

rj111

New member
אני חושב שמה שחסר זה שאדם א צריך לתאם אסטרטגיה לפתרון עם

אדם ב.
 
לספק רמז?


 
יש 3 פתרונות (רמזים בפנים).

הפתרון הראשון מתבססים על הצפנת האמנר. (6 אזורים "לא זרים", כל אזור מהווה ביט של התשובה, החלוקה כזו שניתן בהיפוך של ביט יחיד "אמיתי" להפוך ערך של כל אחד מהאזורים בנפרד).
&nbsp
&nbsp
&nbsp
&nbsp
הפתרון השני - מימוש של אלגוריתם תיקון שגיאות mnp5. הרעיון הוא להפוך ביט יחיד כך שיתקבל ערך שגיאה של ביט אחר.
&nbsp
&nbsp
&nbsp
&nbsp
הפתרון השלישי (הפשוט ביותר למימוש) - כל משבצת בלוח מקבלת ערך מספרי. הערך המספרי של כל הלוח הוא xor של כל ערכי המשבצות שהמטבעות עם "עץ" עליהן (מצב "1"). אם אתה רוצה לדעת איזה מטבע להפוך כדי לקבל ערך אחר, בצע xor עם הערך הרצוי.
&nbsp
בהמשך אעלה פתרון מבוסס על MNP5. (סתם כי קיבלתי יום חופש).
&nbsp
 
למעלה