Программа для тайного санты через телефон

Обновлено: 07.07.2024

Чтобы помочь вам организовать лучший обмен подарками, попробуйте приложение Secret Santa. Мы собрали лучшие приложения Secret Santa для Android и iOS, чтобы ваш праздник прошел без сучка и задоринки.

1. Эльфийская звезда

Вы можете выбрать, будет ли обмен подарком происходить лично или удаленно. В последнем случае любому, кто подписывается на обмен, будет предложено ввести свой адрес, чтобы все оставалось в секрете между дарителями.

Наконец, вы можете приглашать людей множеством способов: из контактов на телефоне, от друзей Elfster, через связанное приглашение или введенное вручную.

Все, что вы хотите от приложения Secret Santa, можно найти в Elfster. И это совершенно бесплатно. Дать ему шанс.

2. Хранитель секретов Санты

Для начала назовите свою группу, установите минимум и максимум цены и введите инструкции (например, время и место обмена). Затем создайте свою группу и добавьте всех по имени и адресу электронной почты. При необходимости вы можете запретить определенным людям давать другим.

Связанный: Как сделать свою рождественскую открытку в Photoshop

3. Секретный помощник Санты

Как администратор, вы можете установить правила сопряжения, чтобы люди, которые не знают друг друга, не создавались. Однако, возможно, вам это не понадобится, так как вам будет предложено дать подсказку для подарка, которая поможет зажечь идеи.

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

4. Приложение Secret Santa

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

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

Связанный: Игры для рождественской вечеринки в офисе, чтобы подарить праздничное настроение

5. Тайный Санта 22

С Secret Santa 22 легко создать свою группу Secret Santa за минуту. Он проведет вас через каждый этап процесса, попросит указать название вашей группы, бюджет и т. Д. Интерфейс не загроможден, что делает его хорошим выбором для приложения Secret Santa, если вам не нужно ничего особенного.

Единственным недостатком этого приложения является то, что у него есть премиум-версия, которая удаляет рекламу и позволяет вам устанавливать правила для исключения подарков. Учитывая, что другие приложения, которые мы здесь рассмотрели, позволяют делать это бесплатно, мы не советуем вам обновляться.

Используйте эти приложения, чтобы провести лучшего секретного Санта-Клауса

Если приложения не для вас, существует множество веб-сайтов и интеграций для таких сервисов, как Slack, которые могут помочь вам разместить Secret Santa.


Привет, Хабр! В этой статье я приведу простой алгоритм, позволяющий группе из N человек секретно сгенерировать каждому из участников группы номер другого участника — одариваемого — для обмена подарками на Новый год в мероприятии Тайный Санта (Secret Santa).

Прежде всего, что такое Тайный Санта? Статья в Википедии рассказывает это лучше меня, я лишь кратко скажу, что это церемония, пришедшая к нам с Запада, в которой группа людей сговаривается подарить на Новый год друг другу подарки таким образом, что каждый из участников дарит и получает по одному подарку, при этом каждому не известен его даритель, но известен одариваемый (отсюда "тайный Санта"). Стоимость подарков обычно оговаривается заранее, чтобы все подарки были примерно равноценны. При желании можно условиться, что после того, как обмен подарками совершится, дарители раскроются.

Свой "Тайный Санта" есть и на Хабрахабре под названием "Клуб Анонимных Дедов Морозов".

К сожалению, для организации Тайного Санты просто сгенерировать список пар даритель-одариваемый недостаточно. Дарение должно происходить анонимно, и каждый участник должен знать только номер одариваемого и ни битом информации больше о других участниках, поэтому, например, нельзя просто поручить одному из участников сгенерировать список и сообщить каждому оставшемуся участнику его одариваемого — тот, кто сгенерировал список, будет знать всё обо всех, в том числе и своего дарителя.

Как правило, участники выходят из положения, прибегая к помощи "третьей стороны" — незаинтересованного человека, не участвующего в церемонии, которого просят сгенерировать номера одариваемых и тайно сообщить каждому участнику единственный номер. Такой "третьей стороной" может быть не только человек, но и специализированный сайт, к числу которых относится и уже упомянутый "Клуб АДМ" Хабрахабра.

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

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

Как и остальные децентрализованные алгоритмы для Тайного Санты, этот алгоритм не требует "третьей стороны" — участникам достаточно только общаться между собой. Всё, что требуется каждому участнику, — это дважды получить от участника с предыдущим номером набор натуральных чисел, изменить его определённым образом и передать следующему. После того, как обмен наборами завершится, каждый участник определённым образом формирует из имеющихся у него наборов единственное натуральное число — номер одариваемого.

Сразу скажу, у такого подхода не очень много преимуществ по сравнению с тем, чтобы просто привлечь "третью сторону", но пара плюсов всё-таки есть:

  • Это просто весело — поиграть на НГ в "Тайного Санту" с криптографией. Хорошо подойдёт компании гиков.
  • Не требуется искать человека со стороны, организовывать его общение с каждым из участников.
  • Не требуется регистрироваться ни на каком сайте, нужны только сами участники и минимум технических средств общения обычным текстом. При физической встрече участников не нужно ничего, кроме ручки и бумаги. Для общения на расстоянии подойдёт что угодно — электронная почта, SMS, IRC.

Для начала, небольшое соглашение о том, как представлять конкретный набор, сопоставляющий дарителей и одариваемых, с математической точки зрения.

Назначение одариваемых в Тайном Санте — не что иное, как назначение каждому из участников группы из N человек номера от 1 до N, означающего номер одариваемого (если считать, что все участники пронумерованы от 1 до N). При этом:

  • Никому не должен достаться свой собственный номер (тк нельзя дарить себе самому);
  • Не должно быть номеров, никому не доставшихся (тк все должны быть одарены);
  • Номер каждого участника достаётся ровно одному дарителю (тк каждый должен получить ровно 1 подарок).
  • Двум участникам может выпасть дарить подарки друг другу — в принципе это совершенно нормально, но иногда участники могут условиться перебрасывать жребий в этом случае.
  • На номера могут накладываться другие дополнительные ограничения в зависимости от ситуации (например, если в "Санте" участвуют несколько семей, они могут условиться перебрасывать жребий, если кому-то из участников выпало делать подарок члену своей семьи).

Отсюда видно, что любой список пар даритель-одариваемый для Secret Santa можно представить в виде последовательности из N чисел (на i-ом месте записывается номер того, кому дарит подарок i-ый участник), представляющей собой перестановку порядка N без неподвижных точек.

Первый этап алгоритма

Итак, каждому участнику назначается номер от 1 до N, например в алфавитном порядке имён. Эта информация является открытой и сообщается всем участникам.

Затем первый участник случайным образом создаёт большой набор (нужно не менее 2N) натуральных чисел так, что никакие 2 из них не совпадают. Этот набор изначально не сообщается никому. Первый участник записывает эти числа для удобства в порядке возрастания, выбирает себе любое одно из них случайным образом, удаляет выбранное число из набора и передаёт оставшийся набор второму участнику. В итоге у первого участника оказываются записанными 2 вещи: стартовый набор чисел и выбранное им число.

Приведём пример с 5 участниками.

Первый участник генерирует начальный набор: 3, 46, 50, 89, 94, 95, 101, 500, 783, 5003, 5765, 7003

Выбрано: 783
Передаётся второму участнику: 3, 46, 50, 89, 94, 95, 101, 500, 5003, 5765, 7003

Второй участник точно так же выбирает себе из набора произвольное число, удаляет его из набора и передаёт оставшийся набор следующему участнику. Так же поступают 3-ий, 4-ый и 5-ый участник. Пятый, последний, участник выбирает себе число, но никому ничего пока не передаёт.

Второй участник получает (повторим ещё раз): 3, 46, 50, 89, 94, 95, 101, 500, 5003, 5765, 7003
Второй участник выбирает: 3

Третий участник получает: 46, 50, 89, 94, 95, 101, 500, 5003, 5765, 7003
Третий участник выбирает: 94

Четвёртый участник получает: 46, 50, 89, 95, 101, 500, 5003, 5765, 7003
Четвёртый участник выбирает: 5765

Пятый участник получает: 46, 50, 89, 95, 101, 500, 5003, 7003
Пятый участник выбирает: 101

Остаток набора: 46, 50, 89, 95, 500, 5003, 7003

