जप, 29 28 बाइट्स
Japt , Ja vaScri pt का छोटा संस्करण है । दुभाषिया
1o5 mZ=>$eval$(Uq'+)/2-UgZ%4
ध्यान दें कि एरो फ़ंक्शंस में ES6- अनुरूप ब्राउज़र की आवश्यकता होती है, जैसे फ़ायरफ़ॉक्स के नए संस्करण। इनपुट 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
यह कैसे गोल्फ था
मैंने पहली बार @ 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ɐɯɹɐ to o I के लिए धन्यवाद, मैं भी कमी को दूर करने के लिए एक और बाइट करने में सक्षम था। लेकिन अगर हम सरणी का योग करने के लिए बिल्ट-इन का उपयोग कर सकते हैं, तो यह छोटा होगा:
1o5 mZ=>Uu /2-UgZ%4
19 बाइट्स! गजब का! दुर्भाग्य से, जाप में अभी तक कोई ऐसा बिल्ट-इन नहीं है। मौका मिलने पर मैं इसे जोड़ूंगा। सुझावों का स्वागत है, या तो कार्यक्रम या भाषा के लिए!
अच्छी तरह से, v1.4.4 के रूप में, मैंने जितने मूल रूप से योजना बनाई थी, उसके मुकाबले जाप में कुछ और विशेषताएं लागू की हैं। छोटे संस्करण के लिए मूल योजना के साथ शुरू:
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 अद्भुत था ;-) यह ऑनलाइन परीक्षण!