"Generate range of integers"单线解决方案



我刚刚开始挑战代码战争,其中之一是"生成整数范围"问题。我设法解决了 for loop 的问题,但我想知道我是否可以在一行中解决这个问题?

我尝试使用填充和映射方法与 while 和 do-while 循环相结合。问题是我无法在返回的数组中获取第一个数字(起始最小值(。当循环第一次计算结果为 true 时,它返回最小值递增步长值。

function generateRange(min,max,step) {
return Array(Math.floor((max - min) / step ))
.fill()
.map(() => {while(min <= max) {return min+=step;}});
}

console.log(generateRange(0, 10, 2));

我期待从最小到最大的数字,其中有步长。 min = 0,max = 10,步长 = 2,结果 => [0,2,4,6,8,10] 但我得到的所有数字没有第一个起始最小值 [2,4,6,8,10]。

您可以将min递减一步,并获取此值进行进一步映射。

function generateRange(min, max, step) {
return Array.from(
{ length: Math.floor((max - (min -= step)) / step) },
() => min += step
);
}
console.log(generateRange(0, 10, 2));

坚持原始代码:

function generateRange(min,max,step) {
return Array(Math.floor((max - min + step) / step ))
.fill()
.map(() => {while(min <= max) {return (min+=step)-step;}});
}
console.log(generateRange(0, 10, 2));

function generateRange(min, max, step) {
return "0".repeat(Math.floor((max - min) / step) + 1).split("").map((x, i) => min + i * step);
}
console.log(generateRange(0, 10, 2));

这样的事情应该有效:

function range(min,max,step = 1) {
return [...Array(Math.floor((max-min+step)/step)).keys()].map(x => x*step + min);
}
console.log(range(0,10,2))
console.log(range(2,5,1))
console.log(range(1,25,5))
console.log(range(0,100,10))

我认为生成器函数非常适合这些类型的事情。

您的问题要求单行,尽管我认为它作为 2 个功能看起来更好。 这是因为您可以在可能不需要数组的其他地方使用生成器。

function* iter_generateRange(min,max,step) {
for (let l = min; l <= max; l += step) yield l;
}
function generateRange(...args) {
return Array.from(iter_generateRange(...args));
}
const generateRange1liner = (min, max, step) =>
[...(function* () {
for (let l = min; l <= max; l += step) yield l;
}())]; 
//use the generateRange that returns the array
console.log(JSON.stringify(generateRange(10, 20, 2)));
//we can use it here too..
for (const r of iter_generateRange(3, 9, 3)) console.log(r);
//and finally using the 1 liner version
console.log(JSON.stringify(generateRange1liner(10, 20, 2)));

这应该有效:

function generateRange(min,max,step) {
return Array.from(Array(((max - min) / step) + 1).keys()).map(el => (el * step) + min);
}
console.log(generateRange(20, 40, 2));

相关内容

最新更新