Різдво швидко наближається і разом з ним, влаштовуючи щорічну сім’ю Таємний Санта. Мені б хотілося спробувати почати з цього питання, але переконайтесь, що пари не купують одна для одної і надалі викликає проблеми, і незважаючи на те, що роблять це роками, все ще існує проблема, яка 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 на моїй машині.
Вище набори, створені за допомогою цього сценарію .
Bobдо Erin? Я просто бачу одного з Erinдо Bob.
1в (n + 1) -му елементі k-го підмножини означає, що kth людина може дати n-й людині?