Có thể làm cho một hàm kẹp ngắn hơn một ternary trong JS không?


22

Hãy tưởng tượng hàm ngắn này để kẹp một số trong khoảng từ 0 đến 255:

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

Đây có phải là phiên bản ngắn nhất có thể của chức năng kẹp với JavaScript (không có tính năng ES.Next) không?

PS: Không chắc nó có liên quan hay không, nhưng 0 và 255 không phải là ngẫu nhiên, ý tưởng là kẹp một số dưới dạng số nguyên không dấu 8 bit.


2
Xin chào và chào mừng đến với PPCG! Nói rõ hơn, bất kỳ câu trả lời nào bạn nhận được ở đây sẽ không nhất thiết phải là một ý tưởng hay để sử dụng trong bất cứ điều gì ngoại trừ việc chơi gôn. Ngoài ra, nếu bạn quan tâm đến phiên bản / môi trường nào nó phải hoạt động, bạn có thể muốn chỉ định nó.
FryAmTheEggman

1
Ồ, tôi nhận thức rõ. Tôi đã cập nhật câu hỏi một chút. Cảm ơn bạn :)
Ricardo Amaral

2
Tôi không biết JS, nhưng một cách để kẹp là sắp xếp [0,n,255]và lấy phần tử ở giữa - có thể ngắn hơn không?
xnor

1
@xnor Thật không may, sort()phương thức JS sử dụng so sánh từ vựng theo mặc định, do đó sẽ yêu cầu gọi lại rõ ràng. (Một cái gì đó như thế .)
Arnauld

5
@Arnauld Wow, thật là ngớ ngẩn. Nhưng có vẻ như nó sẽ dài hơn ngay cả khi loại đó là số.
xnor

Câu trả lời:


23

20 byte

Để tham khảo, đây là phiên bản gốc không có khoảng trắng và không đặt tên hàm:

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

Hãy thử trực tuyến!


19 byte

Chúng ta có thể lưu một byte bằng cách đảo ngược logic của các thử nghiệm ternary và sử dụng n>>8để kiểm tra xem n có lớn hơn 255 . Do hoạt động theo chiều bit, tuy nhiên điều này sẽ thất bại trong n232 .

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

Hãy thử trực tuyến!


19 byte

Cái này trả về false thay vì 0 nhưng hoạt động với n232 .

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

Hãy thử trực tuyến!


18 byte

Bằng cách kết hợp cả hai phiên bản trên, chúng tôi kết thúc với một chức năng phù hợp với 256232n<232falsen<0

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

Hãy thử trực tuyến!

Đã bình luậ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

(Đây là bản sửa đổi cố định của mã được đề xuất bởi @ValueInk trong các nhận xét.)


17 byte

224<n224

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

Hãy thử trực tuyến!

Đã bình luậ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

Tại sao dừng lại ở đó? Nếu bạn cực kỳ tự do với số được tính là 0 (vì JavaScript có xu hướng làm), bạn luôn có thể sử n=>n>>8?255:n>0&&ndụng 18 byte , vì falsecó thể bị ép buộc 0và điều này sẽ khiến tất cả các số âm đánh giá thànhfalse
Giá trị mực

1
@ValueInk Nếu bạn không kiểm tra n<0n>>8

Rất đẹp, cảm ơn bạn rất nhiều!
Ricardo Amaral
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.