一线任务:检查范围-CodeWars(使用JavaScript的方法)

时间:2018-10-09 21:33:37

标签: javascript methods shortest

  

任务

     

为您提供了一个整数数组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那里得到了这些

1 个答案:

答案 0 :(得分:4)

此代码通过了代码战的所有测试(感谢@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-在算术上下文中,布尔值被认为是1true)或0({{1} }))。因此,对于示例数组,我们得到false(尽管我们真正感兴趣的唯一部分是[1,2,3,4,5,6,7,7,7,7]的值)。该测试计算ix>v是否相同,仅当它们均为false时才为真,这意味着v>yx<=v是我们想要的最终条件。最后,v<=y尝试按位或使用|i的数组,该数组仅等效于i,因为该上下文中的数组== 0。