Ist es möglich, eine Klemmfunktion in JS kürzer als eine ternäre zu machen?

22

Stellen Sie sich diese kurze Funktion vor, um eine Zahl zwischen 0 und 255 zu klemmen:

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

Ist dies die kürzest mögliche Version einer Clamp-Funktion mit JavaScript (ohne ES.Next-Features)?

PS: Ich bin mir nicht sicher, ob es relevant ist, aber die 0 und 255 sind nicht zufällig. Die Idee ist, eine Zahl als 8-Bit-Ganzzahl ohne Vorzeichen festzuhalten.

Ricardo Amaral
quelle
2
Hallo und willkommen bei PPCG! Um ganz klar zu sein, jede Antwort, die Sie hier erhalten, ist nicht unbedingt eine gute Idee, um sie in irgendetwas anderem als Code-Golf zu verwenden. Wenn Sie sich außerdem Gedanken darüber machen, in welcher Version / Umgebung sie funktionieren soll, möchten Sie sie möglicherweise angeben.
FryAmTheEggman
1
Oh, mir ist klar. Ich habe die Frage ein bisschen aktualisiert. Vielen Dank :)
Ricardo Amaral
2
Ich kenne JS nicht, aber eine Möglichkeit zum Klemmen besteht darin [0,n,255], das mittlere Element zu sortieren und zu entnehmen - könnte das kürzer sein?
5.
1
@xnor Leider verwendet die JS- sort()Methode standardmäßig einen lexikografischen Vergleich, sodass ein expliziter Rückruf erforderlich wäre. (So ähnlich .)
Arnauld
5
@Arnauld Wow, das ist ziemlich dumm. Aber es sieht so aus, als wäre es länger, selbst wenn die Sortierung numerisch wäre.
5.

Antworten:

23

20 Bytes

Als Referenz ist dies die Originalversion ohne Leerzeichen und ohne Benennung der Funktion:

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

Probieren Sie es online!


19 Bytes

Wir können ein Byte sparen, indem wir die Logik der ternären Tests invertieren und n>>8testen, ob n größer als 255 . Aufgrund der bitweisen Operation schlägt dies jedoch für n232 fehl .

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

Probieren Sie es online!


19 Bytes

false0n232

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

Probieren Sie es online!


18 Bytes

256232n<232falsen<0

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

Probieren Sie es online!

Kommentiert

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

(Dies ist eine feste Überarbeitung des von @ValueInk in den Kommentaren vorgeschlagenen Codes .)


17 Bytes

224<n224

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

Probieren Sie es online!

Kommentiert

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
quelle
Warum dort aufhören? Wenn Sie extrem liberal sind mit dem, was zählt als 0 (wie JavaScript neigt zu tun) Sie immer gehen n=>n>>8?255:n>0&&nfür 18 Bytes , da falsewerden dazu gezwungen kann , 0und dies wird alle negativen Zahlen machen auswerten zufalse
Wert Ink
1
n<0n>>8
Sehr schön, vielen Dank!
Ricardo Amaral