4

任务

给定一个整数数组 a 和两个整数 x 和 y。计算数组中元素的数量,使得 `x ≤ a[i] ≤ y,其中 i 是元素的从 0 开始的索引。

代码限制

少于 48 个字符。

例子

对于 a = [2, 5, 6, 7, 1, 3, 4, 11, 56, 49],x = 1 和 y = 7,输出应为 7。

应计算元素 2、5、6、7、1、3、4。

我已经累了filterreduce如果不让它超过 48 个字符,我想不出任何其他可能的方法。

这是通过使用filter

checkRange=(a,x,y)=>a.filter(i=>i>=x&&i<=y).length

使用reduce

checkRange=(a,x,y)=>a.reduce((c,i)=>i>=x&&i<=y?++c:c,0);

函数调用示例

a =[95,92,27,55,55,20,40,8,7,45,87,14,44,35,64,84,95,85,69,47,53,49,95,54,97,7,67,31,76,97,7,24,82,61,10,34,34,85,66,96,65,2,84,4,68,74,46,50]
    x = 64
    y = 76

checkRange(a,x,y) // Expected: 8

到目前为止,我已经获得了 50 多个字符......而且我需要将它们减少到 47 个。

到目前为止的一些提示...

  • 使用另一种更短的方法
  • 计算索引值,而不是使用length.
  • 不需要<= or >=,只需要==

我从https://www.codewars.com/kata/one-line-task-check-range/discuss/javascript得到了这些

4

1 回答 1

5

这个通过了所有关于 codewars 的测试(感谢@ggorlen 的提示):

a = [2, 5, 6, 7, 1, 3, 4, 11, 56, 49];
x = 1;
y = 7;
checkRange=(a,x,y)=>a.map(v=>i+=x>v==v>y,i=0)|i;
console.log(checkRange(a,x,y));

它通过使用参数设置计数器 ( i) 来工作,该thisValue参数Array.map将所有值替换为a通过测试的值的计数x>v==v>y(通过使用i+=x>v==v>y- 在算术上下文中,布尔值被认为是1( true) 或0( false)) . 所以对于样本数组,我们得到[1,2,3,4,5,6,7,7,7,7](尽管我们真正感兴趣的唯一部分是 的值i)。测试计算x>v和是否v>y相同,只有当它们都为假时才能为真,这意味着x<=v并且v<=y这是我们想要的结束条件。最后|i尝试按位或数组与i它等效于i因为该上下文中的数组 == NaN,并且NaN与数字进行按位或运算会返回该数字。

请注意,在其中a有一个数字的特殊情况下,输出map将是[0]or[1]并且这将成功转换为0or1用于按位的目的OR。在这种情况下,该数字将与i(因为 的输出map是一个值数组i)相同,因此按位的结果OR将再次符合i要求。例如:

a = [2];
x = 1;
y = 7;
checkRange=(a,x,y)=>a.map(v=>i+=x>v==v>y,i=0)|i;
console.log(checkRange(a,x,y));

a = [49];
console.log(checkRange(a,x,y));

于 2018-10-09T23:03:44.530 回答