Japt 29 29ไบต์
Japtเป็นรุ่นสั้นJa vaScri พอยต์ ล่าม
1o5 mZ=>$eval$(Uq'+)/2-UgZ%4
โปรดทราบว่าฟังก์ชั่นลูกศรต้องการเบราว์เซอร์ที่สอดคล้องกับ ES6 เช่น Firefox รุ่นใหม่ การป้อนข้อมูลไปในการเป็น array 4 [1,-1,4,2]
รายการเช่น
มันทำงานอย่างไร
// Implicit: U = input array
1o5 // Create a range of integers from 1 to 5. Returns [1,2,3,4]
mZ=> // Map each item Z in this range to:
$eval$( // evaluate:
Uq'+ // U joined with "+" (equivalent to summing U)
)/2 // divided by 2,
-UgZ%4 // minus the item at Z%4 in the input. This translates to [y₁,x₂,y₂,x₁],
// which in turn tranlsates to:
// [(x₁-y₁+x₂+y₂)/2, (x₁+y₁-x₂+y₂)/2, (x₁+y₁+x₂-y₂)/2, (-x₁+y₁+x₂+y₂)/2]
// which is [Lx,Ly,Rx,Ry], or [Rx,Ry,Lx,Ly], depending on the situation.
// Implicit: Output last expression
มันเป็นอย่างไรกอล์ฟ
ฉันลองเพียงคัดลอกวิธีของ Python ของ @ Mego สิ่งนี้ทำให้ฉันกับสัตว์ประหลาดขนาด 48 ไบต์:
(หมายเหตุ: ข้อมูลที่ไม่ควรถูกห่อในอาร์เรย์ในขณะนี้)
[U-V+W+X /2,(U+V-W+X /2,(U+V+W-X /2,(V+W+X-U /2]
เนื่องจากแต่ละรายการเหล่านี้จะต้องหารด้วย 2 จึงสั้นกว่าในการจับคู่อาร์เรย์ทั้งหมดด้วยmY=>Y/2
:
[U-V+W+X,U+V-W+X,U+V+W-X,V+W+X-U]mY=>Y/2
ตอนนี้คืออะไร 1,2,3,0
ดีอาร์เรย์คือตอนนี้เพียงแค่เพิ่มสามของปัจจัยการผลิตและลบที่สี่ต่อไปนี้รูปแบบ ดังนั้นเราสามารถแพ็คอินพุตลงในอาร์เรย์จากนั้นเพิ่มเข้าด้วยกันหารด้วย 2 และลบรายการที่จำเป็น:
[1,2,3,0]mZ=>(Ug0 +Ug1 +Ug2 +Ug3)/2-UgZ
ดีบันทึกไบต์! แต่เป็นไปได้ไหมที่จะลดขนาดอาเรย์ในตอนเริ่มต้น? ลองบรรจุลงในสตริงแล้วแยกกลับเข้าไปในอาเรย์ด้วยa
:
"1230"a mZ=>(Ug0 +Ug1 +Ug2 +Ug3)/2-UgZ
ดูนั่นบันทึกอีกหนึ่งไบต์ แต่มีวิธีที่ดีกว่า เราสามารถใช้ความจริงที่[1,2,3,0] ≡ [1,2,3,4] mod 4
:
1o5 mZ=>(Ug0 +Ug1 +Ug2 +Ug3)/2-UgZ%4
อีกสองไบต์! ตอนนี้เรากำลังจะไปที่ไหนสักแห่ง แต่นั่นUg0 +Ug1 +Ug2 +Ug3
เป็นพื้นที่กว้างมาก ถ้าเราลดอาร์เรย์ด้วยการบวก
1o5 mZ=>Ur(X,Y =>X+Y /2-UgZ%4
ว้าวนั่นช่วยได้จริงๆ! ตอนนี้เราลดเหลือ 29 ไบต์ และต้องขอบคุณ @ ןnɟuɐɯɹɐןoɯฉันยังสามารถเล่นกอล์ฟอีกหนึ่งไบต์จากการลด แต่ถ้าเราสามารถใช้บิวด์อินเพื่อรวมอาเรย์มันจะสั้นกว่า:
1o5 mZ=>Uu /2-UgZ%4
19 ไบต์! ! ที่น่าตื่นตาตื่นใจ น่าเสียดายที่ Japt ยังไม่มีบิวด์อินดังกล่าว ฉันจะเพิ่มสิ่งนี้ในเมื่อฉันมีโอกาส ข้อเสนอแนะยินดีต้อนรับสำหรับทั้งโปรแกรมหรือภาษา!
ในฐานะของ v1.4.4 ฉันได้ใช้คุณสมบัติเพิ่มเติมเล็กน้อยใน Japtor กว่าที่ฉันเคยวางแผนไว้ เริ่มต้นด้วยแผนดั้งเดิมสำหรับเวอร์ชันที่สั้นกว่า:
1o5 mZ=>Uu /2-UgZ%4
ครั้งแรกที่เราจำเป็นต้องเปลี่ยนแปลงบางสิ่ง: ฟังก์ชั่นจะถูกกำหนดด้วยและฟังก์ชั่นรวมเป็น{
x
รุ่นนี้ทำงานตามที่เป็นอยู่:
1o5 mZ{Ux /2-UgZ%4
ตอนนี้@
เป็นชวเลขXYZ{
ที่ช่วยให้เราประหยัดไบต์โดยเปลี่ยนจากการZ
X
นอกจากนี้ยัง£
เป็นทางลัดสำหรับm@
บันทึกไบต์อื่น:
1o5 £Ux /2-UgX%4
เมื่อเร็ว ๆ นี้ฉันได้ติดตั้งฟีเจอร์ที่U
มักจะเป็นจุดเริ่มต้นของโปรแกรม อย่างไรก็ตามเนื่องจากข้อผิดพลาดในการใช้งานสิ่งนี้ยังทำงานได้กับฟังก์ชัน
1o5 £x /2-UgX%4
ในที่สุดg
ตอนนี้ฟังก์ชั่นจะตัดถ้าดัชนีผ่านจุดสิ้นสุดของสตริงทำให้เราสามารถลบออกได้%4
ทั้งหมด13 ไบต์ :
1o5 £x /2-UgX
และฉันคิดว่า 19 คนน่าทึ่ง ;-) ทดสอบออนไลน์!