Секретный Санта - Возвращение


11

Рождество быстро приближается и вместе с ним устраивает ежегодную семейную Тайну Санты. Я хотел бы попытаться начать с этого, но то, что пары не покупают друг друга, продолжает вызывать проблемы, и, несмотря на то, что это Bobделалось годами, все еще существует проблема, заключающаяся в том , чтобы покупать подарки для большинства одаренных. , Erinвероятно , будет разочарован, но он знает , что Frankлюбит Talisker, поэтому он хорошо подходит для него. Это не делает ни одно из существующих простых решений приемлемым для моих нужд.

Чтобы сделать мою жизнь проще, ваша задача - написать функцию (или ближайшую альтернативу на вашем языке), которая при задании массива массивов (или ближайшей альтернативы на выбранном вами языке) возвращает (или выводит) пару «подарков» для 'giftees' в кратчайшем коде в байтах, так что выполняются следующие условия:

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

Предположите , что вы никогда не будете представлены с совпадающими именами , как мы должны быть в состоянии сказать , какой член семьи есть что, но вы можете быть представлены с данными , которые включают в себя пробела для дифференцируют Bob Seniorот Bob Junior! Он должен завершить все поставленные тестовые примеры в течение часа для довольно больших семейств, например, 100 уникальных имен в исходных данных (см. Примеры наборов данных ниже, вы должны иметь возможность проанализировать все из них в течение выделенного времени).

Пример ввода:

santa([
    ["Alice", 0, 0, 1, 1, 1, 1, 1],
    ["Bob",   0, 0, 0, 0, 0, 1, 0],
    ["Carla", 1, 1, 0, 0, 0, 1, 1],
    ["Dan",   1, 1, 0, 0, 0, 1, 1],
    ["Erin",  1, 1, 0, 0, 0, 1, 1],
    ["Frank", 1, 1, 1, 1, 1, 0, 1],
    ["Gary",  1, 1, 1, 1, 1, 1, 0]
]);
// might return something like:
[
    ["Alice", "Erin"],
    ["Bob", "Frank"],
    ["Carla", "Alice"],
    ["Dan", "Gary"],
    ["Erin", "Bob"],
    ["Frank", "Dan"],
    ["Gary", "Carla"]
]
santa([
    ["Alice", 0, 1, 1, 1, 0, 1],
    ["Bob",   0, 0, 1, 1, 0, 1],
    ["Carla", 0, 1, 0, 1, 0, 1],
    ["Dan",   0, 1, 1, 0, 0, 0],
    ["Erin",  0, 0, 1, 0, 0, 1],
    ["Frank", 1, 1, 1, 1, 1, 0]
]);
false
santa([
    ["Alice", 0, 1, 1],
    ["Bob",   1, 0, 1],
    ["Carla", 1, 1, 0]
]);
[
    ["Alice", "Bob"],
    ["Bob", "Carla"],
    ["Carla", "Alice"]
]

В зависимости от языка ввод может быть в других форматах, например, подробности STDIN могут быть представлены как:

script <<< 'Alice,0,0,1,1,1,1,1
Bob,0,0,0,0,0,1,0
Carla,1,1,0,0,0,1,1
Dan,1,1,0,0,0,1,1
Erin,1,1,0,0,0,1,1
Frank,1,1,1,1,1,0,1
Gary,1,1,1,1,1,1,0'

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

Alice:Dan
Bob:Erin
Carla:Bob
Dan:Alice
Erin:Frank
Frank:Carla

Если вы сомневаетесь, пожалуйста, спросите и предоставьте примеры требуемого формата ввода и ожидаемого формата вывода с вашим ответом.

Ссылочная реализация JavaScript .

Большие наборы данных: 100 , 100 , 200 , 200 - много решений , 200 - только одно решение .

Ссылочная реализация завершает все это в <4s на моей машине.

Выше наборы, созданные с помощью этого скрипта .


1
Должны ли мы предполагать, что элементы подмассивов находятся в том же порядке, что и родительский массив? И что 1в (n + 1) -ом элементе k-го подмассива означает, что k-й человек может дать n-му человеку?
msh210

@ msh210 Действительно, извиняюсь за то, что не был многословен, я обновлю вопрос, чтобы подтвердить.
Дом Гастингс

В первом примере, где она обеспечивает отображение от Bobдо Erin? Я просто вижу один от Erinдо Bob.
LegionMammal978

@ LegionMammal978 Аааа, это отличный вопрос, на который можно ответить только путем редактирования ... Извинения! Исправлена!
Дом Гастингс

1
N0! Это способ рано на Рождество! Это должна быть тайна Турции, которая раздает подарки.
Грант Дэвис

Ответы:


4

Javascript ES6, 191

Это решение возвращает все возможные пары в виде списка пар:

f=l=>(h=l=>l.length,n=l.map(i=>i.shift()),o=[],(r=s=>(g=h(s))<h(n)?l[g].map((e,x)=>e&&r([...s,x])):o.push([...s]))([]),o.filter(i=>h([...new Set(i)])==h(n)).map(l=>l.map((t,f)=>[n[f],n[t]])))

Пример выполнения:

>> example = f([
    ["Alice", 0, 0, 1, 1, 1, 1, 1],
    ["Bob",   0, 0, 0, 0, 0, 1, 0],
    ["Carla", 1, 1, 0, 0, 0, 1, 1],
    ["Dan",   1, 1, 0, 0, 0, 1, 1],
    ["Erin",  1, 1, 0, 0, 0, 1, 1],
    ["Frank", 1, 1, 1, 1, 1, 0, 1],
    ["Gary",  1, 1, 1, 1, 1, 1, 0]])

<< Array [ Array[7], Array[7], Array[7], Array[7], Array[7], Array[7], Array[7], Array[7], Array[7], Array[7], 26 more… ]

>> example[0]

<< Array [ "Alice:Carla", "Bob:Frank", "Carla:Alice", "Dan:Bob", "Erin:Gary", "Frank:Dan", "Gary:Erin" ]

Я думаю, что на основе более крупных тестовых случаев это не удастся, потому что он генерирует все перестановки ... Можете ли вы проверить его окончание для больших наборов на вашей машине? Благодаря! Извините, что эти большие наборы не были там сначала.
Дом Гастингс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.