На этом первый этап алгоритма окончен. Комментарий: в итоге у каждого из участников имеется число, не известное всем остальным (точнее, каждому участнику известен большой набор чисел, про который он знает, что последующие участники выбирали своё число из него — но это не даёт никакой информации, позволяющей точно узнать чужие числа). Если мы теперь найдём способ как-то сообщить весь набор выбранных чисел каждому из участников, то задача назначения дарителей будет решена: каждому участнику достаточно взять за конечный результат порядковый номер выбранного им числа в этом наборе выбранных номеров.

Предположим, что мы уже нашли способ сообщить каждому набор выбранных номеров (вообще мы это сделаем на 2-ом этапе алгоритма) и участники узнали номера своих одариваемых. Проблема в том, что одному или более участникам могут выпасть их собственные номера, что делает весь итоговый результат некорректным. Это большой минус алгоритма, так как вероятность попасть в эту ситуацию довольно высока, хотя она и падает с ростом N. Выходов как минимум 2:

Участник, получивший свой собственный номер, запрашивает у всех перебрасывание жребия с начала. Эту процедуру нужно повторять, пока все не подтвердят, что им достался корректный номер.

В примере с 5 участниками вот как будут выглядеть выбранные номера:

1-ый участник выбрал (повторим ещё раз): 783
2-ой участник выбрал (повторим ещё раз): 3
3-ий участник выбрал (повторим ещё раз): 94
4-ый участник выбрал (повторим ещё раз): 5765
5-ый участник выбрал (повторим ещё раз): 101

Список выбранных номеров в порядке возрастания (повторюсь — предположим, что мы знаем, как секретно сообщить его всем участникам): 3 94 101 783 5765

Итого, номера одариваемых:

1-ый участник: выбрал 783, набор 3 94 101 783 5765 — номер одариваемого 4
2-ой участник: выбрал 3, набор 3 94 101 783 5765 — номер одариваемого 1
3-ий участник: выбрал 94, набор 3 94 101 783 5765 — номер одариваемого 2
4-ый участник: выбрал 5765, набор 3 94 101 783 5765 — номер одариваемого 5
5-ый участник: выбрал 101, набор 3 94 101 783 5765 — номер одариваемого 3

Переброса не требуется.

Второй этап алгоритма

Итак, как же сообщить всем набор "выделенных" номеров? Это задача второго этапа. Узнать этот набор может первый участник, если последний участник сообщит ему оставшийся в конце набор (в примере это 46, 50, 89, 95, 500, 5003, 7003). Первому участнику тогда достаточно исключить этот набор из стартового, и результат исключения будет искомым набором выбранных участниками чисел. Заметим, что первый участник при таком действии всё ещё не знает никакой информации, позволяющей ему раскрыть номера, доставшиеся остальным участникам.

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

Решение у этой проблемы следующее. Как уже сказано, последний участник передаёт первому самый последний оставшийся набор. У первого участника оказываются следующие данные:

Стартовый набор: 3, 46, 50, 89, 94, 95, 101, 500, 783, 5003, 5765, 7003

Выбрано число: 783

Последний остаток набора: 46, 50, 89, 95, 500, 5003, 7003

Первый участник вычисляет, как уже сказано выше, набор выбранных всеми участниками чисел: 3, 94, 101, 783, 5765 и узнаёт выпавший ему номер одариваемого — 4.

Теперь, начиная с этого момента, каждый участник, начиная с первого, будет сообщать следущему участнику набор из N чисел. Каждый, получивший такой набор, должен считать его набором выбранных всеми участниками номеров и соответственно вычислить номер своего одариваемого. Но на каждом шаге передаваться дальше будет не оригинальный набор выбранных номеров, а изменённый, но дающий тот же результат вычисления номера одариваемого, что и оригинальный. При этом изменённый набор исключит всякую возможность узнать выбранные другими числа.

Для составления такого изменённого набора участник должен взять полученный им от предыдущего участника набор (в случае первого участника — набор, вычисленный как сказано выше) и подменить в нём своё число (выбранное на 1ом этапе) на любое другое число из доставшегося ему на 1-ом этапе набора, со следующими ограничениями:

  • Заменённое число не должно входить в только что полученный от предыдущего участника набор;
  • Заменённое число должно иметь тот же порядковый номер в изменённом наборе, что и заменяемое число в оригинальном наборе.

В примере первый участник подменяет в наборе 3, 94, 101, 783, 5765 выбранное им число — 783. Числа, которые ему разрешено подставить вместо 783, — это 500 и 5003. Предположим, он выбрал подмену 783 на 5003 и передаёт второму участнику набор 3, 94, 101, 5003, 5765.

