गणितज्ञ, 173 169 155 बाइट्स
f=0>1;t=!f;c=Characters;u=ToUpperCase;StringJoin/@MapThread[#@#2&,{Reverse[{LetterQ@#,#==(u@#)}&/@c@#/.{{f,_}->(#&),{t,t}->u,{t,f}->ToLowerCase}&/@#],c/@#},2]&
यह दो तारों की एक सरणी लेने वाला एक फ़ंक्शन है, उदाहरण के लिए {"Foo","bAR"}
और दो तारों की एक सरणी आउटपुट। यह संयुक्त राष्ट्र के स्थानिक संपीड़ित योजना को फिर से लिखने, f@x
के रूप में f[x]
, जहाँ भी यह प्रतीत होता है अंकन कोड (विस्तार हो रहा f=0>1
उर्फ False
, t=!f
उर्फ True
, c=Characters
और u=ToUpperCaseQ
), और अन-जगह साथ UpperCaseQ [#] #==u@#
(इस चरित्र अपने uppercased संस्करण के बराबर होती है), यह है:
StringJoin /@ MapThread[#[#2] &, {
Reverse[
{ LetterQ[#], UpperCaseQ[#] } & /@ Characters[#] /.
{ {False, _} -> (# &), {True, True} -> ToUpperCase,
{True, False} -> ToLowerCase } & /@ #
],
Characters /@ #
}, 2] &
Interfacing: अनुगामी &
यह एक कार्य करता है। इसके तर्क को "#" के रूप में डाला जाता है /@ #
। उदाहरण के लिए f=0>1; ... & [{"AAAbbb111", "Cc2Dd3Ee4"}]
आउटपुट का उत्पादन करता है {AaABbb111,CC2dd3Ee4}
।
प्रसंस्करण: सामान्य रूप से बाहर क्रम में बताया:
- का आउटपुट
MapThread[...]
वर्णों की दो सूचियों की एक सूची है। StringJoin इन दो सूचियों में से प्रत्येक पर लागू होता है दो तार की एक सूची का उत्पादन करने के लिए, आउटपुट।
MapThread[#[#2]&, ... , 2]
दो 2-दर-n तत्व सूचियों के एक सरणी पर कार्य करता है। पहली सूची फ़ंक्शंस का 2-बाय-एन सरणी है। दूसरी सूची वर्णों की 2-दर-n सरणी है, Characters /@ #
दो इनपुट स्ट्रिंग्स में वर्णों की सूची। यह गहराई 2 पर कार्य करता है, अर्थात्, कार्यों और व्यक्तिगत पात्रों पर।
Reverse[...]
फ़ंक्शंस के दो सब्लिस्ट्स को स्वैप करता है ताकि MapThread दूसरे स्ट्रिंग के फ़ंक्शंस को पहले स्ट्रिंग पर लागू करे और इसके विपरीत।
{ ... } &
एक अनाम फ़ंक्शन है जो दो इनपुट स्ट्रिंग्स में से प्रत्येक पर लागू होता है।
{LetterQ[#], UpperCaseQ[#]} & /@ Characters[#]
एक स्ट्रिंग को वर्णों की सूची में विभाजित करता है, फिर प्रत्येक चरित्र को दो तत्व सूचियों से बदल देता है। इन दो तत्व सूचियों में, पहला तत्व है True
यदि चरित्र एक अक्षर है और False
अन्यथा, इसी तरह, दूसरा तत्व इंगित करता है कि चरित्र ऊपरी मामला है या नहीं। UpperCaseQ[]
यदि यह एक पत्र प्राप्त नहीं करता है तो सही नहीं लौट सकता।
/. {{False, _} -> (# &), {True, True} -> ToUpperCase, {True, False} -> ToLowerCase}
इन दो तत्व सूचियों को कार्यों के साथ बदल देता है। ( किसी भी मिलान का प्रयास करने से पहले संक्षिप्तीकरण का विस्तार t
और f
घटित होता है।) यदि दो तत्व सूची False
में इसका पहला तत्व है, तो इसे फ़ंक्शन (# &)
, पहचान फ़ंक्शन से बदल दिया जाता है । (कोष्ठक आवश्यक हैं, अन्यथा तीर एम्परसेंड की तुलना में अधिक कसकर बांधता है।) अन्यथा दो तत्व सूची के साथ शुरू होता है True
, चरित्र एक पत्र था, और हम फ़ंक्शन ToUpperCase
और ToLowerCase
इसके मामले के अनुरूप आउटपुट करते हैं । (इस अंतिम के लिए जाँच करना False
अनावश्यक है, वास्तव में {_,_}->ToLowerCase
काम करेगा, ऐसी किसी भी चीज़ को पकड़ना जो अभी तक प्रतिस्थापित नहीं की गई थी, लेकिन यह कोई छोटी और अधिक अस्पष्ट नहीं होगी।)
एकमात्र चुनौती यह थी कि कार्यों के दो आयामी सरणी को तर्कों की एक सरणी के रूप में ज़िप करने के लिए एक शानदार तरीका है।
संपादित करें: "मददगार" कट / पेस्ट लाइनब्रेक बैकस्लैश, 1>0
और 1<0
संक्षिप्तीकरण को पकड़ने के लिए @ मर्टिन ब्यूटनर को धन्यवाद , और बाइट्स में लंबाई गिनने के लिए मार्गदर्शन के लिए भी पात्र नहीं (जो भी हैं :-))
Edit2: आगे @Martin Büttner का धन्यवाद कि वैश्विक नाम स्थान को प्रदूषित करने के लिए स्वीकार्य गोल्फ है, मुझे एक वर्ण फ़ंक्शन एप्लिकेशन की याद दिलाता है, और एक के लिए एक संक्षिप्त नाम के साथ दो अपरकेस कार्यों को बदलने और दूसरे का अनुकरण करने के लिए एक का उपयोग करके बचत करने का सुझाव देता है चार अक्षर)। (मुझे लगता है कि उसने पहले भी ऐसा किया है। :-))