Блог пользователя RodionGork

Автор RodionGork, 13 лет назад, По-русски

На столе лежат в ряд палочки. Можно брать одну палочку или две соседних. Тот кто берёт последнюю проигрывает.

Т.е. если группа палочек разделена промежутком (уже кто-то взял или так было в начальной позиции) - то нельзя взять две палочки по обе стороны промежутка.
И выиграет тот, кто вынудит противника взять последнюю палочку.

Пример:

начальная позиция:
XXXXXX
После хода игрока А
XX__XX
После хода игрока B
XX___X
После хода игрока A
______X
Игрок B берёт последнюю и проигрывает.

Очевидно, что любая позиция может быть либо выигрышной (если существует ход переводящий её в проигрышную), либо проигрышной (если любой ход делает её выигрышной). Пример проигрышной позиции 1 палочка, пример выигрышной - пустой стол.

Стратегия игры очевидно напрямую связана с возможностью определять выигрышность позиции.

Требуется внятный алгоритм определения выигрышности позиции. Мне он неизвестен. Статьи по такой именно игре вроде есть в сети, но они не обязательно описывают алгоритм (или не обязательно в доступных терминах). Буду рад помощи!

Кстати, с интересом заметил что рейтинг всех моих старых постов находится на уровне минус 200-300 баллов. По-моему даже JKeeJ1e30 такого не удостаивался. Польщён, весьма польщён! (Вот соплежуям озорникам некуда технический гений направить!) :D

UPD: вижу что случилось какое-то массовое обнуление "вкладов". Чем дальше, тем любопытственнее.

  • Проголосовать: нравится
  • +6
  • Проголосовать: не нравится

13 лет назад, # |
  Проголосовать: нравится -6 Проголосовать: не нравится
http://e-maxx.ru/algo/sprague_grundy - Функция Гранди
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Ну и как этим воспользоваться в нашем случае? Просто покажите как свести эту игру к НИМ чтобы можно было вычислить заданную позицию нерекуррентно?
13 лет назад, # |
Rev. 3   Проголосовать: нравится -8 Проголосовать: не нравится

я обязательно когда-нибудь научусь читать условия задач =/

очевидно, что серии подряд идущих "XXX" никак не влияют друг на друга, поэтому можно рассуждать так:

пусть d[i] - ответ для i подряд идущих X, тогда из i можно походить в i-1, i-2, или разбить на две кучки с количеством подряд идущих X, равным, соответственно, j и k, для которых ответ будет d[j] xor d[k]

ответ для 0 и 1 тривиален, остальные можно вычислить, переберя все возможные переходы и выбрать значением функции минимальное из не использовавшихся результатов

если непонятно почему это так - читаем теорию

если d[n] равно нулю, то это проигрышная ситуация, иначе выигрышная

  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Александр, привет. Я тупой наверное, поэтому прояви пожалуйста терпение и поясни:

    1 - это проигрышная позиция, значит d[1] = 0?
    Единственный переход из этой позиции ведёт в 0... Чему, стало быть, равно d[0]?
    • 13 лет назад, # ^ |
        Проголосовать: нравится +1 Проголосовать: не нравится
      да, d[1] = 0

      d[0] никогда не должно использоваться, иначе это означает, что мы кучку размера i разделили на 0 и i-0, чего быть не может

      я обычно инициализирую d[0] = 1, хотя не знаю, насколько это можно назвать корректным

      ещё вопросы? :)
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        О-о-о... неочевидно. Но спасибо... ;-)

        Но явно моя тупость превозмогает. Поэтому извини и поясни пожалуйста ещё - как считается d для позиции из нескольких кучек. Например d[2, 2] (я думаю тоже должно быть равно 0)...
        • 13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          результат игры для нескольких кучек - это их общий ксор

          d[2] xor d[2] = 0, да, это действительно проигрышная позиция

          P. S. весь топик со всеми твоими комментариями похож на троллинг, но я учитываю, что связи между срачем в соседнем треде и этим топиком может и не быть ;)
          • 13 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            Хм. А (d[3] xor d[3]) или (d[1] xor d[1]) - они то не 0? Я согласен что я идиот, но не пойму этой арифметики... думаю... думаю...

            Это не троллинг. Это демка к вот этому комменту.
        • 13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          хм, блин, а не олень ли я? :)

          эта задача отличается от классической или я что-то упускаю? =)
          • 13 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            Поскольку я соображаю гораздо медленнее тебя, я не могу точно сказать. Я её придумал лет десять назад (ну просто в детской книжке читал про аналогичную игру где выигрывает взявший последнее - т.е. с симметричной стратегией - и задумался что делать, если наоборот). Несколько раз задавал по форумам, начиная с фидо - мне всегда тыкали в какие-то непонятные статьи, так что я пока в обломе. Сейчас сижу думаю над твоими разъяснениями. Про ксор мне тоже надо подумать... я не тормоз... не тормоз... просто медленный очень.
            • 13 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится
              блин, она не классическая :D

              не, тогда решение неверно, её сперва нужно как-то свести к классической, а потом только решать описанным способом
              • 13 лет назад, # ^ |
                Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

                А... Т.е. думать мне ещё рано? ;-)

                Насколько я понимаю тут по-моему вот это "очевидно, что серии подряд идущих XXX никак не влияют друг на друга" не вполне верно.

                Я пытался когда был маленький найти какие-то формулы для вычисления выигрышности/проигрышности группы из нескольких кучек (типа В+П=В) - но по-моему нашлись контрпримеры и эта идея потерпела неуспех. Правда возможно надо было рассматривать кучки из 1 палочки как отдельную категорию... Впрочем мои чайницкие рассуждения здесь вряд ли уместны. :-(

                • 13 лет назад, # ^ |
                    Проголосовать: нравится 0 Проголосовать: не нравится
                  они и правда не влияют друг на друга ;)

                  думаю, что эта задача решается сведением каждой кучки к одной палочке, а потом подсчёту количества одиноких палочек
                  • 13 лет назад, # ^ |
                    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

                    Ну да, в смысле на будущее друг друга они не влияют. Я хотел сказать что их влияние на оценку позиции из нескольких кучек мне неочевидно.

                    В позиции 1+3 например кучку 3 надо сводить не к одинокой палочке а к двум одиноким палочкам.

                    • 13 лет назад, # ^ |
                        Проголосовать: нравится 0 Проголосовать: не нравится
                      читаем вики про вариацию нима, известную как "мизер"
                      • 13 лет назад, # ^ |
                          Проголосовать: нравится +1 Проголосовать: не нравится
                        Э... Ну согласен что я опять тупой, но я не понял что это даёт. Можно ли доформулировать мысль? Поскольку количество кучек может увеличиваться в ходе игры, мне не ясно как должна выглядеть стратегия сводящая всё к набору одиноких палочек.

                        ыыыыыыыыыыыыыыыыыыыыыыыыы
                        • 13 лет назад, # ^ |
                            Проголосовать: нравится 0 Проголосовать: не нравится
                          кажется, что всё очень просто на самом деле

                          d[1] = 0
                          d[2] = 1
                          d[3] = 2
                          d[4] = 0

                          дальше делаем так, как описано у меня выше

                          но если кучка делится на x и 1, то смотрим d[x]: если d[x] > 0, то текущее значение функции равно нулю, иначе единице

                          ыыыыыыыыыыыыыыыыыыыыыыы
                          • 13 лет назад, # ^ |
                            Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

                            проверяли?... ибо я проверил и у мну не сошлось с брутом...

                            • 13 лет назад, # ^ |
                                Проголосовать: нравится 0 Проголосовать: не нравится
                              нет, не проверял

                              если не сошлось, значит где-то у меня логическая ошибка

                              сейчас даже попытаюсь подумать, где
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
А правда, что эта игра эквивалентна такой? Есть исходные палочки, дырка и ещё одна палочка отдельно. Правила ходов те же. Проигрывает тот, кто не может сделать ход.

Кажется, что да. Если позиция в старой игре выигрышная, просто делаем тот же ход, что и в старой игре, не обращая внимания на отдельную палочку. Если позиция в старой игре проигрышная, у нас есть дополнительная возможность убрать отдельную палочку. В этом случае у противника есть ответ, приводящий к выигрышу: интуитивно кажется, что позиция без отдельной палочки не может быть проигрышной и в игре “проигрывает тот, кто сделал последний ход”, и в игре “проигрывает тот, кто не может ходить”.

Если это правда, то применяем к этой модифицированной игре теорию Гранди в чистом виде.
  • 13 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

    и это проверил... не сходится ни с брутом, ни с идеей Alex_KPR...

  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Ну... по-моему нет. Если я правильно понял идею.

    В "модифицированной версии" любая комбинация типа 1+K+K (т.е. одна палочка и ещё две кучки равной величины) является выигрышной - забираем одинокую палочку и дальше ведём симметричную игру. Естественно что первым кто не сможет сделать ход, будет наш противник.

    Однако если бы игры были эквивалентны, то это означало бы что в "старой версии" любая комбинация K+K проигрывает. На примере (1+1=В и 2+2=П) видно что это не так.
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
набросал перебор
результат (размер/выигрышная или проигрышная/если выигрышная, то куда ходить):

1: 0 
2: 1 .X
3: 1 ..X
4: 0 
5: 1 .XXXX
6: 1 ..XXXX
7: 1 X.XXXXX
8: 1 X..XXXXX
9: 0 
10: 1 .XXXXXXXXX
11: 1 ..XXXXXXXXX
12: 0 
13: 1 .XXXXXXXXXXXX
14: 1 ..XXXXXXXXXXXX
15: 1 X.XXXXXXXXXXXXX
16: 1 X..XXXXXXXXXXXXX
17: 1 XX.XXXXXXXXXXXXXX
18: 1 XX..XXXXXXXXXXXXXX
19: 1 X..XXXXXXXXXXXXXXXX
20: 0 
21: 1 .XXXXXXXXXXXXXXXXXXXX
22: 1 ..XXXXXXXXXXXXXXXXXXXX
23: 1 XX..XXXXXXXXXXXXXXXXXXX
24: 1 XXXXX..XXXXXXXXXXXXXXXXX
25: 1 XXXXXX.XXXXXXXXXXXXXXXXXX