Skip to content

Instantly share code, notes, and snippets.

@SerafimArts
Last active February 21, 2016 19:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save SerafimArts/915dc8509f9cd6b9b612 to your computer and use it in GitHub Desktop.
Save SerafimArts/915dc8509f9cd6b9b612 to your computer and use it in GitHub Desktop.
Яндекс: Задача на собеседование №3
/**
* Это феерическое безумие и полный разрыв
* мозга, по-этому я откомментирую ключевые моменты.
*
* Алгоритм фактически в лоб, просто перебор
* всех элементов, мозги и так плавятся =))))
*
* Пример:
* console.log(theMadness([1, 4, 6, 98, 3, 2, 7, 8, 90, 12, 8]));
* Возвращает массив комбинаций элементов, где каждый элемент бредставлен объектом
* {value: значение, index: индекс_массива}
*
*
* @param list Сам массив
* @param maxSize Требуемая сумма элементов(10)
* @param positive Присутствуют ли негативные числа
* @returns {Array}
*/
function theMadness(list, maxSize, positive){
maxSize = (maxSize >> 0) || 10;
var result = [], // Результат на выдачу
combination = [], // Текущая комбинация элеметов (в цикле проверяются)
listLength = (1 << list.length); // Количество возможных комбинаций (такая вольность ограничена
// 32к (int), можно в принципе Math.sqrt, но это быстрее)\
var getSum = function(arr) {
for(var i=0, sum=0; i<arr.length; sum+=arr[i++].value);
return sum;
};
for (var i=0; i<listLength; ++i){
combination = [];
for (var j=0; j<list.length; ++j){
if ((i & (1 << j))){ // Если индексы совпадают
// Свойство positive нужно только для этого отсечения ниже (вообще спорный вопрос, надо ли)
if (positive && getSum(combination) > maxSize) { break; }
// Остальные пушим
combination.push({value: list[j], index: j});
}
}
// Запихиваем в результат нужные элементы
if (combination.length !== 0 && getSum(combination) == maxSize) {
result.push(combination);
}
}
return result;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment