Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 26.03.2020, 19:31
Новичок на форуме
Отправить личное сообщение для Pavel_Meridian Посмотреть профиль Найти все сообщения от Pavel_Meridian
 
Регистрация: 26.03.2020
Сообщений: 2

Перестановки и разделение массива
Дан массив A, и нужно понять можно массив разделить на две части, кажый из которых равен 10 -и или нет.

Например в случае

A = [-2, 5, 5, 3, 2, 7]


Мы можем иметь эти две подмассивы
[-2, 7, 5]
и
[5, 3, 2]
сумма каждой из которых равен 10.

Нужно написать функцию которая получает массив и возвращает true или false в зависимости от того разделение массива возможен или нет.

function permutDevide(){}

console.log(permutDevide([-2, 5, 5, 3, 2, 7]))     // true
console.log(permutDevide([10, 5, 5]))     // true
console.log(permutDevide([5, 3, 2, -1]))     // false
console.log(permutDevide([7, 1, 3, 5, 2, 2]))     // true
console.log(permutDevide([1, 1, 10, 1, 1, 6]))     // true


Поможете решить задачу?

Последний раз редактировалось Pavel_Meridian, 26.03.2020 в 19:33.
Ответить с цитированием
  #2 (permalink)  
Старый 27.03.2020, 13:38
Профессор
Отправить личное сообщение для caetus Посмотреть профиль Найти все сообщения от caetus
 
Регистрация: 23.09.2014
Сообщений: 197

const array1 = [1, 2, 3, 4];
const reducer = (accumulator, currentValue) => accumulator + currentValue;

alert(!(array1.reduce(reducer) % 10));
Ответить с цитированием
  #3 (permalink)  
Старый 27.03.2020, 14:12
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,117

caetus,
как разделить массив на равные суммы?
Ответить с цитированием
  #4 (permalink)  
Старый 27.03.2020, 15:33
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,218

Как вариант...
Для начала сформировать множество всех перестановок того массива...
Потом каждый элемент этого множества проверять, может ли он быть представлен в виде "одинаковой суммы" с 1-го до i-того и с i+1-го до конца.

Но количество перестановок N элементного множества равно N!
Сообщение от Pavel_Meridian
A = [-2, 5, 5, 3, 2, 7]
Количество перестановок 720.
Ответить с цитированием
  #5 (permalink)  
Старый 27.03.2020, 15:36
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,218

Вот пример создания множества всех перестановок N-элементного множества...
https://habr.com/ru/post/276937/
Ответить с цитированием
  #6 (permalink)  
Старый 27.03.2020, 15:40
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,218

Вот еще варианты...
https://askdev.ru/q/perestanovki-v-javascript-21569/
https://ru.stackoverflow.com/questio...а-javascript
Ответить с цитированием
  #7 (permalink)  
Старый 27.03.2020, 18:36
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,117

перебор вариантов с бору по сосенке лимит 2 x 10
Pavel_Meridian,
<script>
function permute(arr) {
  var l = arr.length,
      used = Array(l),
      data = Array(l);
  return function* backtracking(pos) {
    if(pos == l) yield data.slice();
    else for(var i=0; i<l; ++i) if(!used[i]) {
      used[i] = true;
      data[pos] = arr[i];
      yield* backtracking(pos+1);
      used[i] = false;
    }
  }(0);
}
function permutDevide(arr)
{
   if(arr.reduce((a, b) => a - b, 20)) return false;
   const gen = permute(arr);
   let current = gen.next();
   while(!current.done) {
   let temp = [], num = 0;
   const res = [temp];
   for(const elem of current.value) {
   temp.push(elem);
   num += elem;
   if(num == 10) {temp = [], res.push(temp)}
   }
   if(res.length == 2) return res;
   current = gen.next();
   }
   return false
}
const test = [[-2, 5, 5, 3, 2, 7], [10, 5, 5], [5, 3, 2, -1],
[7, 1, 3, 5, 2, 2], [1, 1, 10, 1, 1, 6], [8, 7, 5], [90, 10, -80]];
for(const arr of test) document.write(`${JSON.stringify(arr)} => ${JSON.stringify(permutDevide(arr))}<br>`)

</script>
Ответить с цитированием
  #8 (permalink)  
Старый 28.03.2020, 00:34
Новичок на форуме
Отправить личное сообщение для Pavel_Meridian Посмотреть профиль Найти все сообщения от Pavel_Meridian
 
Регистрация: 26.03.2020
Сообщений: 2

Большое спасибо
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обход многомерного массива с задержкой после каждого цикла Walk Общие вопросы Javascript 2 14.08.2017 16:17
Ввод диапазона значений массива с клавиатуры Воскобоенко Общие вопросы Javascript 11 06.06.2015 22:34
Разделение массива объектов volodymyrl Общие вопросы Javascript 2 26.03.2014 03:34
Сортировка массива по возрастанию другого массива. vas88811 Events/DOM/Window 4 12.01.2014 10:31
Разделение массива masterfrag Учебные материалы 8 02.12.2013 01:48