Можно ли сделать функцию зажима короче тройной в 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 Wow, это довольно глупо. Но похоже, что это будет дольше, даже если сортировка была числовой.
XNOR

Ответы:

23

20 байт

Для справки: это оригинальная версия без пробелов и без названия функции:

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

Попробуйте онлайн!


19 байт

Мы можем сохранить байт, инвертировав логику троичных тестов и используя n>>8для проверки, больше ли n255 . Однако из-за побитовой операции это не удастся при n232 .

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

Попробуйте онлайн!


19 байт

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
Arnauld
источник
Зачем останавливаться на достигнутом? Если вы очень либеральным с тем, что считается как 0 (как JavaScript , как правило , делать) , вы всегда можете пойти n=>n>>8?255:n>0&&nна 18 байт , так как falseможет быть принужден к , 0и это сделает все отрицательные числа вычислятьсяfalse
Value Ink
1
n<0n>>8
Очень приятно, большое спасибо!
Рикардо Амарал