Japt, 29 28 byte
Japt là phiên bản rút gọn của Ja vaScri pt . Thông dịch viên
1o5 mZ=>$eval$(Uq'+)/2-UgZ%4
Lưu ý rằng các chức năng mũi tên yêu cầu trình duyệt tương thích ES6, chẳng hạn như các phiên bản Firefox mới hơn. Đầu vào đi vào như một mảng 4 mục, ví dụ [1,-1,4,2]
.
Làm thế nào nó hoạt động
// 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
Làm thế nào nó được chơi golf
Lần đầu tiên tôi thử đơn giản là sao chép cách tiếp cận Python của @ Mego. Điều này để lại cho tôi con quái vật 48 byte này:
(Lưu ý: hiện tại đầu vào không nên được bọc trong một mảng.)
[U-V+W+X /2,(U+V-W+X /2,(U+V+W-X /2,(V+W+X-U /2]
Vì mỗi mục này cần được chia cho 2, nên ngắn hơn để ánh xạ toàn bộ mảng với mY=>Y/2
:
[U-V+W+X,U+V-W+X,U+V+W-X,V+W+X-U]mY=>Y/2
Giờ thì sao? Chà, mảng bây giờ chỉ đơn giản là thêm ba trong số các đầu vào và trừ đi thứ tư, theo mẫu 1,2,3,0
. Vì vậy, chúng ta có thể đóng gói các đầu vào thành một mảng, sau đó cộng chúng lại với nhau, chia cho 2 và trừ đi mục cần thiết:
[1,2,3,0]mZ=>(Ug0 +Ug1 +Ug2 +Ug3)/2-UgZ
Đẹp, tiết kiệm một byte! Nhưng có thể thu nhỏ mảng lúc đầu không? Hãy thử đóng gói thành một chuỗi, sau đó chia lại thành một mảng với a
:
"1230"a mZ=>(Ug0 +Ug1 +Ug2 +Ug3)/2-UgZ
Nhìn vào đó, một byte khác được lưu. Nhưng có một cách thậm chí tốt hơn? Chà, chúng ta có thể sử dụng thực tế rằng [1,2,3,0] ≡ [1,2,3,4] mod 4
:
1o5 mZ=>(Ug0 +Ug1 +Ug2 +Ug3)/2-UgZ%4
Hai byte nữa! Bây giờ chúng ta sẽ đi đâu đó. Nhưng đó Ug0 +Ug1 +Ug2 +Ug3
là rất nhiều không gian. Điều gì xảy ra nếu chúng ta giảm mảng với phép cộng?
1o5 mZ=>Ur(X,Y =>X+Y /2-UgZ%4
Wow, điều đó thực sự có ích! Bây giờ chúng tôi xuống còn 29 byte. Và nhờ có @ nɟuɐɯɹɐ oɯ, tôi thậm chí còn có thể giảm được một byte khác. Nhưng nếu chúng ta có thể sử dụng một tích hợp để tổng hợp mảng, thì nó sẽ ngắn hơn:
1o5 mZ=>Uu /2-UgZ%4
19 byte! Kinh ngạc! Thật không may, Japt chưa có bất kỳ tích hợp nào như vậy. Tôi sẽ thêm cái này vào khi tôi có cơ hội. Đề xuất được chào đón, cho chương trình hoặc ngôn ngữ!
Chà, kể từ v1.4.4, tôi đã triển khai khá nhiều tính năng vào Japt so với dự định ban đầu. Bắt đầu với kế hoạch ban đầu cho phiên bản ngắn hơn:
1o5 mZ=>Uu /2-UgZ%4
Đầu tiên chúng ta cần thay đổi một vài điều: Hàm được định nghĩa {
và hàm sum là x
. Phiên bản này hoạt động như hiện trạng:
1o5 mZ{Ux /2-UgZ%4
Bây giờ, @
là một tốc ký XYZ{
, cho phép chúng ta lưu một byte bằng cách chuyển từ Z
sang X
. Ngoài ra, £
là một phím tắt cho m@
, lưu một byte khác:
1o5 £Ux /2-UgX%4
Gần đây tôi đã triển khai một tính năng mà U
ở đầu chương trình thường có thể bị bỏ qua. Do một lỗi thực thi, tuy nhiên, điều này cũng hoạt động với các chức năng:
1o5 £x /2-UgX%4
Cuối cùng, g
hàm bây giờ sẽ kết thúc nếu chỉ mục vượt quá cuối chuỗi, cho phép chúng ta loại bỏ %4
tổng cộng 13 byte :
1o5 £x /2-UgX
Và tôi nghĩ 19 thật tuyệt vời ;-) Kiểm tra trực tuyến!