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.


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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.