Остальные участники делают то же самое. Доведём пример до конца.

Второй участник:
Набор на 1ом этапе — 3, 46, 50, 89, 94, 95, 101, 500, 5003, 5765, 7003
Выбранное число — 3
Набор на 2ом этапе — 3, 94, 101, 5003, 5765

Можно подставить вместо 3 — 46, 50, 89
Выбираем подставить 50, передаём дальше набор 50, 94, 101, 5003, 5765

Третий участник:
Набор на 1ом этапе — 46, 50, 89, 94, 95, 101, 500, 5003, 5765, 7003
Выбранное число — 94
Набор на 2ом этапе — 50, 94, 101, 5003, 5765

Можно подставить вместо 94 — 89, 95
Выбираем подставить 89, передаём дальше набор 50, 89, 101, 5003, 5765

Четвёртый участник:
Набор на 1ом этапе — 46, 50, 89, 95, 101, 500, 5003, 5765, 7003
Выбранное число — 5765
Набор на 2ом этапе — 50, 89, 101, 5003, 5765

Можно подставить вместо 5765 — 7003
Выбираем подставить 7003 (альтернатив особо нет), передаём дальше набор 50, 89, 101, 5003, 7003

Пятый участник:
Набор на 1ом этапе — 46, 50, 89, 95, 101, 500, 5003, 7003
Выбранное число — 101
Набор на 2ом этапе — 50, 89, 101, 5003, 7003

Обмен наборами закончен, участники могут заняться вычислением номера одариваемого.
Можно удостовериться, что никто из участников при таком подходе не может узнать ничего о чужих номерах.

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

Случайность выбора участником числа из набора никак не гарантируется. Никто не мешает первому участнику, например, выбрать последнее число в наборе и тем самым практически обеспечить себе номер одариваемого, равный N. Эта проблема устраняется, если, как уже сказано, участники договорятся в самом конце алгоритма дополнительно применить к результатам известную всем случайную перестановку без неподвижных точек, но её случайность тоже нужно как-то гарантировать.

Всем спасибо, кто дочитал до конца, и с наступающим Новым годом :) Печеньку тому, кто найдёт ещё проблемы в алгоритме или решит существующие!


Привет, Хабр! В этой статье я приведу простой алгоритм, позволяющий группе из N человек секретно сгенерировать каждому из участников группы номер другого участника — одариваемого — для обмена подарками на Новый год в мероприятии Тайный Санта (Secret Santa).

Прежде всего, что такое Тайный Санта? Статья в Википедии рассказывает это лучше меня, я лишь кратко скажу, что это церемония, пришедшая к нам с Запада, в которой группа людей сговаривается подарить на Новый год друг другу подарки таким образом, что каждый из участников дарит и получает по одному подарку, при этом каждому не известен его даритель, но известен одариваемый (отсюда "тайный Санта"). Стоимость подарков обычно оговаривается заранее, чтобы все подарки были примерно равноценны. При желании можно условиться, что после того, как обмен подарками совершится, дарители раскроются.

Свой "Тайный Санта" есть и на Хабрахабре под названием "Клуб Анонимных Дедов Морозов".

К сожалению, для организации Тайного Санты просто сгенерировать список пар даритель-одариваемый недостаточно. Дарение должно происходить анонимно, и каждый участник должен знать только номер одариваемого и ни битом информации больше о других участниках, поэтому, например, нельзя просто поручить одному из участников сгенерировать список и сообщить каждому оставшемуся участнику его одариваемого — тот, кто сгенерировал список, будет знать всё обо всех, в том числе и своего дарителя.

Как правило, участники выходят из положения, прибегая к помощи "третьей стороны" — незаинтересованного человека, не участвующего в церемонии, которого просят сгенерировать номера одариваемых и тайно сообщить каждому участнику единственный номер. Такой "третьей стороной" может быть не только человек, но и специализированный сайт, к числу которых относится и уже упомянутый "Клуб АДМ" Хабрахабра.

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

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

Как и остальные децентрализованные алгоритмы для Тайного Санты, этот алгоритм не требует "третьей стороны" — участникам достаточно только общаться между собой. Всё, что требуется каждому участнику, — это дважды получить от участника с предыдущим номером набор натуральных чисел, изменить его определённым образом и передать следующему. После того, как обмен наборами завершится, каждый участник определённым образом формирует из имеющихся у него наборов единственное натуральное число — номер одариваемого.

