Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Оброзование возрастних групп (https://javascript.ru/forum/misc/79791-obrozovanie-vozrastnikh-grupp.html)

Nicanor13 25.03.2020 20:27

Оброзование возрастних групп
 
У меня есть массив людей A, в котором элемент в позиции i показывает возраст данного человека в этой позиции. Нужно образовать группы в каждом из которых были люди так чтобы максимальной разницей в их возрасте был 4 года. В группе максимальное количество людей должен быть 4 а минимальное 2. Несмотря на возрастную разницу группы в любом случае должны оброзаваться.

Например если
A = [18, 30, 20, 45, 36, 20, 47, 50];


матрица образовавшийся групп будет

[[18, 20, 20], [30, 36], [45, 47, 50]]


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

function ageMatrix {}
console.log([18, 30, 20, 45, 36, 20, 47, 50]);    // [[18, 20, 20], [30, 36], [45, 47, 50]]
console.log([20, 20, 20, 20, 40, 40, 40, 40]);    // [[20, 20, 20, 20], [40, 40, 40, 40]]
console.log([18, 20, 22, 24]);    // [[18, 20, 22, 24]]
console.log([20, 22, 20, 22, 20, 23, 24, 25, 24, 24, 24]);    // [[20, 20, 20, 22], [22, 23, 24, 24], [24, 24, 25]]


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

рони 25.03.2020 20:51

Цитата:

Сообщение от Nicanor13
максимальной разницей в их возрасте был 4 года.

Цитата:

Сообщение от Nicanor13
[30, 36],

:-?

Nicanor13 25.03.2020 21:00

Да но несмотря на возрастную разницу группы в любом случае должны оброзаваться.

рони 25.03.2020 21:20

Nicanor13,
<script>
function ageMatrix (arr)
{  let c;
   return arr.sort((a, b) => a - b).reduce((a, b, i) => {
   if(!c || c.length == 4|| c.length >= 2 && (c[c.length - 1] + 4 < b || arr.slice(i).length == 2)) {
       c = []; a.push(c)
   }
   c.push(b);
   return a
   }, [])
}
document.write(JSON.stringify(ageMatrix ([18, 30, 20, 45, 36, 20, 47, 50]), "", 1) + "<br>")
document.write(JSON.stringify(ageMatrix ([20, 22, 20, 22, 20, 23, 24, 25, 24, 24, 24]), "", 1) + "<br>")
document.write(JSON.stringify(ageMatrix ([18, 20, 22, 24, 26, 28, 30, 18, 18]), "", 1) + "<br>")

</script>

Nicanor13 25.03.2020 21:43

Большое-большое спасибо
Кончено извините но для

console.log(ageMatrix([18,20,22,24,26,28,30,18,18])) // [18, 18, 18, 20],[22, 24, 26, 28],[30]] а должен выводить [[18, 18, 18, 20],[22, 24, 26],[28, 30]]

Но и на том спасибо

рони 25.03.2020 21:57

Nicanor13,
что такое максимальная разница в 4 года?

Nicanor13 25.03.2020 22:00

Нет в каждой группе должен быть по крайней мере 2 человека (минимальное количество людей 2)

рони 25.03.2020 22:03

Цитата:

Сообщение от Nicanor13
Нет в каждой группе должен быть по крайней мере 2 человека

ок

Nicanor13 25.03.2020 22:08

То есть Ваш код очень хороший и правильно работает кроме последнего варианта

console.log(ageMatrix([18, 30, 20, 45, 36, 20, 47, 50])); // [[18, 20, 20], [30, 36], [45, 47, 50]]

console.log(ageMatrix([20, 20, 20, 20, 40, 40, 40, 40])); // [[20, 20, 20, 20], [40, 40, 40, 40]]

console.log(ageMatrix([18, 20, 22, 24])); // [[18, 20, 22, 24]]

console.log(ageMatrix([20, 22, 20, 22, 20, 23, 24, 25, 24, 24, 24]));
[[20,20,20,22],[22,23,24,24],[24,24,25]]

console.log(ageMatrix([20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20])); // [[20,20,20,20],[20,20,20,20],[20,20,20,20]]

console.log(ageMatrix([18, 20, 22, 24, 26, 28, 30, 18, 18]));

рони 25.03.2020 22:13

Nicanor13,
смотрите пост #4 снова.


Часовой пояс GMT +3, время: 23:41.