पॉवरशेल , 66 62 बाइट्स
-join("$args"-split'\b'|%{(,$(,$_[0]*$n+$_))[!!($n=$($_-1))]})
इसे ऑनलाइन आज़माएं!
टूट - फूट
क्या झंझट है!
$args
आरईएल स्ट्रिंग से युक्त एक एकल तत्व सरणी है, जिससे शुरू करते हुए , मैं इसे कोट करके एक वास्तविक स्ट्रिंग में मजबूर कर रहा हूं।
फिर इसे शब्द सीमा ( \b
रेगेक्स में) से विभाजित करें । इससे मुझे एक तार मिलेगा, जहां प्रत्येक तत्व एक संख्या या बीएफ टोकन है जो संख्या के बाद आते हैं। तो उदाहरण में, यह विभाजन सरणी के पहले 4 तत्व हैं 10
, +]>+>
, 3
, +>
(सभी स्ट्रिंग हैं)।
अगला, मैं प्रत्येक तत्व से निपटने के लिए ForEach-Object
( %
) में पाइप करता हूं ।
मध्य एक प्रसिद्ध पॉवरशेल गोल्फवाद है, जिसमें एक मोड़ है; यह अनिवार्य रूप से एक DIY टर्नरी ऑपरेटर है, जिसमें आप एक 2 तत्व ऐरे बनाते हैं, फिर उस बूलियन एक्सप्रेशन का उपयोग करके, जिसे आप परीक्षण करना चाहते हैं, जिसमें इंडेक्स एक गलत परिणाम आपको तत्व 0 देता है और एक सही परिणाम आपको तत्व 1 देता है।
इस मामले में, मैं वास्तव में यूरी कॉमा ,
ऑपरेटर के साथ एक एकल तत्व सरणी बनाता हूं , क्योंकि मैं सच्चे मामले में आउटपुट नहीं चाहता हूं।
पहले आइए इंडेक्सर को देखें, भले ही इसे बाद में निष्पादित किया जाए।
इसका विचार यह है कि $_
(वर्तमान तत्व) या तो एक वैध संख्या हो सकती है, या कुछ अन्य स्ट्रिंग। यदि यह एक संख्या है, तो मैं $n
उस संख्या का मान 1 होना चाहता हूं 1 (संख्या के रूप में, स्ट्रिंग नहीं)। यदि यह नहीं है, तो मैं $n
झूठे-वाई बनना चाहता हूं ।
PowerShell आमतौर पर दाएं-हाथ के मूल्य को बाईं ओर के प्रकार के लिए जोर देने की कोशिश करता है, लेकिन यह ऑपरेशन पर निर्भर कर सकता है। इसके अलावा, "10"+5
आपको एक नया स्ट्रिंग देगा "105"
, जबकि 10+"5"
आपको पूर्णांक ( 15
) देगा।
लेकिन स्ट्रिंग्स को घटाया नहीं जा सकता है इसलिए इसके बजाय पावरशेल, न्यूट्रल मूल्य को स्वचालित रूप से घटाव के बाईं ओर एक स्ट्रिंग के साथ अनुमान लगा सकता है, इसलिए "10"-5
देता है 5
।
एसओ, मैं शुरू करता हूं $_-1
, जो मुझे वह नंबर देगा जो मैं चाहता हूं कि $_
वास्तव में एक नंबर है, लेकिन जब यह नहीं है तो मुझे कुछ भी नहीं मिलेगा। सतह पर, "कुछ भी नहीं" गलत है, लेकिन समस्या यह है कि उस असाइनमेंट का निष्पादन बंद हो जाता है, इसलिए $n
इसका पिछला मूल्य बरकरार रहेगा; मुझे नहीं चाहिए!
अगर मैं इसे एक सबडिप्रेशन में लपेटता हूं, तो जब यह विफल हो जाता है, तो मुझे अपना गलत मूल्य मिल जाता है $($_-1)
:।
यह सब सौंपा गया है $n
और चूंकि असाइनमेंट स्वयं को कोष्ठक में लिपटे हुए हैं, इसलिए जो मूल्य सौंपा गया था, $n
वह पाइपलाइन से भी होकर गुजरता है।
चूंकि मैं इसे अनुक्रमणिका में उपयोग कर रहा हूं, और मैं चाहता हूं कि 1
यदि रूपांतरण सफल हुआ, तो मैं इस मूल्य को बूलियन में बदलने के लिए दो बूलियन- not
अभिव्यक्तियों !!
का उपयोग करता हूं । एक सफल संख्या रूपांतरण सत्य के रूप में समाप्त होता है, जबकि फाल्सी नॉटनेस हमें वह मीठा, मीठा 0
देता है जो उस नकली टर्नरी सरणी में एकमात्र तत्व को वापस करने की अनुमति देता है।
उस सरणी पर वापस जाना, तत्व यह है: $("$($_[0])"*$n*$_)
$(,$_[0]*$n+$_)
"$($_[0])"
- यह वर्तमान तत्व का पहला चरित्र प्राप्त करने का एक कष्टप्रद लंबा रास्ता है (चलो कहते हैं, से हो रहा +
है +[>+
), लेकिन एक स्ट्रिंग के रूप में और एक [char]
वस्तु के रूप में नहीं । मुझे इसकी एक स्ट्रिंग की आवश्यकता है क्योंकि मैं इसे डुप्लिकेट करने के लिए एक स्ट्रिंग को संख्या से गुणा कर सकता हूं, लेकिन मैं एक चरित्र के साथ ऐसा नहीं कर सकता।
वास्तव में मैं [char]
एक स्ट्रिंग के बजाय (एक और unary अल्पविराम का उपयोग करके ,
) एक सरणी का उपयोग करके 4 वर्णों को बचाने में कामयाब रहा , इसलिए मैं उद्धरण और अतिरिक्त उप-अभिव्यक्ति को निकालने में सक्षम था। मैं इसके तत्वों को डुप्लिकेट करने के लिए एक सरणी को गुणा कर सकता हूं । और चूंकि इस पुनरावृत्ति का पूरा परिणाम किसी भी तरह से एक सरणी के रूप में समाप्त होता है और इसे -join
संपादित करने की आवश्यकता होती है , यहाँ एक सरणी का उपयोग करने से कोई अतिरिक्त लागत नहीं आती है।
फिर, मैं उस स्ट्रिंग सरणी को गुणा करके $n
, इसे $n
बार डुप्लिकेट करने के लिए । याद है कि $n
हो सकता है $null
या यह पूर्ववर्ती अंकों का मान शून्य हो सकता है।
फिर +$_
उस तत्व के डुप्लिकेट पहले वर्ण के अंत में वर्तमान तत्व जोड़ता है। इसलिए $n
माइनस एक है।
इस तरह, 9 के बराबर 10+[>+
समाप्त होता है $n
, फिर हम 9 बनाते हैं +
और +[>+
आवश्यक 10 प्राप्त करने के लिए उस स्ट्रिंग को वापस जोड़ते हैं , साथ ही सवारी के लिए अन्य एकल तत्व।
तत्व एक सब-डेक्सप्रेशन में लिपटे हुए है $()
क्योंकि जब $n
होता है $null
, तो संपूर्ण अभिव्यक्ति विफल हो जाती है, इसलिए सरणी बनाना विफल हो जाता है, इसलिए अनुक्रमणिका कभी नहीं चलती है, इसलिए $n
कभी भी असाइन नहीं किया जाता है।
कारण मैं इस त्रिगुट चाल का इस्तेमाल किया अपनी विशेषताओं में से एक की वजह से है: एक असली त्रिगुट ऑपरेटर के विपरीत, भाव है कि तत्वों को परिभाषित करते हैं उस बात के लिए मूल्यांकन करने के लिए किया जाए या नहीं वे "चयनित" कर रहे हैं, और पहले।
चूंकि मुझे $n
अलग-अलग पुनरावृत्तियों पर असाइन करने और फिर उपयोग करने की आवश्यकता है , इसलिए यह सहायक है। टर्नेरी ऐरे एलिमेंट वैल्यू का मूल्यांकन पिछले पुनरावृत्ति $n
मूल्य के साथ किया जाता है , फिर इंडेकर $n
वर्तमान पुनरावृत्ति के लिए पुन: असाइन करता है ।
तो ForEach-Object
छोरों को अपना सब कुछ आउटपुट करना होता है (त्रुटियों का एक समूह जिसे हम अनदेखा करते हैं), लेकिन नए तार की एक सरणी के रूप में।
इसलिए यह पूरी चीज कोष्ठक में लिपटी है और फिर -join
आउटपुट स्ट्रिंग देने के लिए यूनरी द्वारा पूर्ववर्ती है ।