Сразу скажу, у такого подхода не очень много преимуществ по сравнению с тем, чтобы просто привлечь "третью сторону", но пара плюсов всё-таки есть:

  • Это просто весело — поиграть на НГ в "Тайного Санту" с криптографией. Хорошо подойдёт компании гиков.
  • Не требуется искать человека со стороны, организовывать его общение с каждым из участников.
  • Не требуется регистрироваться ни на каком сайте, нужны только сами участники и минимум технических средств общения обычным текстом. При физической встрече участников не нужно ничего, кроме ручки и бумаги. Для общения на расстоянии подойдёт что угодно — электронная почта, SMS, IRC.

Для начала, небольшое соглашение о том, как представлять конкретный набор, сопоставляющий дарителей и одариваемых, с математической точки зрения.

Назначение одариваемых в Тайном Санте — не что иное, как назначение каждому из участников группы из N человек номера от 1 до N, означающего номер одариваемого (если считать, что все участники пронумерованы от 1 до N). При этом:

  • Никому не должен достаться свой собственный номер (тк нельзя дарить себе самому);
  • Не должно быть номеров, никому не доставшихся (тк все должны быть одарены);
  • Номер каждого участника достаётся ровно одному дарителю (тк каждый должен получить ровно 1 подарок).
  • Двум участникам может выпасть дарить подарки друг другу — в принципе это совершенно нормально, но иногда участники могут условиться перебрасывать жребий в этом случае.
  • На номера могут накладываться другие дополнительные ограничения в зависимости от ситуации (например, если в "Санте" участвуют несколько семей, они могут условиться перебрасывать жребий, если кому-то из участников выпало делать подарок члену своей семьи).

Отсюда видно, что любой список пар даритель-одариваемый для Secret Santa можно представить в виде последовательности из N чисел (на i-ом месте записывается номер того, кому дарит подарок i-ый участник), представляющей собой перестановку порядка N без неподвижных точек.

Первый этап алгоритма

Итак, каждому участнику назначается номер от 1 до N, например в алфавитном порядке имён. Эта информация является открытой и сообщается всем участникам.

Затем первый участник случайным образом создаёт большой набор (нужно не менее 2N) натуральных чисел так, что никакие 2 из них не совпадают. Этот набор изначально не сообщается никому. Первый участник записывает эти числа для удобства в порядке возрастания, выбирает себе любое одно из них случайным образом, удаляет выбранное число из набора и передаёт оставшийся набор второму участнику. В итоге у первого участника оказываются записанными 2 вещи: стартовый набор чисел и выбранное им число.

Приведём пример с 5 участниками.

Первый участник генерирует начальный набор: 3, 46, 50, 89, 94, 95, 101, 500, 783, 5003, 5765, 7003

Выбрано: 783
Передаётся второму участнику: 3, 46, 50, 89, 94, 95, 101, 500, 5003, 5765, 7003

Второй участник точно так же выбирает себе из набора произвольное число, удаляет его из набора и передаёт оставшийся набор следующему участнику. Так же поступают 3-ий, 4-ый и 5-ый участник. Пятый, последний, участник выбирает себе число, но никому ничего пока не передаёт.

Второй участник получает (повторим ещё раз): 3, 46, 50, 89, 94, 95, 101, 500, 5003, 5765, 7003
Второй участник выбирает: 3

Третий участник получает: 46, 50, 89, 94, 95, 101, 500, 5003, 5765, 7003
Третий участник выбирает: 94

Четвёртый участник получает: 46, 50, 89, 95, 101, 500, 5003, 5765, 7003
Четвёртый участник выбирает: 5765

Пятый участник получает: 46, 50, 89, 95, 101, 500, 5003, 7003
Пятый участник выбирает: 101

Остаток набора: 46, 50, 89, 95, 500, 5003, 7003

На этом первый этап алгоритма окончен. Комментарий: в итоге у каждого из участников имеется число, не известное всем остальным (точнее, каждому участнику известен большой набор чисел, про который он знает, что последующие участники выбирали своё число из него — но это не даёт никакой информации, позволяющей точно узнать чужие числа). Если мы теперь найдём способ как-то сообщить весь набор выбранных чисел каждому из участников, то задача назначения дарителей будет решена: каждому участнику достаточно взять за конечный результат порядковый номер выбранного им числа в этом наборе выбранных номеров.

