È possibile rendere una funzione di serraggio più corta di una ternaria in JS?


22

Immagina questa breve funzione per bloccare un numero compreso tra 0 e 255:

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

È questa la versione più breve possibile di una funzione di blocco con JavaScript (senza funzionalità ES.Next)?

PS: Non sono sicuro che sia pertinente, ma 0 e 255 non sono casuali, l'idea è di bloccare un numero come numero intero senza segno a 8 bit.


2
Ciao e benvenuto in PPCG! Giusto per essere chiari, qualsiasi risposta che ricevi qui non sarà necessariamente una buona idea da usare in tutto tranne che per il golf del codice. A parte questo, se ti interessa quale versione / ambiente debba funzionare, potresti volerlo specificare.
FryAmTheEggman

1
Oh, lo so bene. Ho aggiornato un po 'la domanda. Grazie :)
Ricardo Amaral il

2
Non conosco JS, ma un modo per bloccare è ordinare [0,n,255]e prendere l'elemento centrale - potrebbe essere più breve?
xnor

1
@xnor Sfortunatamente, il sort()metodo JS utilizza un confronto lessicografico per impostazione predefinita, quindi ciò richiederebbe un callback esplicito. (Qualcosa del genere .)
Arnauld

5
@Arnauld Wow, è piuttosto sciocco. Ma sembra che sarebbe più lungo anche se l'ordinamento fosse numerico.
xnor

Risposte:


23

20 byte

Per riferimento, questa è la versione originale senza spazi bianchi e senza nominare la funzione:

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

Provalo online!


19 byte

Possiamo salvare un byte invertendo la logica dei test ternari e usando n>>8per verificare se è maggiore di . A causa dell'operazione bit per bit, ciò tuttavia non funzionerà per .n255n232

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

Provalo online!


19 byte

Questo restituisce invece di ma funziona per .false0n232

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

Provalo online!


18 byte

Combinando entrambe le versioni precedenti, finiamo con una funzione che funziona per e restituisce per .256232n<232falsen<0

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

Provalo online!

Commentate

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

(Questa è una revisione fissa del codice proposto da @ValueInk nei commenti.)


17 byte

Possiamo fare un ulteriore passo limitando l'intervallo di input valido a :224<n224

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

Provalo online!

Commentate

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

Perché fermarsi qui? Se siete estremamente liberale con ciò che conta come uno 0 (come tende JavaScript di fare) si può sempre andare per n=>n>>8?255:n>0&&nper 18 byte , dal momento che falsepuò essere costretto a 0e questo renderà tutti i numeri negativi restituisconofalse
Valore Ink

1
@ValueInk Se non esegui il test prima, sarà vero per qualsiasi input negativo. n<0n>>8
Arnauld

Molto bello, grazie mille!
Ricardo Amaral,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.