Est-il possible de rendre une fonction de serrage plus courte qu'un ternaire en JS?

22

Imaginez cette fonction courte pour fixer un nombre entre 0 et 255:

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

S'agit-il de la version la plus courte possible d'une fonction de serrage avec JavaScript (sans les fonctionnalités ES.Next)?

PS: Je ne sais pas si c'est pertinent mais, le 0 et le 255 ne sont pas aléatoires, l'idée est de bloquer un nombre comme un entier non signé de 8 bits.

Ricardo Amaral
la source
2
Salut et bienvenue à PPCG! Juste pour être clair, toute réponse que vous recevrez ici ne sera pas nécessairement une bonne idée à utiliser dans quoi que ce soit, sauf pour le golf de code. En dehors de cela, si vous vous souciez de la version / de l'environnement dans lequel il doit fonctionner, vous voudrez peut-être le spécifier.
FryAmTheEggman
1
Oh, je suis bien conscient. J'ai un peu mis à jour la question. Merci :)
Ricardo Amaral
2
Je ne connais pas JS, mais une façon de serrer est de trier [0,n,255]et de prendre l'élément central - cela pourrait-il être plus court?
xnor
1
@xnor Malheureusement, la sort()méthode JS utilise une comparaison lexicographique par défaut, ce qui nécessiterait un rappel explicite. (Quelque chose comme ça .)
Arnauld
5
@Arnauld Wow, c'est assez idiot. Mais il semble que ce serait plus long même si le tri était numérique.
xnor

Réponses:

23

20 octets

Pour référence, il s'agit de la version originale sans espace et sans nommer la fonction:

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

Essayez-le en ligne!


19 octets

Nous pouvons enregistrer un octet en inversant la logique des tests ternaires et en utilisant n>>8pour tester si est supérieur à . En raison de l'opération au niveau du bit, cela échouera cependant pour .n255n232

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

Essayez-le en ligne!


19 octets

Celui-ci renvoie au lieu de mais fonctionne pour .false0n232

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

Essayez-le en ligne!


18 octets

En combinant les deux versions ci-dessus, nous nous retrouvons avec une fonction qui fonctionne pour et renvoie pour .256232n<232falsen<0

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

Essayez-le en ligne!

Commenté

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

(Il s'agit d'une révision fixe du code proposé par @ValueInk dans les commentaires.)


17 octets

Nous pouvons aller plus loin en limitant la plage d'entrée valide à :224<n224

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

Essayez-le en ligne!

Commenté

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
la source
Pourquoi s'arrêter là? Si vous êtes extrêmement libérale avec ce qui compte comme 0 (comme JavaScript tend à faire) , vous pouvez toujours aller n=>n>>8?255:n>0&&npour 18 octets , car falsepeut être contraint à 0et cela faire tous les numéros négatifs évaluent àfalse
Valeur d'
1
@ValueInk Si vous ne testez pas avance, sera vrai pour toute entrée négative. n<0n>>8
Arnauld
Très bien, merci beaucoup!
Ricardo Amaral