Czy jest możliwe, aby funkcja JS była krótsza niż trójskładnik w JS?


22

Wyobraź sobie tę krótką funkcję, aby zacisnąć liczbę między 0 a 255:

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

Czy to najkrótsza możliwa wersja funkcji clampowania z JavaScript (bez funkcji ES.Next)?

PS: Nie jestem pewien, czy jest to istotne, ale 0 i 255 nie są losowe, chodzi o to, aby zacisnąć liczbę jako 8-bitową liczbę całkowitą bez znaku.


2
Cześć i witamy w PPCG! Żeby było jasne, każda otrzymana tutaj odpowiedź niekoniecznie będzie dobrym pomysłem do użycia w czymkolwiek poza golfowym kodowaniem. Poza tym, jeśli zależy ci na tym, w jakiej wersji / środowisku ma działać, możesz chcieć to określić.
FryAmTheEggman

1
Och, jestem tego świadomy. Trochę zaktualizowałem pytanie. Dziękuję :)
Ricardo Amaral

2
Nie znam JS, ale jednym ze sposobów na zaciśnięcie jest posortowanie [0,n,255]i zabranie środkowego elementu - czy to może być krótsze?
xnor

1
@xnor Niestety sort()metoda JS domyślnie używa porównania leksykograficznego, więc wymagałoby to jawnego wywołania zwrotnego. (Coś w tym stylu .)
Arnauld

5
@Arnauld Wow, to dość głupie. Ale wygląda na to, że byłby dłuższy, nawet gdyby sortowanie było liczbowe.
xnor

Odpowiedzi:


23

20 bajtów

Dla porównania, jest to oryginalna wersja bez białych znaków i bez nazywania funkcji:

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

Wypróbuj online!


19 bajtów

Możemy zapisać bajt, odwracając logikę testów trójskładnikowych i n>>8sprawdzając, czy jest większe niż . Z powodu operacji bitowej nie powiedzie się to jednak dla .n255n232

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

Wypróbuj online!


19 bajtów

Ten zwraca zamiast ale działa dla .false0n232

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

Wypróbuj online!


18 bajtów

Łącząc obie powyższe wersje, otrzymujemy funkcję, która działa dla i zwraca dla .256232n<232falsen<0

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

Wypróbuj online!

Skomentował

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

(Jest to poprawiona wersja kodu zaproponowanego przez @ValueInk w komentarzach).


17 bajtów

Możemy pójść o krok dalej, ograniczając prawidłowy zakres wejściowy do :224<n224

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

Wypróbuj online!

Skomentował

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

Po co się tu zatrzymywać? Jeśli jesteś bardzo liberalny, co liczy się jako 0 (jak zwykle obsługa JavaScript, żeby zrobić) zawsze można iść do n=>n>>8?255:n>0&&ndo 18 bajtów , ponieważ falsemoże być zmuszany do 0a to sprawi, że wszystkie liczby ujemne oceny dofalse
Value Ink

1
@ValueInk Jeśli nie przetestujesz wcześniej , będzie prawdą dla każdego negatywnego wkładu. n<0n>>8
Arnauld

Bardzo miło, dziękuję bardzo!
Ricardo Amaral
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.