Секретный алгоритм Санты

Вы можете использовать re.escape () :

re.escape (string) Возвращаемая строка со всеми неалфавитами обратной косой черты; это полезно, если вы хотите сопоставить произвольную литеральную строку, которая может содержать метасимволы регулярного выражения.

blockquote>
>>> import re
>>> re.escape('^a.*$')
'\\^a\\.\\*\\$'

24
задан Eclipse 7 November 2008 в 21:44
поделиться

5 ответов

Просто сделайте график с краями, соединяющими двух человек, если им позволяют совместно использовать подарки и затем использовать идеальный алгоритм соответствия. (Ищите "Пути, Деревья и Цветы" для (умного) алгоритма)

9
ответ дан Watson Ladd 7 November 2008 в 21:44
поделиться

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

Реализация в Python:

import random
from collections import deque
def pairup(people):
    """ Given a list of people, assign each one a secret santa partner
    from the list and return the pairings as a dict. Implemented to always
    create a perfect cycle"""
    random.shuffle(people)
    partners = deque(people)
    partners.rotate()
    return dict(zip(people,partners))
6
ответ дан wxs 7 November 2008 в 21:44
поделиться

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

5
ответ дан Brian 7 November 2008 в 21:44
поделиться

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

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

существует еще больше решений этой проблемы на этот поток .

6
ответ дан Community 7 November 2008 в 21:44
поделиться

Я просто создал веб-приложение, которое сделает точно это - http://www.secretsantaswap.com/

, Мой алгоритм допускает подгруппы. Это не симпатично, но это работает.

Работает следующим образом:
1. присвойте уникальный идентификатор всем участникам, помните, какая подгруппа они находятся в
2. дубликат и перестановка, которые перечисляют (цели)
3. создайте массив числа участников каждой подгруппы
4. копируйте массив от [3] для целей
5. создайте новый массив для содержания финальных матчей
6. выполните итерации через участников, присваивающих первую цель, которая не соответствует ни одному из следующих критериев:
          A. участник == цель
          B. участник. Подгруппа == цель. Подгруппа
          C. выбор цели заставит подгруппу перестать работать в будущем (например, подгруппа 1 должна всегда иметь, по крайней мере, столько же неподгруппа 1 цель, остающаяся сколько подгруппа участников 1 участник, остающийся)
          D. участник (n+1) == цель (n +1)
, Если мы присваиваем цель мы также, постепенно уменьшает массивы от 3 и 4

Так, не симпатичный (вообще), но это работает. Надежда это помогает,

Dan Carlson

1
ответ дан dancarlson 7 November 2008 в 21:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: