Рождество быстро приближается и вместе с ним устраивает ежегодную семейную Тайну Санты. Я хотел бы попытаться начать с этого, но то, что пары не покупают друг друга, продолжает вызывать проблемы, и, несмотря на то, что это 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
в (n + 1) -ом элементе k-го подмассива означает, что k-й человек может дать n-му человеку?Bob
доErin
? Я просто вижу один отErin
доBob
.Ответы:
Javascript ES6, 191
Это решение возвращает все возможные пары в виде списка пар:
Пример выполнения:
источник