Apakah mungkin untuk membuat fungsi penjepit lebih pendek dari terner di JS?

22

Bayangkan fungsi singkat ini untuk menjepit angka antara 0 dan 255:

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

Apakah ini versi terpendek dari fungsi penjepit dengan JavaScript (tanpa fitur ES.Next)?

PS: Tidak yakin apakah itu relevan tetapi, 0 dan 255 tidak acak, idenya adalah untuk menjepit angka sebagai bilangan bulat 8-bit unsigned.

Ricardo Amaral
sumber
2
Hai dan selamat datang di PPCG! Untuk lebih jelasnya, jawaban apa pun yang Anda terima di sini tidak selalu merupakan ide yang baik untuk digunakan dalam apa pun kecuali untuk golf kode. Selain itu, jika Anda peduli tentang versi / lingkungan mana yang harus bekerja, Anda mungkin ingin menentukannya.
FryAmTheEggman
1
Oh, saya sangat sadar. Saya sedikit memperbarui pertanyaan. Terima kasih :)
Ricardo Amaral
2
Saya tidak tahu JS, tapi satu cara untuk menjepit adalah menyortir [0,n,255]dan mengambil elemen tengah - mungkin itu lebih pendek?
xnor
1
@ xnor Sayangnya, sort()metode JS menggunakan perbandingan lexicographical secara default, sehingga akan membutuhkan panggilan balik eksplisit. (Semacam itu .)
Arnauld
5
@Arnauld Wow, itu sangat konyol. Tapi sepertinya itu akan lebih lama bahkan jika pengurutannya numerik.
xnor

Jawaban:

23

20 byte

Sebagai referensi, ini adalah versi asli tanpa spasi dan tanpa penamaan fungsi:

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

Cobalah online!


19 byte

Kita dapat menyimpan byte dengan membalik logika tes terner dan menggunakan n>>8untuk menguji apakah n lebih besar dari 255 . Karena operasi bitwise, namun ini akan gagal untuk n232 .

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

Cobalah online!


19 byte

Yang ini mengembalikan false bukannya 0 tetapi bekerja untuk n232 .

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

Cobalah online!


18 byte

Dengan menggabungkan kedua versi di atas, kita berakhir dengan fungsi yang bekerja untuk 256232n<232 dan mengembalikan false untuk n<0 .

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

Cobalah online!

Berkomentar

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

(Ini adalah revisi tetap dari kode yang diusulkan oleh @ValueInk di komentar.)


17 byte

224<n224

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

Cobalah online!

Berkomentar

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
sumber
Kenapa berhenti di situ? Jika Anda sangat liberal dengan apa yang dianggap sebagai 0 (sebagai JavaScript cenderung untuk melakukan) Anda selalu bisa pergi untuk n=>n>>8?255:n>0&&nuntuk 18 byte , karena falsedapat dipaksa untuk 0dan ini akan membuat semua angka negatif mengevaluasifalse
Nilai Ink
1
n<0n>>8
Bagus sekali, terima kasih banyak!
Ricardo Amaral