Size: a a a

JavaScript Noobs — сообщество новичков

2021 February 10

🌬М

🌬 Мари✨ in JavaScript Noobs — сообщество новичков
Alexey Ermakov
тем более)
понятно все с вами
источник

AE

Alexey Ermakov in JavaScript Noobs — сообщество новичков
🌬 Мари✨
понятно все с вами
💩
источник

DM

Denys Mikhalenko in JavaScript Noobs — сообщество новичков
🌬 Мари✨
доброй ночи ) а можете мне расписать алгоритм той задачи которую мне решали на днях ? ) я поделюсь с вами кодом (Вашим) ))
Да там вроде все очевидно?
источник

🌬М

🌬 Мари✨ in JavaScript Noobs — сообщество новичков
Denys Mikhalenko
Да там вроде все очевидно?
👀
источник

🌬М

🌬 Мари✨ in JavaScript Noobs — сообщество новичков
не для меня )
источник

🌬М

🌬 Мари✨ in JavaScript Noobs — сообщество новичков
я бы не просила о таком )
источник

j

jk in JavaScript Noobs — сообщество новичков
О какой задаче и о каком решении этой задачи идёт речь? Репостните в чат - может кто на ус намотает.
источник

DM

Denys Mikhalenko in JavaScript Noobs — сообщество новичков
Мари сейчас скинет в чат
источник

DM

Denys Mikhalenko in JavaScript Noobs — сообщество новичков
Я расскажу в двух словах
источник

C

Chris in JavaScript Noobs — сообщество новичков
jk
О какой задаче и о каком решении этой задачи идёт речь? Репостните в чат - может кто на ус намотает.
О разбиении множества чисел на два с максимально близкой суммой, видимо
источник

AE

Alexey Ermakov in JavaScript Noobs — сообщество новичков
аналог десятой проблемы Гильберта для уравнений в рациональных числах
источник

🌬М

🌬 Мари✨ in JavaScript Noobs — сообщество новичков
Denys Mikhalenko
Мари сейчас скинет в чат
function solve(arr) {
 const sum = arr.reduce((acc, cur) => acc + cur, 0);

 function take(set1, set2, set1sum, set2sum, s = 0) {
   let result = { set1, set2, set1sum, set2sum };
   for (let i = s; i < set1.length; i++) {
     const x = set1[i];
     const _set1 = [...set1.slice(0, i), ...set1.slice(i + 1)];
     const _set2 = [...set2, x];
     const r = take(_set1, _set2, set1sum - x, set2sum + x, i);
     const d = Math.abs(r.set1sum - r.set2sum);
     if (d < Math.abs(result.set1sum - result.set2sum)) {
       if (d === 0) return r;
       result = r;
     }
   }
   return result;
 }

 return take(arr, [], sum, 0);
}
а можно шаг за шагом для чайников )
источник

🌬М

🌬 Мари✨ in JavaScript Noobs — сообщество новичков
Chris
О разбиении множества чисел на два с максимально близкой суммой, видимо
можно и Вас о таком попросить ? )
источник

🌬М

🌬 Мари✨ in JavaScript Noobs — сообщество новичков
буду разбирать на досуге )
источник

C

Chris in JavaScript Noobs — сообщество новичков
Переслано от Chris
Набор [0,2,2,2,3,4,6,6,6,7,10,12,18,20,30,40,40,50,54,60,60,70,80,80,90,100,120,127]

Решение с хитрой оптимизацией
function split(array) {
   function partition(array, mask) {
       let a = [], b = [], i = array.length;
       while (--i >= 0) {
           if ((mask >> i) & 1) a.push(array[i]);
           else b.push(array[i]);
       }
       return [a, b];
   }
   function diffar(array, mask) {
       let d = 0, i = array.length;
       while (--i >= 0) {
           if ((mask >> i) & 1) d += array[i];
           else d -= array[i];
       }
       return d
   }

   //array = [...array].sort((a,b) => b - a);
   let len = array.length;
   let min = Infinity, result, idx;
   let target = 0;
   let sum = array.reduce((a, b) => a + b);
   if (sum % 2) target = 1;

   let i = 2 ** (len - 1)

   while (--i >= 0) {
       let diff = Math.abs(diffar(array, i))
       if (diff < min) {
           if (diff === target) return partition(array, i);
           idx = i;
           min = diff;
       }
   }

   return partition(array, idx);
}
источник

DM

Denys Mikhalenko in JavaScript Noobs — сообщество новичков
Это плохое решение, Мари
источник

ym

yung musk in JavaScript Noobs — сообщество новичков
Chris
Переслано от Chris
Набор [0,2,2,2,3,4,6,6,6,7,10,12,18,20,30,40,40,50,54,60,60,70,80,80,90,100,120,127]

Решение с хитрой оптимизацией
function split(array) {
   function partition(array, mask) {
       let a = [], b = [], i = array.length;
       while (--i >= 0) {
           if ((mask >> i) & 1) a.push(array[i]);
           else b.push(array[i]);
       }
       return [a, b];
   }
   function diffar(array, mask) {
       let d = 0, i = array.length;
       while (--i >= 0) {
           if ((mask >> i) & 1) d += array[i];
           else d -= array[i];
       }
       return d
   }

   //array = [...array].sort((a,b) => b - a);
   let len = array.length;
   let min = Infinity, result, idx;
   let target = 0;
   let sum = array.reduce((a, b) => a + b);
   if (sum % 2) target = 1;

   let i = 2 ** (len - 1)

   while (--i >= 0) {
       let diff = Math.abs(diffar(array, i))
       if (diff < min) {
           if (diff === target) return partition(array, i);
           idx = i;
           min = diff;
       }
   }

   return partition(array, idx);
}
Какой пиздец
источник

🌬М

🌬 Мари✨ in JavaScript Noobs — сообщество новичков
мне кстати не нужно там выводить setSum а как удалить с вывода а то там капец запутано
источник

DM

Denys Mikhalenko in JavaScript Noobs — сообщество новичков
Я публиковал решение, которое в 10 раз быстрее
источник

🌬М

🌬 Мари✨ in JavaScript Noobs — сообщество новичков
Denys Mikhalenko
Я публиковал решение, которое в 10 раз быстрее
function solve(arr) {
 function take(set1sum, set2sum = 0, mapper = 0, s = 0) {
   let result = { mapper, set1sum, set2sum };
   for (let i = s; i < arr.length; i++) {
     const bit = 1 << i;
     if (!(mapper & bit)) {
       const x = arr[i];
       if (set1sum - x - (set2sum + x) < set1sum - set2sum) {
         const r = take(set1sum - x, set2sum + x, mapper | bit, i);
         const d = Math.abs(r.set1sum - r.set2sum);
         if (d < Math.abs(result.set1sum - result.set2sum)) {
           if (d === 0) return r;
           result = r;
         }
       }
     }
   }
   return result;
 }

 const sum = arr.reduce((acc, cur) => acc + cur, 0);
 const { set1sum, set2sum, mapper } = take(sum);
 const set1 = [];
 const set2 = [];
 for (let i = 0; i < arr.length; i++) {
   if (mapper & (1 << i)) {
     set2.push(arr[i]);
   } else {
     set1.push(arr[i]);
   }
 }
 return { set1, set2, set1sum, set2sum };
}
источник