Есть много задачек про бедных гномиков, но над этой я дольше всего пыхтел, и даже думал, что доказал, что она не решаема — а она решаема.

Итак, стандартная история:

Хитрый, но справедливый троль наловил много гномиков (много — значит неизвестно сколько точно, может дюжину, а может и на много больше). Посадил их в тёмную пещеру, где ничего не видно, и надел каждому гномику по шапочке, красную или синюю, в случайном порядке. И сказал, что завтра на рассвете будет выводит гномиков по одному и ставить гуськом в ряд, так что самый последний увидит все затылки гномиков перед ним, следующий всех последующих и так далее, а самый первый будет любоваться рассветом, но никого из собратьев видеть не будет.
Затем, начиная с самого последнего, троль будет спрашивать у каждого гномика какого цвета шапочка у него на голове. Тех кто правильно угадают цвет своей шапочки — троль отпустит, а тех кто не угадает — троль съест. Каждый гномик может отвечать только «синяя» или «красная», больше ничего говорить и делать нельзя.

У гномиков есть время до утра придумать стратегию с наименьшими потерями, помогите гномикам.

Комментарии (17)


  1. Ogoun
    01.09.2014 10:29

    Мой ответ
    Последний гном называет цвет шапки впередистоящего, при это 50%50 что он погибнет, предпоследний называет цвет своей шапки и точно выживает. Со следующей парой итерация повторяется. Тем самым при случайном распределении выжить может больше 70% гномов.


    1. imbeat
      01.09.2014 10:29

      Написал, потом подумал и понял, что был неправ.


    1. alhimik45
      01.09.2014 10:29

      Спойлер
      Примем белый цвет за 1, чёрный за 0. Последний гном ксорит(XOR) значения всех впереди стоящих и говорит его. Следующий ксорит всех впереди стоящих и предыдущий ответ, получая цвет своего колпака. Следующий опять ксорит всех впереди с предыдущими ответами. И так далее.
      Таким образом все кроме одного выживут 100% и Последний с верояностью 50 %


      1. alhimik45
        01.09.2014 10:29

        s/чёрный/синий
        s/белый/красный


      1. Ogoun
        01.09.2014 10:29

        Вы уверены что алгоритм правильный?
        Например для:
        var a1 = 1 ^ 0 ^ 1 ^ 0 ^ 1 ^ 1;
        var a2 = a1 ^ 0 ^ 1 ^ 0 ^ 1 ^ 1;
        var a3 = a2 ^ 1 ^ 0 ^ 1 ^ 1;
        var a4 = a3 ^ 0 ^ 1 ^ 1;
        var a5 = a4 ^ 1 ^ 1;
        var a6 = a5 ^ 1;
        получим 010001, вместо ?01011.


        1. alhimik45
          01.09.2014 10:29

          Да
          Вы немного неправильно поняли суть.
          Возьмём Вашу последовательность: 101011
          Тогда алгоритм такой:
          var a1 = 0 ^ 1 ^ 0 ^ 1 ^ 1; // 1
          var a2 = a1 ^ 1 ^ 0 ^ 1 ^ 1; //0
          var a3 = a1 ^ a2 ^ 0 ^ 1 ^ 1; //1
          var a4 = a1 ^ a2 ^ a3 ^ 1 ^ 1; //0
          var a5 = a1 ^ a2 ^ a3 ^ a4 ^ 1; //1
          var a6 =a1 ^ a2 ^ a3 ^ a4 ^ a5; //1


          1. Ogoun
            01.09.2014 10:29

            Теперь понял, спасибо)


    1. Ogoun
      01.09.2014 10:29

      Данные в задаче неполные, если троль сразу съедает неправильно ответивших, это даст дополнительную информацию впередистоящим.

      Еще вариант
      Гномы знают про операцию XOR, тогда гномы разбиваются на тройки, в каждой тройке последний гном говорит XOR цветов впередистоящих:
      синий — синий = красный
      синий — красный = синий
      красный — синий = синий
      красный — красный = красный,

      В этом случае однозначно выживают двое впередистоящих. Из каждой тройки выживут точно двое, это уже 66%, и из оставшихся может выжить до половины, т.е. вполне может выжить 83% гномов.


    1. Xazzzi
      01.09.2014 10:29

      Вариант для гномов, которые не знают про операцию XOR.

      Скрытый текст
      В двух вариантах ответов можно зашифровать, например, «четный» и «нечетный». Далее, примем красный цвет равный 1, а синий будет 0. Первый гном суммирует цвета шапок всех остальных, используя этот код. И результат сообщает вслух (например, красный – «четный», «синий» — нечетный – у гномов есть вся ночь, чтобы договориться об этом).
      Второй гном, услышав шифр, так же суммирует всех стоящих впереди. Если результат совпадает с тем, что сказал первый гном, значит цвет его шапки не повлиял на общую сумму. Стало быть, это «ноль» — синий. Если результат изменился, значит это «единица» — красный.

      Третий и последующий гномы считают не только тех, кого видят впереди, но и ответы предыдущих гномов. И так же сравнивают результат с шифром самого первого гнома, вычисляя разницу (цвет своей шапки).
      Этот способ позволяет выжить N-1 гному. Общее количество гномов при этом не имеет значения, задача решается для любого N. Самый первый гном не обязательно погибает: с вероятностью 50% шифр может совпасть с цветом его шапки и тогда он останется жив и здоров.
      Отсюда.


      1. PapaBubaDiop
        01.09.2014 10:29

        Ладно, что 2, что 7, что 10 цветных шапок — решение не меняется, гласные тянуть не надо.



  1. zelyony
    01.09.2014 10:29

    теперь такими постами на Хабре карму будут качать?


  1. zakon35
    01.09.2014 10:29

    Характер гномиков является переменной в данной задачке?


  1. PapaBubaDiop
    01.09.2014 10:29

    Автор! Для Вас резко усложню задачу — шапочки трех цветов. Для упрощения — 100 гномиков. Сколько выживет?


  1. anonymous
    01.09.2014 10:29


  1. AndersonDunai
    01.09.2014 10:29

    Спасение n или n-1 гномов.

    Скрытый текст
    Каждый гном — это узел, который должен кроме того, что спасти себя, передать информацию следующим. Каким образом?
    А таким, что впереди все будут слышать попытку стоящего сзади и также результат — выжил или нет.
    Итак: первый гном считает разницу красных и синих шапочек, которые видит (их есть n-1 штук) и озвучивает остаток от деления сего числа на 2, кодируя его в цвет, соответствующий договоренности гномов, например, 0 — синий, 1 — красный, и либо выжывает, либо нет. НО зато следущший гном, услышав число и подсчитав количество гномов, которые есть перед ним и их цвета (а их уже n-2), сравнивает свой остаток с предыдущим и уже наверняка узнаёт, какой у него цвет. Далее все следующие гномы должны слышать, что говорят у них за спинами, и производить соответствующие вычисления в голове. Вуаля!


  1. aapetrov3
    01.09.2014 10:29

    Вот еще одно усложнение задачи: число гномиков счетное(то есть гномики находятся в биективном соответствии с натуральными числами), спрашивается, можно ли спасти всех, кроме конечного числа гномиков.