चेतावनी : पाठ की दीवार। यह बहुत सारी छोटी-छोटी तरकीबें हैं जिन्हें मैंने समय के साथ इकट्ठा किया।
अनाम ब्लॉक के रूप में अपने समाधान लिखें
यह पहले से ही उल्लेख किया गया था, लेकिन मैं इसे दोहराना चाहूंगा। TIO में, आप my $f =
हेडर, ब्लॉक को उचित कोड में लिख सकते हैं और पाद को a से शुरू कर सकते हैं ;
। ऐसा लगता है कि काम पूरा करने के लिए यह सबसे छोटा तरीका है (क्योंकि आपको किसी इनपुट को पढ़ने की परवाह करने की आवश्यकता नहीं है, यह आपको तर्क में दिया गया है)।
एक और अच्छा तरीका उपयोग कर रहा है -n
या -p
स्विच, लेकिन मैं इसे TIO में काम करने के लिए एक तरह से नहीं मिला।
तर्क पास करने के लिए कोलोन सिंटैक्स का उपयोग करें
इसके बजाय, है thing.method(foo,bar)
, आप कर सकते हैं thing.method:foo,bar
और 1 चरित्र को बचा सकते हैं । दुर्भाग्य से, आप स्पष्ट कारणों के लिए परिणाम पर दूसरी विधि नहीं कह सकते हैं, इसलिए यह केवल ब्लॉक में अंतिम विधि के लिए उपयोग करने के लिए समझ में आता है।
उपयोग $_
जितना हो सके उतना
कभी-कभी इसकी वजह से कई अलग-अलग तर्कों की तुलना में एकल सूची तर्क लेना बेहतर होता है। एक्सेस करते समय $_
, आप केवल डॉट के साथ शुरू करके इस पर तरीके कह सकते हैं: उदा.sort
इसके बराबर है $_.sort
।
हालांकि, यह ध्यान रखें कि प्रत्येक ब्लॉक अपने स्वयं के हो जाता है $_
, इसलिए बाहरी ब्लॉक के पैरामीटर आंतरिक लोगों में नहीं फैलेंगे। यदि आप एक आंतरिक ब्लॉक से मुख्य समारोह के मापदंडों का उपयोग करने की जरूरत है, ...
का प्रयोग करें ^
चर यदि आप उपयोग नहीं कर सकते$_
^
इस तरह के बीच में, सतर्क और चर नाम डालें $^a
:। ये केवल एक ब्लॉक के अंदर काम करते हैं। संकलक पहले गिना करता है कि आपके पास ब्लॉक में इनमें से कितने हैं, उन्हें शाब्दिक रूप से क्रमबद्ध करें, और फिर पहले तर्क को पहले एक, दूसरे को दूसरे और इसी तरह से असाइन करें। ^
केवल चर की पहली घटना में उपयोग किए जाने की आवश्यकता है। तो {$^a - $^b}
2 स्केलर लेता है और उन्हें घटाता है। केवल एक चीज जो मायने रखती है वह है वर्णमाला क्रम, इसलिए {-$^b + $^a}
वही काम करता है।
यदि आपको कभी भी नुकीले ब्लॉक सिंटैक्स (जैसे ->$a,$b {$a.map:{$_+$b}}
) का उपयोग करने का मन करता है , तो आप उस ब्लॉक के शुरू में फर्जी स्टेटमेंट लिखना बेहतर समझते हैं , जिसका उपयोग ^
आप प्रत्येक मुख्य ब्लॉक (जैसे {$^b;$^a.map:{$_+$b}}
) में नहीं करने जा रहे हैं (नोट) गोल्फ के लिए यह बेहतर तरीका है{$^a.map(*+$^b)}
। मैं सिर्फ इस अवधारणा को दिखाना चाहता था।]
ऑपरेटर बहुत शक्तिशाली होते हैं और अक्सर वे काम करने का सबसे छोटा तरीका होते हैं। विशेष रूप से मेटा ऑपरेटरों (ऑपरेटरों कि एक तर्क के रूप ऑपरेटरों लेने के लिए) []
, [\]
, X
, <<
/ >>
और Z
आपका ध्यान के लायक हैं। मत भूलो कि एक मेटा-ऑप एक तर्क के रूप में एक और मेटा-ऑप ले सकता है (जैसे कि XZ%%
मैं यहां उपयोग करने में कामयाब रहा )। आप >>
एक विधि कॉल के लिए भी उपयोग कर सकते हैं , जो नक्शे की तुलना में बहुत सस्ता हो सकता है ( @list>>.method
बजाय @list.map(*.method)
, लेकिन सावधान रहें, वे समान नहीं हैं! )। और, अंत में, इससे पहले कि आप एक बाइनरी का उपयोग करें << >>
, ध्यान रखें कि Z
अक्सर बहुत कम पात्रों में एक ही काम करेंगे।
यदि आप एक-दूसरे पर बहुत सारे मेटा-ऑप्स छिपाते हैं, तो आप वर्ग कोष्ठक का उपयोग करके पूर्वता निर्दिष्ट कर सकते हैं []
। जब आप इतने सारे संचालकों को ढेर कर देंगे तो यह आपको बचाएगा। (यह बहुत बार नहीं होता है।)
अंत में, आप, बूल, इंट या Str के लिए मजबूर चीजों की जरूरत है तरीकों का उपयोग नहीं करते .Bool
, .Int
और .Str
, बल्कि ऑपरेटरों ?
, +
और ~
। या इससे भी बेहतर, उन्हें इंट और इतने पर मजबूर करने के लिए उन्हें एक अंकगणितीय अभिव्यक्ति में डाल दें। किसी सूची की लंबाई पाने का सबसे छोटा तरीका है +@list
। यदि आप किसी सूची की लंबाई की शक्ति की 2 गणना करना चाहते हैं, तो बस कहें 2**@list
और यह द राइट थिंग करेगा।
मुक्त राज्य चर का उपयोग करें $
, @
और%
प्रत्येक ब्लॉक में, $
(या @
या %
) की प्रत्येक घटना एक चमकदार नई स्केलर (या सरणी, या हैश) राज्य चर को संदर्भित करती है (एक चर जिसका मूल्य ब्लॉक में कॉल पर रहता है)। यदि आपको एक स्टेट वैरिएबल की आवश्यकता है जिसे केवल स्रोत कोड में एक बार संदर्भित करने की आवश्यकता है , तो ये तीन आपके बड़े दोस्त हैं। (सबसे अधिक बार $
।) उदाहरण के लिए, रिवर्स मैथ साइकल चुनौती में, इसका इस्तेमाल ऑपरेटरों को एक सरणी से चक्रीय रूप से चुनने के लिए किया जा सकता है, जिसे अनुक्रमित किया गया था $++%6
।
map
, grep
एट अल के उप रूपों का उपयोग करें ।
इसका मतलब है कि: बल्कि कर map {my block},list
से list.map({my block})
। यहां तक कि अगर आप उपयोग करने का प्रबंधन करते हैं list.map:{my block}
, तो ये दोनों दृष्टिकोण समान संख्या में बाइट्स पर निकलते हैं। और अक्सर, आपको विधि को कॉल करते समय सूची को छोटा करना होगा, लेकिन उप को कॉल करते समय नहीं। इसलिए उप दृष्टिकोण हमेशा बेहतर होता है या कम से कम विधि एक के समान होता है।
यहाँ एकमात्र अपवाद तब है जब वह वस्तु जो map
पेड, grep
पेड वगैरह होनी है , अंदर है $_
। फिर .map:{}
स्पष्ट रूप से धड़कता है map {},$_
।
उपयोग जंक्शनों ( &
और |
) के बजाय &&
और ||
।
जाहिर है, वे 1 बाइट कम हैं। दूसरी ओर, उन्हें एक बूलियन संदर्भ में मजबूर होकर ढह जाना चाहिए। यह हमेशा एक के साथ किया जा सकता है ?
। यहां आपको एक मेटा-ऑप के बारे में पता होना चाहिए !
op
जो बूल संदर्भ को मजबूर करता है, op
परिणाम का उपयोग करता है और नकारात्मक करता है ।
यदि आपके पास एक सूची है और आप इसे एक जंक्शन में बदलना चाहते हैं, तो उपयोग न करें [&]
और [|]
। इसके बजाय का उपयोग करें .any
और .all
। ऐसा भी है .none
जो जंक्शन ऑप्स द्वारा इतनी आसानी से नकल नहीं किया जा सकता है।
say (3² + 4², 2²⁰, 5⁻²)
=>>(25 1048576 0.04)
। यूनिकोड की पूरी सूची आप इस तरह से दुरुपयोग कर सकते हैं: docs.perl6.org/language/unicode_texas ।