เป็นไปได้ไหมที่จะทำให้ฟังก์ชั่นแคลมป์สั้นลงกว่าไตรภาคใน JS?


22

ลองนึกภาพฟังก์ชั่นสั้น ๆ นี้เพื่อจับตัวเลขระหว่าง 0 ถึง 255:

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

นี่เป็นรุ่นที่สั้นที่สุดที่เป็นไปได้ของฟังก์ชันตัวหนีบที่มี JavaScript (ไม่มีคุณสมบัติ ES.Next) หรือไม่

PS: ไม่แน่ใจว่ามันเกี่ยวข้องหรือไม่ 0 และ 255 ไม่สุ่มความคิดคือการยึดตัวเลขเป็นจำนวนเต็ม 8 บิตที่ไม่ได้ลงชื่อ


2
สวัสดีและยินดีต้อนรับสู่ PPCG! เพื่อความชัดเจนคำตอบใด ๆ ที่คุณได้รับที่นี่ไม่จำเป็นต้องเป็นความคิดที่ดีที่จะใช้ในสิ่งใด ๆ ยกเว้นการตีกอล์ฟ นอกเหนือจากนั้นหากคุณสนใจว่าจะต้องใช้เวอร์ชัน / สภาพแวดล้อมแบบใดในคุณอาจต้องระบุ
FryAmTheEggman

1
โอ้ฉันรู้ดี ฉันได้อัพเดทคำถามเล็กน้อย ขอบคุณ :)
Ricardo Amaral

2
ฉันไม่รู้จัก JS แต่วิธีหนึ่งที่จะหนีบคือการเรียงลำดับ[0,n,255]และรับองค์ประกอบกลาง - นั่นอาจสั้นกว่านี้ไหม
xnor

1
@xnor แต่น่าเสียดายที่sort()วิธีการJS ใช้การเปรียบเทียบพจนานุกรมโดยค่าเริ่มต้นเพื่อที่จะต้องมีการโทรกลับอย่างชัดเจน (บางอย่างเช่นนั้น )
Arnauld

5
@Arnauld ว้าวนั่นมันค่อนข้างโง่ แต่ดูเหมือนว่ามันจะนานกว่าแม้ว่าการเรียงลำดับจะเป็นตัวเลข
xnor

คำตอบ:


23

20 ไบต์

สำหรับการอ้างอิงนี่เป็นเวอร์ชั่นดั้งเดิมที่ไม่มีช่องว่างและไม่มีการตั้งชื่อฟังก์ชัน:

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

ลองออนไลน์!


19 ไบต์

เราสามารถบันทึก byte โดยแปลงกลับตรรกะของการทดสอบแบบไตรภาคและใช้n>>8ในการทดสอบว่ามากกว่าหรือไม่ เพราะการดำเนินการระดับบิตนี้ แต่จะล้มเหลวสำหรับ{32}n255n232

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

ลองออนไลน์!


19 ไบต์

นี้เป็นหนึ่งในผลตอบแทนแทนแต่งานสำหรับ{32}false0n232

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

ลองออนไลน์!


18 ไบต์

โดยการรวมทั้งสองรุ่นข้างต้นเราจะจบลงด้วยฟังก์ชั่นที่เหมาะกับและผลตอบแทนสำหรับ<0256232n<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

ดีมากขอบคุณมาก!
Ricardo Amaral
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.