Предположим, что мы уже нашли способ сообщить каждому набор выбранных номеров (вообще мы это сделаем на 2-ом этапе алгоритма) и участники узнали номера своих одариваемых. Проблема в том, что одному или более участникам могут выпасть их собственные номера, что делает весь итоговый результат некорректным. Это большой минус алгоритма, так как вероятность попасть в эту ситуацию довольно высока, хотя она и падает с ростом N. Выходов как минимум 2:

Участник, получивший свой собственный номер, запрашивает у всех перебрасывание жребия с начала. Эту процедуру нужно повторять, пока все не подтвердят, что им достался корректный номер.

В примере с 5 участниками вот как будут выглядеть выбранные номера:

1-ый участник выбрал (повторим ещё раз): 783
2-ой участник выбрал (повторим ещё раз): 3
3-ий участник выбрал (повторим ещё раз): 94
4-ый участник выбрал (повторим ещё раз): 5765
5-ый участник выбрал (повторим ещё раз): 101

Список выбранных номеров в порядке возрастания (повторюсь — предположим, что мы знаем, как секретно сообщить его всем участникам): 3 94 101 783 5765

Итого, номера одариваемых:

1-ый участник: выбрал 783, набор 3 94 101 783 5765 — номер одариваемого 4
2-ой участник: выбрал 3, набор 3 94 101 783 5765 — номер одариваемого 1
3-ий участник: выбрал 94, набор 3 94 101 783 5765 — номер одариваемого 2
4-ый участник: выбрал 5765, набор 3 94 101 783 5765 — номер одариваемого 5
5-ый участник: выбрал 101, набор 3 94 101 783 5765 — номер одариваемого 3

Переброса не требуется.

Второй этап алгоритма

Итак, как же сообщить всем набор "выделенных" номеров? Это задача второго этапа. Узнать этот набор может первый участник, если последний участник сообщит ему оставшийся в конце набор (в примере это 46, 50, 89, 95, 500, 5003, 7003). Первому участнику тогда достаточно исключить этот набор из стартового, и результат исключения будет искомым набором выбранных участниками чисел. Заметим, что первый участник при таком действии всё ещё не знает никакой информации, позволяющей ему раскрыть номера, доставшиеся остальным участникам.

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

Решение у этой проблемы следующее. Как уже сказано, последний участник передаёт первому самый последний оставшийся набор. У первого участника оказываются следующие данные:

Стартовый набор: 3, 46, 50, 89, 94, 95, 101, 500, 783, 5003, 5765, 7003

Выбрано число: 783

Последний остаток набора: 46, 50, 89, 95, 500, 5003, 7003

Первый участник вычисляет, как уже сказано выше, набор выбранных всеми участниками чисел: 3, 94, 101, 783, 5765 и узнаёт выпавший ему номер одариваемого — 4.

Теперь, начиная с этого момента, каждый участник, начиная с первого, будет сообщать следущему участнику набор из N чисел. Каждый, получивший такой набор, должен считать его набором выбранных всеми участниками номеров и соответственно вычислить номер своего одариваемого. Но на каждом шаге передаваться дальше будет не оригинальный набор выбранных номеров, а изменённый, но дающий тот же результат вычисления номера одариваемого, что и оригинальный. При этом изменённый набор исключит всякую возможность узнать выбранные другими числа.

Для составления такого изменённого набора участник должен взять полученный им от предыдущего участника набор (в случае первого участника — набор, вычисленный как сказано выше) и подменить в нём своё число (выбранное на 1ом этапе) на любое другое число из доставшегося ему на 1-ом этапе набора, со следующими ограничениями:

  • Заменённое число не должно входить в только что полученный от предыдущего участника набор;
  • Заменённое число должно иметь тот же порядковый номер в изменённом наборе, что и заменяемое число в оригинальном наборе.

В примере первый участник подменяет в наборе 3, 94, 101, 783, 5765 выбранное им число — 783. Числа, которые ему разрешено подставить вместо 783, — это 500 и 5003. Предположим, он выбрал подмену 783 на 5003 и передаёт второму участнику набор 3, 94, 101, 5003, 5765.

Остальные участники делают то же самое. Доведём пример до конца.

