Оброзование возрастних групп

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

Например если

A = [18, 30, 20, 45, 36, 20, 47, 50];

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

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

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

function ageMatrix(arr)

{

    let c;

    return arr.sort((a, b) => a - b).reduce((a, b) => {

        if (!c || c.length == 4 || c.length >= 2 && c[c.length - 1] + 4 < b) {

            c = [];

            a.push(c)

        }

        c.push(b);

        return a;

    }, [])

}

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])); // [[18,18,18,20],[22,24,26,28],[30]]  но должен виводить [[18,18,18,20],[22,24,26],[28, 30]]

Код верно работает во всех вариантах кроме последнего варианта поможете исправить ошибку?

Твой код не учитывает ситуаций когда остается распределить 2 элемета и в c уже есть 2 элемента. Тут возможна ситуация что оставшиеся 2 элемента нужно добавить в c или сделать отдельным массивом. И это не единственная “граничная” ситуация подобного рода. Я потратил дофига времени чтобы понять как формулизовать условие которое и не нашел ответа.

Большое спасибо Дмитрий