jeffwtribble
BAN USERHere's a solution in JavaScript:
// var set = [2, 3], n = 8;
// expect: results.exp = [1, 2, 3, 4, 6, 8, 9, 12]
// expect: results.non = [5, 7, 10, 11]
// expect: results.result = 12
var primeExpressibles = function (set, n) {
if (n < 1) return {exp: [], non: [], result: null};
if (n === 1) return {exp: [1], non: [], result: 1};
var results = {exp: [1], non: [], result: 1};
iteration:
for (var i = 2; i < set[0] * n; i++) {
var num = i, j = 0;
while (set[j] !== undefined) {
if (!Number.isInteger(num / set[j])) {
j++; continue; // continue while loop
}
num /= set[j];
if (num === 1) {
results.exp.push(i);
if (results.exp.length === n) {
results.result = i;
return results;
}
continue iteration; // break out of while loop, continue iteration
}
}
results.non.push(i);
}
return results; // should never reach this point, in theory...
};
Here's a solution in JavaScript:
//
// Input: [[1,3], [5,7], [2,4], [6,8]]
// Output: [[1,4], [5,8]] (no specific order)
//
/**
* Do these two ranges overlap?
*
* @param {array} a
* @param {array} b
* @return {boolen}
*/
var overlaps = function (a, b) {
return a[0] >= b[0] && a[0] <= b[1] // a[lo] is in range of b
|| a[1] >= b[0] && a[1] <= b[1]; // a[hi] is in range of b
};
/**
* Merge two ranges, assuming overlap
*
* @param {array} a
* @param {array} b
* @return {array}
*/
var merge = function (a, b) {
return [Math.min(a[0], b[0]), Math.max(a[1], b[1])];
};
/**
* Merge a single range into a list of ranges
*
* @param {array[array]} list
* @param {array} range
* @param {array[array]}
*/
var mergeRange = function (list, range) {
for (var i = 0; i < list.length; i++) {
if (overlaps(list[i], range)) { // the range overlaps
var newRange = merge(list[i], range);
list.splice(i, 1);
return mergeRange(list, newRange); // recursive call
}
}
list.push(range); // the range doesn't overlap, so just add it to list
return list;
};
/**
* Merge a list of ranges into each other
*
* @param {array[array]} ranges
* @return {array[array]}
*/
var mergeRanges = function (ranges) {
return ranges.reduce(function (acc, curr) {
return mergeRange(acc, curr);
}, []);
};
Here's a solution in JavaScript:
//
// Input: [[1,3], [5,7], [2,4], [6,8]]
// Output: [[1,4], [5,8]] (no specific order)
//
/**
* Do these two ranges overlap?
*
* @param {array} a
* @param {array} b
* @return {boolen}
*/
var overlaps = function (a, b) {
return a[0] >= b[0] && a[0] <= b[1] // a[lo] is in range of b
|| a[1] >= b[0] && a[1] <= b[1]; // a[hi] is in range of b
};
/**
* Merge two ranges, assuming overlap
*
* @param {array} a
* @param {array} b
* @return {array}
*/
var merge = function (a, b) {
return [Math.min(a[0], b[0]), Math.max(a[1], b[1])];
};
/**
* Merge a single range into a list of ranges
*
* @param {array[array]} list
* @param {array} range
* @param {array[array]}
*/
var mergeRange = function (list, range) {
for (var i = 0; i < list.length; i++) {
if (overlaps(list[i], range)) { // the range overlaps
var newRange = merge(list[i], range);
list.splice(i, 1);
return mergeRange(list, newRange); // recursive call
}
}
list.push(range); // the range doesn't overlap, so just add it to list
return list;
};
/**
* Merge a list of ranges into each other
*
* @param {array[array]} ranges
* @return {array[array]}
*/
var mergeRanges = function (ranges) {
return ranges.reduce(function (acc, curr) {
return mergeRange(acc, curr);
}, []);
};
Whoops! Just saw that I posted this twice..
- jeffwtribble November 20, 2015