Таємний Санта - Переглянуто


11

Різдво швидко наближається і разом з ним, влаштовуючи щорічну сім’ю Таємний Санта. Мені б хотілося спробувати почати з цього питання, але переконайтесь, що пари не купують одна для одної і надалі викликає проблеми, і незважаючи на те, що роблять це роками, все ще існує проблема, яка Bobє досить сміттям при купівлі подарунків для більшості обдарованих , Erinшвидше за все, буде розчарований, але він знає, що FrankТаліскеру подобається, тому він добре підходить для нього. Це робить жодне з існуючих простих рішень прийнятним для моїх потреб.

Щоб полегшити моє життя, ваше завдання - написати функцію (або найближчу альтернативу вашій мові), яка при наданні масиву масивів (або найближчої альтернативи обраній вами мові) повертає (або виводить) пару "gifters" на '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-го підмножини означає, що kth людина може дати 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.