Второй участник:
Набор на 1ом этапе — 3, 46, 50, 89, 94, 95, 101, 500, 5003, 5765, 7003
Выбранное число — 3
Набор на 2ом этапе — 3, 94, 101, 5003, 5765

Можно подставить вместо 3 — 46, 50, 89
Выбираем подставить 50, передаём дальше набор 50, 94, 101, 5003, 5765

Третий участник:
Набор на 1ом этапе — 46, 50, 89, 94, 95, 101, 500, 5003, 5765, 7003
Выбранное число — 94
Набор на 2ом этапе — 50, 94, 101, 5003, 5765

Можно подставить вместо 94 — 89, 95
Выбираем подставить 89, передаём дальше набор 50, 89, 101, 5003, 5765

Четвёртый участник:
Набор на 1ом этапе — 46, 50, 89, 95, 101, 500, 5003, 5765, 7003
Выбранное число — 5765
Набор на 2ом этапе — 50, 89, 101, 5003, 5765

Можно подставить вместо 5765 — 7003
Выбираем подставить 7003 (альтернатив особо нет), передаём дальше набор 50, 89, 101, 5003, 7003

Пятый участник:
Набор на 1ом этапе — 46, 50, 89, 95, 101, 500, 5003, 7003
Выбранное число — 101
Набор на 2ом этапе — 50, 89, 101, 5003, 7003

Обмен наборами закончен, участники могут заняться вычислением номера одариваемого.
Можно удостовериться, что никто из участников при таком подходе не может узнать ничего о чужих номерах.

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

Случайность выбора участником числа из набора никак не гарантируется. Никто не мешает первому участнику, например, выбрать последнее число в наборе и тем самым практически обеспечить себе номер одариваемого, равный N. Эта проблема устраняется, если, как уже сказано, участники договорятся в самом конце алгоритма дополнительно применить к результатам известную всем случайную перестановку без неподвижных точек, но её случайность тоже нужно как-то гарантировать.

Всем спасибо, кто дочитал до конца, и с наступающим Новым годом :) Печеньку тому, кто найдёт ещё проблемы в алгоритме или решит существующие!


Хотите самостоятельно организовать новогоднее волшебство? Не ждите чуда, чудите сами;)

Сегодня я расскажу о том, как организовать игру "Тайный Санта" в небольшом коллективе.

Тайный (или Секретный) Санта - добрая традиция, пришедшая к нам с Запада. Суть игры в том, что каждый участник пишет на листочке "заказ" для Деда Мороза - пожелания к подарку, и свое имя. Все письма перемешиваются, а затем в случайном порядке вытягиваются (например из шляпы) всеми участниками. Таким образом, каждый должен будет сделать подарок для своего попавшегося подопечного, а так же будет сам одарен другим человеком. Как правило, ориентировочная стоимость подарков оговаривается заранее.

Мне очень нравится эта рождественская традиция, в этом году я даже принимаю участие в глобальном обмене подарками от известного сайта.

В этом году мне захотелось организовать игру "Тайный Санта" в компании своих друзей. Но сложность состоит в том, что очень трудно без повода собрать всех в одном месте - одной из проблем взрослой жизни является то, что всегда все заняты, графики не совпадают, дети не отпускают, и прочее - из-за этого собираемся мы с друзьями довольно редко, что весьма меня огорчает(

И тут мне попался этот сайт! Это просто находка для меня - ведь написать письмо Деду Морозу и провести жеребьевку можно онлайн!



Для организации игры или для участия нужна только электронная почта. Необходимо зарегистрироваться, а затем создаем "коробку".



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

Создав коробку, нужно пригласить участников, указав их e-mail. Каждый из них получит уведомление с ссылкой, перейдя по которой они смогут заполнить свою карточку - написать пожелания к подарку, указать адрес или телефон. После того как все участники написали письма - организатор проводит жеребьевку. Здесь можно контролировать процесс - назначить дарителя вручную, или выставить настройки так, чтобы, например, участники-супруги друг другу не попались. После выставления настроек нажимаем "провести жеребьевку" - и вуаля - каждому на почту приходит письмо от подопечного.


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

Организатор имеет полномочия "подсмотреть" кто кому дарит, и от кого ему самому ждать подарка, но я пока держусь))))


Вот и все, надеюсь мой отзыв был полезен и вы тоже захотите организовать такую игру и принести в мир чуть-чуть больше чуда))

Читайте также: