From ffd842390846824cb9eb2a9d9a84cf3bd18ef6d9 Mon Sep 17 00:00:00 2001 From: Yevhen Odynets Date: Tue, 5 Oct 2021 10:30:57 +0300 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=B2=D0=B4=D0=B0=D0=BD=D0=BD?= =?UTF-8?q?=D1=8F=20=D0=B4=D0=BE=20=D0=B2=D0=B8=D0=BA=D0=BE=D0=BD=D0=B0?= =?UTF-8?q?=D0=BD=D0=BD=D1=8F=20=D0=BC=D0=BE=D0=B2=D0=BE=D1=8E=20JavaScrip?= =?UTF-8?q?t=20(1-=D0=B9=20=D0=B5=D1=82=D0=B0=D0=BF:=20=D1=82=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D0=BE=D0=B2=D0=B5=20=D0=B7=D0=B0=D0=B2=D0=B4=D0=B0=D0=BD?= =?UTF-8?q?=D0=BD=D1=8F)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- task.js | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 task.js diff --git a/task.js b/task.js new file mode 100644 index 0000000..8f31a2f --- /dev/null +++ b/task.js @@ -0,0 +1,105 @@ +/** + * @package: chooseDistance + * @date: 05.10.2021 + * @time: 08:17 + * @author: Yevhen Odynets + */ + +/** + * Визначаємо суми всіх підмножин з масиву чисел та їх суми згідно параметрів. + * Функція поверне підмножину відстаней або null. + * + * @param t + * @param k + * @param ls + * @returns {null|*[]} + */ +function chooseDistance (t, k, ls) { + + /** + * Перевіряємо чи коретно передані відстані у масиві 'ls' і чи є він власне масивом + */ + if (Array.isArray(ls)) { + if (ls.map(el => (Number.isInteger(el) && el >= 0)).includes(false)) { + return null + } + } else { + return null + } + + const data = {} //результуючий набір + const n = ls.length //довжина масиву + const total = 1 << n //Загальна кількість підмножин + + /** Перевіряємо змінні на валідність */ + if (!Number.isInteger(k) || k < 1) { + return null + } + + if (n < k) { + return null + } + + if (!Number.isInteger(t) || t < 0) { + return null + } + + /** + * Перевіряємо всі числа від 0 до 2^n - 1 + */ + for (let i = 0; i < total; i++) { + let sum = 0 + const subset = [] + + /** + * Обераємо елементи до підмножин + */ + for (let j = 0; j < n; j++) { + if ((i & (1 << j)) !== 0) { + sum += ls[j] + subset.push(ls[j]) + /** + * Відсікаємо зайве + */ + if (sum <= t && subset.length === k) { + data[sum] = subset.slice(0, k) //не певен, що це найкращий варіант))) + } + } + } + } + + /** + * Визначаємо найбільше значкення ключа, і по ньому повертаємо набір відсттаней згідно умов задачі + */ + const maxKeySum = Math.max.apply(null, Object.keys(data)) + return data[maxKeySum] ?? null +} + +const results = [ + chooseDistance(174, 3, [51, 56, 58, 59, 61]), // [ 56, 58, 59 ] + chooseDistance(163, 3, [50]), // null + + chooseDistance(47, 'three', [51, 56, 58, 59, 61]), // null + chooseDistance( null, 3, [51, 56, 58, 59, 61]), // null + chooseDistance( 175, 3, [51, 56, 0, 59, 61]), // [ 51, 59, 61 ] + chooseDistance( 175, 3, [51, 56, '0', 59, 61]), // null + + chooseDistance(50, 1, [51, 56, 58, 59, 61]), // null + chooseDistance(51, 1, [51, 56, 58, 59, 61]), // [ 51 ] + + chooseDistance(119, 2, [51, 56, 58, 59, 61]), // [ 58, 61 ] + + chooseDistance(223, 4, [51, 56, 58, 59, 61]), // null + chooseDistance(224, 4, [51, 56, 58, 59, 61]), // [ 51, 56, 58, 59 ] + chooseDistance(256, 4, [51, 56, 58, 59, 61]), // [ 56, 58, 59, 61 ] + + chooseDistance(285, 5, [51, 56, 58, 59, 61]), // [ 51, 56, 58, 59, 61 ] - max sum of the array is 285 + chooseDistance(284, 5, [51, 56, 58, 59, 61]), // null + + chooseDistance(285, 6, [51, 56, 58, 59, 61]), // null + +] + +console.log(results[0]) // Dylan's request ([ 56, 58, 59 ]) + +console.log(results)