Tcl में गोल्फ के लिए टिप्स


15

Tcl में गोल्फिंग के लिए आपके पास क्या सामान्य सुझाव हैं? मैं उन विचारों की तलाश कर रहा हूं जो सामान्य रूप से गोल्फ की समस्याओं को कोड करने के लिए लागू किए जा सकते हैं जो कम से कम Tcl के लिए कुछ विशिष्ट हैं (उदाहरण के लिए "टिप्पणियां हटाएं" एक उत्तर नहीं है)। कृपया प्रति उत्तर एक टिप पोस्ट करें।

जवाबों:


7

lmapइसके बजाय उपयोग करें foreach। इसके लिए Tcl 8.6 की आवश्यकता होती है।

वाक्यविन्यास समान है, लेकिन lmapप्रत्येक लूप के परिणाम के साथ एक सूची देता है।


4

मेरे जवाब पर /codegolf//a/107557/29325 मैं प्रदर्शित कर सकता हूं:

  1. आमतौर पर set j 0;while \$j<$n;{...;incr j}समकक्ष से छोटा होता हैfor {set j 0} {$j<$n} {incr j} {...}

  2. जब लूपिंग चर 1 से शुरू होता है, हम वृद्धि को whileपरीक्षण की स्थिति के हिस्से के रूप में कर सकते हैं , set i 1अनावश्यक रूप से पहले लिखने से बचें : while {[incr i]<=$n} {...}इसके बजायset i 1;while \$i<=$n;{...;incr i}

ध्यान : एक ही कर सकता है 2. बाहरी पाश के मामले में! मैं इसे अपने jवैरिएबल पर लागू नहीं कर सका क्योंकि इसे अपने स्वयं के आंतरिक लूप के बाहर 1 में रीसेट करने की आवश्यकता है! और incr jमान को प्राप्त करेगा जो आंतरिक लूप के अंतिम चरण पर सेट किया गया था, इसके बजाय इसे मानने और बढ़ाने के लिए अपरिभाषित चर jको हथियाने के बजाय !01


4

कभी-कभी यह उपयोग करने के लायक है कि सामान्य या लूप के बजाय पुनरावृत्तियों की संख्या time {script} nकहां nहै । यद्यपि इसका उद्देश्य लूपिंग नहीं है, लेकिन प्राप्त प्रभाव समान है।whilefortime

मैंने इस दिशा का अनुसरण करते हुए अपने स्वयं के उत्तरों में हाल ही में परिवर्तन किए हैं।

अद्यतन: मैंने हाल ही में गिरने के लिए एक आसान खोज की है: आप एक forया whileएक timeब्लॉक से प्रतिस्थापित नहीं कर सकते , अगर इसमें एक breakया एक है continue


3

इंटरेक्टिव शेल का उपयोग करें। यह आपको कमांड नामों को संक्षिप्त करने की अनुमति देता है, जब तक कि केवल 1 कमांड शेष अक्षरों से शुरू होता है।

उदाहरण:

  • gets -> ge
  • lassign -> las
  • expr -> exp
  • puts -> pu

और इंटरैक्टिव समाधान नि: शुल्क हैं: पी

पृष्ठभूमि :

जब tclshएक टर्मिनल के साथ इनपुट डिवाइस के रूप में चलता है, तो यह चर tcl_interactiveको सेट करता है 1। यह unknownउस नाम से शुरू होने वाले आदेशों को खोजने के लिए (डिफ़ॉल्ट प्रक्रिया जिसे एक कमांड नहीं मिल सकता है) कहा जाएगा।

डाउनसाइड: यह हर लाइन के परिणाम को प्रिंट करेगा, ;न्यूलाइन के बजाय उपयोग करेगा ।
ओह, और यह बाहरी आदेशों की तरह आह्वान कर सकता है w, जो इसका एक अच्छा संक्षिप्त नाम है while


3

Subcommands और Options (आमतौर पर) संक्षिप्त किए जा सकते हैं। यह काफी कुछ बचा सकता है, लेकिन आपको परीक्षण करना चाहिए क्योंकि सब कुछ इस तरह से छोटा नहीं किया जा सकता है ( regsubउदाहरण के लिए विकल्प नहीं हो सकते हैं)।

फिर आप इसे namespaceकुछ सही बुरी चीजों को करने के जादू के साथ उपयोग कर सकते हैं। इस पर विचार करो:

namespace exp *;namespace en cr -c ?

उसके बाद, ?अब एक जादुई कमान है जो आपको किसी भी वैश्विक Tcl कमांड को संक्षिप्त करने की अनुमति देती है, और सभी के साथ खिलवाड़ करने की घोर अनिश्चितता के बिना unknown


2

मैं Tcl 8.0.5 का उपयोग कर रहा हूं, लेकिन मेरा मानना ​​है कि निम्नलिखित सभी हाल के संस्करणों के लिए लागू हैं।

  1. renameनाम बदलने के लिए उपयोग करें rename:

    rename rename &
    

    &किसी भी पहचानकर्ता हो सकता है; &बस सी में "संदर्भ" की याद दिलाता है

  2. नाम renameबदलने के लिए नाम बदलें set:

    & set =
    

    फिर, =कोई भी पहचानकर्ता हो सकता है; =मेरे लिए सिर्फ सहज है।

  3. अब, अन्य नाम बदलें जो नाम बदलने के लायक हैं, उदा

    & regsub R
    & string S
    & while W
    

    एक कमांड का नाम बदलने के लायक है अगर, उसकी लंबाई n , और घटनाओं k , k (n-1) - (n + 4)> 0 हैकश्मीर के लिए हल , सूत्र बन जाता है k > (n+4)/(n-1)। यहाँ एक संदर्भ तालिका है जो इसे आसान बनाती है:

    length of       minimum         example(s)
    command         occurrences
    ------------------------------------------------
    2               6               if (consider renaming to "?")
    3               4               for, set (consider renaming to "=")
    4               3               eval, expr, incr (consider renaming to "+"), info, join, proc, puts, scan
    5               3               break, catch, lsort, split, subst, trace, unset, while
    6               3               format, lindex, lrange, regexp, regsub, rename, return, string, switch
    7               2               foreach, lappend, linsert, llength, lsearch, unknown
    .               2               lreplace
    .               2               continue
    .               2               
    
  4. अगला, कॉम्पैक्ट अक्सर उपयोग किए जाने वाले उप-क्षेत्र जैसे

    = I index
    = L length
    

    तो आप इस तरह की चीजें कर सकते हैं

    S $I $x 7
    S $L $x
    
  5. कुछ स्पष्ट मिस्केलानिया:

    1. lappend सूची का पहला तत्व सेट कर सकते हैं यदि यह अभी तक मौजूद नहीं है (आरंभ करने की कोई आवश्यकता नहीं है)।
    2. आप का उपयोग किए बिना arrays सेट कर सकते हैं array, जैसे set doesNotExist(7) 43
    3. आप "a b c"इसके बजाय स्ट्रिंग्स ( ) का उपयोग कर सकते हैं [list a b c]
    4. आप इस तरह तार में प्रक्षेप कर सकते हैं foo${a}bar:।
    5. आप के two\ wordsबजाय उपयोग कर सकते हैं "two words"। (सामान्य रूप से याद रखें कि रिक्त स्थान के बिना सन्निहित तारों के लिए, दोहरे उद्धरण छोड़ दिए जा सकते हैं!)
    6. आप लगभग हमेशा एक चरित्र या दो को बचाने के लिए forएस के रूप में फिर से लिख सकते हैं while, क्योंकि अलग-अलग ब्लॉकों का उपयोग whileकरते हुए एक साथ जांच और वेतन वृद्धि कर सकते हैं for
  6. बड़े कार्यक्रमों के लिए, यहाँ एक चाल है जिसके बारे में मैंने सोचा था लेकिन अभी तक लागू नहीं किया गया है:

    proc unknown {c args} {eval [info commands $c*] $args}
    

    यह इंटरैक्टिव कमांड संक्षिप्ताक्षर का अनुकरण करता है! यह 54 वर्णों की लागत, लेकिन अब आप उपयोग कर सकते हैं jके लिए join, spके लिए split, stके लिए string, wके लिए while, और इतने पर।


1
यदि आप संवादात्मक संक्षिप्तिकरण का अनुकरण करना चाहते हैं, तो उपयोग करेंinfo script {};set tcl_interactive 1
जोहान्स कुह्न

धन्यवाद! मैंने आपको यहाँ श्रेय दिया है । उस तकनीक के साथ कुछ समस्याएँ थीं, हालाँकि, मेरा unknownमार्ग से सामना नहीं हुआ : यहाँ और यहाँ देखें
एंड्रयू चींग

प्रश्न उन युक्तियों के लिए पूछता है जो Tcl के लिए कुछ विशिष्ट हैं। सभी भाषाओं के सुझावों में टर्नरी ऑपरेटर शामिल है ।
पीटर टेलर

@PeterTaylor - धन्यवाद, मैंने वह टिप हटा दी है।
एंड्रयू चेयोंग

2

वैकल्पिक है

जैसा कि कहा जाता है कि यदि मैनुअल पेज , ब्लॉक निर्माणों elseपर निहित है if। तो क्या है

if ... {} else {}

बन सकता है

if ... {} {}

जैसा कि आप मेरे कुछ उत्तरों पर देख सकते हैं।


1

हो सकता है कि इसे किसी अन्य उत्तर पर एकीकृत किया जाना चाहिए, लेकिन यहां यह दिया गया है:

जब procकेवल एक पैरामीटर होता है तो इसे लिखा जा सकता है

proc p a {DO THINGS}

के बजाय

proc p {a} {DO THINGS}

procबैकस्लैश का उपयोग करके दो मापदंडों पर भी यही लागू होता है ; इसे लिखा जा सकता है

proc p a\ b {DO THINGS}

के बजाय

proc p {a b} {DO THINGS}

मापदंडों की एक उच्च संख्या के {}लिए छोटे कोड प्रस्तुत करना।


1

कभी-कभी यह setकेवल एक lappendबयान द्वारा दो बयानों को बदलने के लिए लायक है । जैसे निर्माण पर, कोई स्थानापन्न कर सकता है

set s ""

loop {
    # ...
    set s $s\X
}

द्वारा

loop {
    # ...
    append s X
}

appendआदेश एक है incrकी तरह व्यवहार है, जो एक नहीं अभी तक परिभाषित चर initializes।

नहीं गलती करने पर ध्यान दें appendद्वाराlappend


1

यदि आप किसी ऐसे ऑपरेशन के साथ एक सूची को संभाल रहे हैं जो प्रत्येक तत्व के बीच वाक्यविन्यास करता है, तो कभी-कभी आप joinइसे ट्रेस करने के बजाय एक विशिष्ट ऑपरेशन करने के लिए तत्व दे सकते हैं।

Https://codegolf.stackexchange.com/a/127042/29325 पर एक उदाहरण है:

puts \n[expr [join [split [read stdin]] +]]

यह read stdinदेता है 23 214 52तो विभाजन सूची देगा {23 214 52}के बाद, [join {23 214 52} +]स्ट्रिंग लौटाएगा 23+214+52अंत expr 23+214+52में योग का काम करता है


इस मामले में, आप इसे छोड़ सकते हैं split
जोहान्स कुह्न

@JohannesKuhn: धन्यवाद। किया हुआ।
नागर

1

आप बड़े कोड है, तो यह एक से अधिक प्रयोग से बचने के लिए संभव है exprका उपयोग करते हुए namespace pat tcl::mathopशुरुआत में। यह एक नियमित Tcl fonction के रूप में उपसर्ग-सिंटैक्स ऑपरेशन प्रदान करता है। उदाहरण के लिए:

namespace pat tcl::mathop
set sum [+ 1 2 3]
set prod [* {*}{1 2 3 4}]
puts $sum\ $prod

आधिकारिक मैथॉप डॉक पेज देखें


0

जब आपके पास कई चर होते हैं जो setबाद की लाइनों पर होते हैं तो आप एक का उपयोग कर सकते हैंlassignset ही प्रभाव को प्राप्त करने के लिए कई निर्देशों के बजाय ।

एक उदाहरण मेरा अपना जवाब है /codegolf//a/105789/29325

निर्णय लेने के लिए, किसी को केवल चर की संख्या (1 अक्षर चर मानकर, जैसा कि गोल्फ की उम्मीद है) को भारित करने की आवश्यकता है:

  • <5, set गोल्फ खिलाड़ी है

  • = 5, setऔरlassign एक ही बाइट गिनती उत्पन्न करते हैं

  • > 5, lassignगोल्फ खिलाड़ी है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.