是否可以使钳位函数比JS中的三元函数短?


22

想象一下这个短函数将一个数字钳位在0到255之间:

c = n => n > 0 ? n < 255 ? n : 255 : 0

这是使用JavaScript(没有ES.Next功能)的钳位函数的最短版本吗?

PS:不确定是否相关,但是0和255不是随机的,其想法是将数字钳位为8位无符号整数。


2
嗨,欢迎来到PPCG!明确一点,您可以在这里收到的任何答案都不一定是一个好主意,除了代码打高尔夫之外。除此之外,如果您关心它必须在哪个版本/环境中工作,则可能需要指定它。
FryAmTheEggman

1
哦,我很清楚。我已经更新了这个问题。谢谢您:)
Ricardo Amaral

2
我不了解JS,但是钳制的一种方法是对[0,n,255]中间元素进行排序并取其中的内容?
xnor

1
@xnor不幸的是,sort()默认情况下,JS 方法使用字典比较,因此需要显式回调。(有什么。)
阿尔诺

5
@Arnauld Wow,那真是愚蠢。但是,即使排序是数字形式,看起来也会更长一些。
xnor

Answers:


23

20字节

作为参考,这是不带空格且未命名函数的原始版本:

n=>n>0?n<255?n:255:0

在线尝试!


19字节

我们可以通过反转三元测试的逻辑并n>>8用于测试是否n255n232

n=>n<0?0:n>>8?255:n

在线尝试!


19字节

false0n232

n=>n>255?255:n>0&&n

在线尝试!


18字节

256232n<232falsen<0

n=>n>>8?n>0&&255:n

在线尝试!

已评论

n =>          // n = input number
  n >> 8 ?    // if n is greater than 255 or n is negative:
    n > 0 &&  //   return false if n is negative
    255       //   or 255 otherwise
  :           // else:
    n         //   return n unchanged

(这是@ValueInk在注释中提出的代码的固定版本。)


17字节

224<n224

n=>n>>8?-n>>>24:n

在线尝试!

已评论

n =>          // n = input number
  n >> 8 ?    // if n is greater than 255 or n is negative:
    -n >>> 24 //   non-arithmetic right-shift of -n by 24 positions
  :           // else:
    n         //   return n unchanged

为什么停在那里?如果您对算作0非常放心(JavaScript倾向于这样做),则您始终可以n=>n>>8?255:n>0&&n使用18个字节,因为false可以将其强制转换为零0,这将使所有负数都false
值墨水

1
n<0n>>8

非常好,非常感谢!
里卡多·阿玛拉尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.