Чи можна зробити функцію затискання коротшою за потрійну в JS?


22

Уявіть цю коротку функцію, щоб зафіксувати число між 0 і 255:

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

Це найкоротша можлива версія функції затиску з JavaScript (без функцій ES.Next)?

PS: Не впевнений, що це актуально, але 0 і 255 не є випадковим, ідея полягає в тому, щоб затиснути число у вигляді 8-бітного цілого числа без підпису.


2
Привіт і ласкаво просимо до PPCG! Щоб було зрозуміло, будь-яка відповідь, яку ви отримаєте тут, не обов'язково буде гарною ідеєю для використання в будь-якому, крім коду для гольфу. Крім цього, якщо ви дбаєте про те, над якою версією / середовищем воно має працювати, ви можете вказати його.
FryAmTheEggman

1
О, я добре знаю. Я трохи оновив питання. Дякую :)
Рікардо Амарал

2
Я не знаю JS, але один із способів затиснути - це сортувати [0,n,255]та взяти середній елемент - може, це буде коротше?
xnor

1
@xnor На жаль, sort()метод JS використовує лексикографічне порівняння за замовчуванням, щоб вимагати явного зворотного виклику. (Щось подібне .)
Арнольд

5
@Arnauld Нічого собі, це досить нерозумно. Але схоже, це було б довше, навіть якби сорт був числовим.
xnor

Відповіді:


23

20 байт

Для довідки, це оригінальна версія без пробілів та без іменування функції:

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

Спробуйте в Інтернеті!


19 байт

Ми можемо зберегти байт, перевернувши логіку потрійних тестів і використовуючи n>>8для перевірки, чи більше . Через побітну операцію це не вдасться для .n255n232

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

Спробуйте в Інтернеті!


19 байт

Ця повертає замість але працює при n 2 32 .false0n232

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

Спробуйте в Інтернеті!


18 байт

256232n<232falsen<0

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

Спробуйте в Інтернеті!

Прокоментував

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

(Це виправлена ​​редакція коду, запропонована @ValueInk у коментарях.)


17 байт

224<n224

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

Спробуйте в Інтернеті!

Прокоментував

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

Навіщо зупинятися на цьому? Якщо ви вкрай ліберальні з тим, що вважається рівним 0 (як це робить JavaScript), ви завжди можете n=>n>>8?255:n>0&&nотримати 18 байт , оскільки falseце можна примусити, 0і це зробить оцінку всіх негативних чиселfalse
Value Ink

1
n<0n>>8

Дуже приємно, дуже дякую!
Рікардо Амарал
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.