É possível tornar uma função de grampo menor que um ternário em JS?

22

Imagine esta função curta para fixar um número entre 0 e 255:

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

Essa é a versão mais curta possível de uma função de grampo com JavaScript (sem os recursos ES.Next)?

PS: Não tenho certeza se é relevante, mas os 0 e 255 não são aleatórios, a idéia é fixar um número como um número inteiro não assinado de 8 bits.

Ricardo Amaral
fonte
2
Olá e bem-vindo ao PPCG! Só para esclarecer, qualquer resposta que você receber aqui não será necessariamente uma boa idéia para ser usada em qualquer coisa, exceto no código de golfe. Além disso, se você se preocupa com qual versão / ambiente ele deve funcionar, convém especificá-lo.
FryAmTheEggman 5/03
1
Oh, eu estou bem ciente. Atualizei a pergunta um pouco. Obrigado :)
Ricardo Amaral
2
Não conheço JS, mas uma maneira de prender é classificar [0,n,255]e pegar o elemento do meio - isso pode ser mais curto?
xnor 5/03
1
@xnor Infelizmente, o sort()método JS usa uma comparação lexicográfica por padrão, o que exigiria um retorno de chamada explícito. (Algo assim .)
Arnauld
5
@ Arnauld Uau, isso é bem bobo. Mas parece que seria mais longo, mesmo que o tipo fosse numérico.
xnor 5/03

Respostas:

23

20 bytes

Para referência, esta é a versão original sem espaço em branco e sem nomear a função:

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

Experimente online!


19 bytes

Podemos salvar um byte invertendo a lógica dos testes ternários e usando n>>8para testar se n é maior que 255 . Devido à operação bit a bit, isso irá falhar para n232 .

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

Experimente online!


19 bytes

false0n232

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

Experimente online!


18 bytes

256232n<232falsen<0

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

Experimente online!

Comentado

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

(Esta é uma revisão fixa do código proposto por @ValueInk nos comentários.)


17 bytes

224<n224

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

Experimente online!

Comentado

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
Arnauld
fonte
Por que parar aí? Se você é extremamente liberal com o que conta como um 0 (como JavaScript tende a fazer), você pode sempre ir para n=>n>>8?255:n>0&&npara 18 bytes , uma vez que falsepode ser coagido a 0e isso vai fazer todos os números negativos avaliar afalse
Valor Ink
1
n<0n>>8
Muito bom, muito obrigado!
Ricardo Amaral