[1, 2, 1000, 1001,...]
далее все 100500 элементов больше 1000. const sumTwoSmallestNumbers = arr => {
let a = arr[0];
let b = arr[1];
if (a > b) {
[a, b] = [b, a];
}
for (let i = 2; i < arr.length; i++) {
const v = arr[i];
if (v < a) {
b = a;
a = v;
} else if (v < b) {
b = v;
}
}
return a + b;
};
sumTwoSmallestNumbers([55, 44, 1, 99, 2]); // 3
= capacity
вместимость всего массива.X > capacity
— «невпихуемо!» — задача не имеет решения.k = X / capacity
меньше или равен 1.k
.const spread = (value, arr) => {
const CELL_MAX = 1;
const sum = arr.reduce((acc, c) => acc + c);
const capacity = arr.length * CELL_MAX - sum;
if (value > capacity) throw new Error("Value won't fit");
const k = value / capacity;
return arr.map(el => el + (CELL_MAX - el) * k);
}
spread(0.2, [ 0.1, 0.1 ]) // [ 0.2, 0.2 ]
spread(0.2, [ 0.1, 0.99 ]) // [ 0.29780219780219785, 0.9921978021978022 ]
rgb(0, 0, 0)
соответствует множество hsl(*, *, 0)
.function spread(arr, src) {
const result = [...arr]; // копия исходного массива
if (src <= 0) return result;
const axis = {}; // value: [ids of bins]
arr.forEach((v, i) => {
if (!axis[v]) axis[v] = [];
axis[v].push(i);
});
const keys = Object.keys(axis).sort((a, b) => a - b);
const bins = [...axis[keys[0]]]; // ids of "bins" we're filling
for (let i = 1; i < keys.length; i++) {
const currentKey = keys[i];
const prevKey = keys[i - 1];
const diff = currentKey - prevKey;
const capacity = bins.length * diff;
if (src < capacity) break;
bins.forEach(key => result[key] += diff);
src -= capacity;
bins.push(...axis[currentKey]);
}
if (src) {
const want = Math.ceil(src / bins.length);
bins.forEach(key => {
const given = Math.min(src, want)
result[key] += given;
src -= given;
});
}
console.log(result);
return result;
}
spread([30, 50, 350], 300); // [ 190, 190, 350 ]
spread([30, 50, 350], 1001); // [ 477, 477, 477 ]
spread([130, 50, 50, 101], 800); // [ 282, 283, 283, 283 ]
0000DD, 0000C8
«расстояние» будет такое:(0x00 - 0x00)^2 + (0x00 - 0x00)^2 + (0xDD - 0xC8)^2 = 441
Так посчитать до каждого из определённых цветов, найти минимум.3479BDFGHJKLMNPRSTWXZ
a a a
b b b
c c c c c c
const groups = {
A: ['a', 'a', 'a',],
B: ['b', 'b', 'b', 'b',],
C: ['c', 'c', 'c', 'c', 'c', 'c',],
};
const longest = Math.max.apply(null, Object.values(groups).map(a => a.length));
const sortMe = [];
for (let p in groups) {
const values = groups[p];
const step = longest / values.length; // 1 and bigger
values.forEach((v, i) => sortMe.push({w: i * step, v: v}));
}
sortMe.sort((a, b) => a.w - b.w);
const result = sortMe.map(el => el.v);
console.log(result);
// ["a", "b", "c", "c", "b", "a", "c", "b", "c", "a", "c", "b", "c"]