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


18

डीसी में गोल्फिंग के लिए आपके पास क्या सामान्य सुझाव हैं ?

dc UNIX / Linux के लिए एक कैलकुलेटर उपयोगिता है जो C भाषा से पहले है। मैं अपने डीसी कार्यक्रमों (गणना?) को छोटा बनाने में दिलचस्पी रखता हूं। मैं उन विचारों की तलाश कर रहा हूं जो सामान्य लागू हो सकते हैं जो कम से कम dc के लिए थोड़े विशिष्ट हैं (उदाहरण के लिए टिप्पणियां हटाना एक उपयोगी उत्तर नहीं है)।

कृपया प्रति उत्तर एक टिप पोस्ट करें।


7
इसके बजाय मार्वल का उपयोग करें।
मैजिक ऑक्टोपस Urn

जवाबों:


6

अगर-तो-और बयान

मान लें कि हम स्थिति की जांच करना चाहते हैं a==b(चलो aऔर bक्रमशः उनके नाम वाले रजिस्टरों में संग्रहीत किया जाए)।

संपादित करें:
[         # Everything is wrapped in one big macro
  [         # An inner macro for our *then* part
              # <-- Stuff to execute if a==b here
  2Q          # Then quit the inner and outer macro
]sE       # `E' is for Execution register ;)
la lb =E  # if a==b, execute E
          # if E is executed, it will quit the whole macro, so the rest is never reached:
          # <-- Stuff to execute if a!=b here
]x        # End macro; Execute

आज्ञा (foo)देना एक प्लेसहोल्डर, संघनक के उद्देश्य के लिए:

[[(then)2Q]sE(condition)E(else)]x

यकीन है कि यह सबसे कॉम्पैक्ट है अगर बयान संभव है ( यहां भी चित्रित किया गया है )।


1
शायद [[thenaction]P][[elseaction]P][r]sI 2 4 =I x sI fएक शुरुआत है? तेहन और अन्य के लिए क्रियाएँ ढेर पर हैं, " Iएफ" मैक्रो उन्हें स्वैप करता है और सशर्त रूप से शांत किया जाता है। तब स्टैक के शीर्ष को निष्पादित किया जाएगा और स्टैक को साफ करने के लिए अप्रयुक्त मैक्रो को I में गिरा दिया जाएगा। 2 4तुलना करने के लिए सिर्फ उदाहरण डेटा हैं। वैकल्पिक रूप से [x]sIभाग को तुलना में स्थानांतरित किया जा सकता है, यदि अधिक पठनीय माना जाता है [[thenaction]P][[elseaction]P] 4 4 [r]sI =I x sI f:। fउदाहरण में सिर्फ दिखाऊंगा जैसे ढेर बाद में साफ है ...

1
डीसीए के बारे में रोसेटा कोड के पेज में 3 फ्लेवर का उल्लेख है dcऔर यह 1 पेज था जहां मैंने ओपनबीएसडी dcका if-then-elseनिर्माण देखा । मुझे लगता है कि हम dcसभी प्रमुख ऑपरेटिंग सिस्टम के लिए सभी 3 स्वादों के साथ एक प्रशंसक बंडल की आवश्यकता है ... ओ :-) ... और मेरे if-then-elseप्रस्ताव ऊपर मूल पर काम नहीं करते हैं dcक्योंकि इसमें rकमांड का अभाव है ...:

1
किस बारे में: [[(if)2Q]si(condition)i(else)]x- एक मैक्रो में पूरी चीज़ को लपेटना, और एक और मैक्रो के अंदर-इफ़ेक्ट को उसके अंदर, ताकि आप 2Qदूसरे हिस्से में पहुंचने से पहले पूरी चीज़ से अपना रास्ता निकाल सकें । इसलिए यदि आप करना चाहते हैं यदि 1 == 1 तो 1 और प्रिंट 2 प्रिंट करें , यह होगा 1[[1P2Q]si1=i2P]x(अनुपलब्ध है क्योंकि मेरे पास अभी और अभी डीसी तक पहुंच नहीं है। यह भी निश्चित था कि मैंने पहले भी यहां एक उत्तर में यह चाल चली थी। लेकिन यह नहीं मिल सका)
daniero

हाँ, मैंने गणित किया, मेरा सुझाव छोटा है। एक ही उदाहरण और "नोटेशन" के साथ, और व्हॉट्सएप को हटाने के लिए यह [/*else*/]sE[[/*then*/]sE]sIlalb=IlExबनाम [[/*then*/2Q]sIlalb=I/*else*/]x- 6 बाइट्स अंतर है। अभी भी अप्रयुक्त

1
अच्छा काम, @daniero! जब मेरे पास समय होगा, मैं पोस्ट अपडेट करूंगा या आप चाहें तो इसे कर सकते हैं।
जो

5

आप के साथ इनपुट बचा सकते हैं d

उपयोग करके d, जो ToS (स्टैक के ऊपर) को डुप्लिकेट करता है, आप इनपुट को बाद में उपयोग करने के लिए रास्ते से हटा सकते हैं, जबकि अभी भी इसका उपयोग करने में सक्षम हैं।


@NoOneIsHere ओह कूल !!! धन्यवाद!
19

5

Arrays

हालाँकि वे शुरुआती लोगों के लिए सिरदर्द हैं, लेकिन dcसरणियाँ प्रदान करता है। वे इस तरह काम करते हैं:

value index :a    # store `value' in array linked to top of stack `a', with index `index'
      index ;a    # push a[index] on (main) stack

हमेशा की तरह, पहले तत्व में अनुक्रमणिका है 0. सीरीज़ अनुक्रमों के साथ काम करते समय उपयोगी हो सकती है, जैसे कि एसयूडीएसआई अनुक्रम में , विशेष रूप से काउंटरों के साथ संयोजन में। यदि आप अपने वातावरण को नष्ट किए बिना किसी विशेष तत्व का चयन करना चाहते हैं तो ऐरे आपको संख्या-फेरबदल की मात्रा (और काउंटरों और तुलनाओं की संख्या) को कम कर सकते हैं। उदाहरण के लिए, यदि आप संख्याओं के एक स्टैकफुल को एक सरणी में ले जाना चाहते हैं, तो आप एक पुनरावर्ती फ़ंक्शन लिख सकते हैं जो z(स्टैक डेप्थ) का उपयोग करता है या z 1-इंडेक्स के रूप में, तत्व को संग्रहीत करता है, और जाँचता है कि क्या z == 0समाप्त करना है।

[z 1- :a z 0 !=F]dsFx    # or I could just write such a function for you :)

निम्नलिखित से अवगत रहें:

  • Arrays नाम ढेर पर उदाहरणों के साथ जुड़े हुए हैं। यदि आप एक स्टैक पर एक नया मान धक्का देते हैं, जिसमें इसके साथ एक सरणी जुड़ी होती है, तो वह सरणी "वापस पुश" भी हो जाएगी, और एक "नया" सरणी उसकी जगह ले लेगा। पुरानी सरणी तब तक उपयोग करने योग्य नहीं होगी जब तक कि नामित स्टैक पर संबंधित मूल्य भी प्रयोग करने योग्य नहीं होता (यानी, इसके ढेर के ऊपर)। यह एक जटिल अवधारणा है जिसे बेहतर एनीमेशन के साथ बेहतर तरीके से समझाया जाएगा, जो मेरे से परे है।
  • आप वास्तव में नामांकित रजिस्टर में एक मूल्य धक्का के बिना एक नामित सरणी में सामान स्टोर कर सकते हैं। हालाँकि, यदि आप ऐसा करते हैं, तो आप शेष सत्र के लिए उस नाम के साथ स्टैक / रजिस्टर का उपयोग नहीं कर सकते हैंdcदुर्घटना होगी।
  • यदि आप किसी नामित स्टैक का मान पॉप करते हैं, तो संबंधित सरणी में कोई भी मान खो जाएगा - कोई चेतावनी, कोई सुरक्षा उपाय, कुछ भी नहीं। बस चला गया (जो उपयोगी भी हो सकता है)।

डीसी सुझावों के साथ अच्छा काम!
R

dcहाल ही में अद्यतन किया गया है, और दुर्घटनाग्रस्त होने के संबंध में सरणी व्यवहार थोड़ा बदल गया हो सकता है। अभी पुष्टि नहीं कर सकता, लेकिन मुझे लगता है कि पिछली बार जब मैंने लिनक्स पर इसका इस्तेमाल किया था तो कुछ अलग था।
जो

1
यदि आप किसी ऐसे सरणी से एक इंडेक्स पढ़ने की कोशिश करते हैं जो सेट नहीं किया गया है, तो आपको 0 मिलता है और एक त्रुटि नहीं है। जो बहुत उपयोगी हो सकता है, लेकिन यह भी ध्यान रखने योग्य है कि यदि आप संभावित रूप से 0s को सरणियों में डाल रहे हैं ... तो आपको यह परीक्षण करने के लिए एक और तरीके की आवश्यकता होगी कि सूचकांक को छुआ गया है।
ब्रफल

5

सशर्त / मैक्रोज़ के बजाय 0 से nth शक्ति

कभी-कभी आपको टर्नीरी कंडिशन जैसी किसी चीज की जरूरत पड़ सकती है :

A == B ? C : D;

इसे संभालने का एक अच्छा तरीका @ जो के उत्तर में वर्णित है । हालांकि हम बेहतर कर सकते हैं:

0AB-^E*C+

जहाँ E D - C है।

यह दो मूल्यों के अंतर की शक्ति को बढ़ाकर समानता के लिए परीक्षण करता है। यह 1 में परिणाम अगर बराबर और 0 अन्यथा। बाकी सिर्फ 1 या 0 को मान C या D. के साथ जोड़ते हैं। यह काम करता है क्योंकि n = 1 के लिए dc0 0 = 1 और 0 n = 0 देता है।


4

कभी-कभी स्टैक से एक संख्या को त्यागना आवश्यक है। इसका एक तरीका यह है कि इसे केवल एक अप्रयुक्त चर में पॉप किया जाए, अर्थात st। हालाँकि, कुछ स्थितियों में, आप इसे कुछ अन्य स्थानों पर पॉप कर सकते हैं, उदाहरण के लिए इनपुट बेस जब आपके पास अधिक संख्यात्मक इनपुट नहीं है या सटीक स्पेसियर के लिए यदि आपके पास ऐसा करने के लिए कोई और ऑपरेशन नहीं है, तो सटीक अंतर होगा। पूर्व मामले में, का उपयोग करें i। बाद के मामले में, का उपयोग करें k


यदि संख्यात्मक आउटपुट महत्वपूर्ण नहीं है, तो oइसका उपयोग भी किया जा सकता है। और अगर इनमें से कोई भी चीज महत्वहीन है, तो उन्हें भंडारण के साथ-साथ क्रमशः त्यागने के लिए उपयोग किया जा सकता है - I/ K/ Oउन्हें क्रमशः याद करते हैं, और बाइट्स को बचाता है sa/ laआदि मान्य मान AFAIK: i2-16; kकिसी भी गैर-पूर्णांक पूर्णांक; o1 से अधिक किसी भी पूर्णांक
ब्रम्हल

4

लंबाई गणना: Z, X, औरz

ZTOS को पॉप करता है और यदि यह एक स्ट्रिंग है तो संख्या या वर्ण (संख्या) को धक्का देता है यदि यह एक संख्या या वर्णों की संख्या है। यह परिणाम की लंबाई (बफ़रिंग आउटपुट के लिए) या कंप्यूटिंग स्ट्रिंग लंबाई का पता लगाने के लिए उपयोगी हो सकता है। ध्यान दें कि संख्याओं के लिए,Z पूर्णांक भाग और अंश भाग की संयुक्त लंबाई को धक्का देता है।

XTOS को पॉप करता है और संख्या के अंश भाग में अंकों की संख्या को धक्का देता है। यदि TOS एक स्ट्रिंग था, 0तो धकेल दिया जाता है।

संख्या के पूर्णांक भाग में अंकों की संख्या ज्ञात करने के लिए, कोई भी उपयोग कर सकता है dZrX-। यदि आपने डिफ़ॉल्ट से परिशुद्धता को नहीं बदला है k==0, तो उपयोग 1/Zकरना कम है, लेकिन मान लीजिए कि आपको ऑपरेशन के बाद एक विशेष गैर-शून्य परिशुद्धता बनाए रखने की आवश्यकता है:Kr0k1/Zrk बल्कि एक आंखों की रोशनी है।

zस्टैक पर वस्तुओं की संख्या को बढ़ाता है। मेरे पसंदीदा आदेशों में से एक, यह वास्तव में किसी भी मूल्य को पॉप नहीं करता है! इसका उपयोग संख्याओं के अनुक्रम को उत्पन्न करने या काउंटर बढ़ाने के लिए किया जा सकता है। zdबार-बार (मैक्रो की शुरुआत में कहते हैं) का उपयोग करके , आरोही क्रम में प्रत्येक प्राकृतिक या पूरी संख्या पर एक गणना का परीक्षण कर सकते हैं ।


zइससे पहले और इसके लिए उपयोग किया है , लेकिन एक काउंटर के हैक के रूप में इसका इस्तेमाल करने के लिए मेरे साथ कभी नहीं हुआ ... बहुत बढ़िया ...
brhfl

4

अंकों Aका Fउपयोग 10 से 15. की संख्या के लिए प्रतिस्थापन में किया जा सकता है। हालांकि उन्हें अभी भी प्रभावी रूप से आधार 10 अंकों के रूप में माना जाना चाहिए (इनपुट बेस 10 है) जब विभिन्न स्थानों में। दूसरे शब्दों में, इनपुट बेस 10 के साथ FF255 का प्रतिनिधित्व नहीं होगा, यह प्रतिनिधित्व करेगा(15 * 10) + 15 या 165।

वास्तव में यह किसी भी इनपुट बेस से सभी अंकों के 0लिए काम करता है । तो अगर इनपुट बेस 5 है, तो होगा , या 94 होगा।F21626E(2 * 5^2) + (6 * 5) + 14

ध्यान दें कि यह व्यवहार अनमॉडिफाइड GNU स्रोतों के लिए प्रभावी है। हालाँकि, जैसा कि @SophiaLechner बताते हैं, RedHat- आधारित डिस्ट्रो bc-1.06-dc_ibase.patch का उपयोग करते हुए दिखाई देते हैं, जो इस व्यवहार को बदलता है इसलिए अंक = = ibase को ibase - 1उनके वास्तविक मूल्य की परवाह किए बिना माना जाता है । ध्यान दें TIO के dc पास bc-1.06-dc_ibase.patch (भले ही इसका फेडोरा 28 ツ_ (¯) _ /।) नहीं है।


यह बिलकुल सही नहीं है - यद्यपि इनपुट बेस के ऊपर एकल अंकों की व्याख्या की जाती है जैसा कि आप उम्मीद करेंगे, यदि शाब्दिक में कई अंक हैं, या एक दशमलव बिंदु भी है, तो आधार के लिए अमान्य अंकों को आधार (बेस -1) के रूप में व्याख्या किया जाता है। तो इनपुट बेस 10 में FFप्रतिनिधित्व करता है 99, इनपुट बेस 5 26Eमें 244आधार 10 के समान है 74
सोफिया लेचनर

@SophiaLechner क्या आप सुनिश्चित हैं? tio.run/##S0n@/9/QIJ/L0CCTy82tgMs0k8vIzLXg/38A आप कौन सा dcसंस्करण चला रहे हैं? मैं ubuntu पर GNU dc 1.4.1 और MacOS पर GNU dc 1.3 का उपयोग कर रहा हूँ
डिजिटल ट्रॉमा

दिलचस्प। मैं Red Hat पर 1.3.95 चला रहा हूँ, और यहाँ आपका नमूना कार्यक्रम है: [slechner @ XXX] $ dc -e '10o 10i FFp 5i 26Ep' 99 74 [slechner @ XXX] $ dc --vc dc (GNU bc 1.06) .95) 1.3.95
सोफिया लेचनर

Argh ... टिप्पणी में कोड ब्लॉक कार्य नहीं कर सकता। मुद्दा यह है कि है FFpआउटपुट 991.3.95 में। क्या आप इसे अपने MacOS संस्करण में जांच सकते हैं, तब?
सोफिया लेचनर

1
ज़रूर! सभी शोध के लिए धन्यवाद।
सोफिया लेचनर

2

किसी फ़ंक्शन मैक्रो को प्रारंभ करते समय (हम उपयोग करेंगे F) जिसे आप तुरंत चलाना चाहते हैं, dsFxइसके बजाय कुछ का उपयोग करें sFlFx। वैरिएबल के लिए भी यही काम करता है: dsaबजाय sala

यदि आपको भंडारण और लोडिंग (जैसे sa[other stuff]la) के बीच अन्य सामान करने की आवश्यकता है , तब भी विचार करें कि क्या ऊपर व्यवहार्य है: यदि आप अन्य ऑपरेशन से पहले स्टैक पर एक मूल्य छोड़ते हैं, तो क्या यह अंत तक शीर्ष पर वापस आ जाएगा उन कार्यों के?


2

बस इसे दुर्घटना से पता चला। शून्य उत्पन्न करने का एक और तरीका _:।

_डीसी के लिए एक संकेत है कि निम्नलिखित अंक एक नकारात्मक संख्या है। उदाहरण:

_3 # pushes -3

लेकिन क्या होगा अगर हम एक नंबर के साथ इसका पालन नहीं करते हैं?

_ # pushes 0...sometimes

यह तब काम करता है जब अंडरस्कोर के बाद अगला गैर-रिक्त चरित्र कोई अंक नहीं होता है। यदि कोई अंक इसका अनुसरण करता है, तो एक नई पंक्ति के बाद भी, इसे एक नकारात्मक संकेत के रूप में समझा जाता है।

c4 5_6  # -6,5,4
c4 5_ 6 # -6,5,4
c4 5_
6       # -6,5,4 # still a negative sign since the next thing it sees is a digit
c4 5_z  #  3,0,5,4 # if it's followed by a non-digit, it's a 0
c4 5_p6 #  6,0,5,4
c4 _*   #  0 # 4*0=0

1

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


1

dcएक समय में एक लाइन इनपुट पढ़ता है। यदि आपको कई मदों में पढ़ने की आवश्यकता है, तो इसे एक-प्रति पंक्ति में करने के लिए या तो ?प्रत्येक पंक्ति को पढ़ने के लिए या बोझिल मैक्रो लूप की आवश्यकता होती है। इसके बजाय, यदि सभी इनपुट आइटमों को एक स्थान-पृथक लाइन पर रखा जा सकता है, तो एक एकल ?सभी इनपुट आइटम को पढ़ेगा, प्रत्येक को स्टैक पर धकेल देगा।

उदाहरण के लिए seq 10 | dc -e'?f', seqपूर्णांक 1-10 आउटपुट, प्रति पंक्ति एक। ?बस पहले पढ़ा जाएगा 1जो उत्पादन होगा जब fपूरे ढेर उदासीनता। हालाँकि seq 10 | tr '\n' ' ' | dc -e'?f', trइनपुट पूर्णांक को अलग करता है , जिससे सभी स्पेस अलग हो जाते हैं। इस स्थिति में, ?सभी पूर्णांक एक पंक्ति में पंक्ति से पढ़ेंगे, और fउन सभी को आउटपुट करेंगे।


1

यदि कोई ऑपरेटर स्रोत से प्रतिबंधित है, तो उसके साथ एक नया बनाएं a

कुछ समय जो मेरे लिए काम आया है, वह है कि ऑपरेटर के ASCII मान को धकेल कर, aउसे स्ट्रिंग में बदलने के लिए, और sबाद में मैक्रो के रूप में निष्पादित होने वाले रजिस्टर में इसे थकाऊ करके एक विशिष्ट ऑपरेटर का उपयोग करने से बचें। पर। उदाहरण के लिए, मुझे विभाजन करने की आवश्यकता है, लेकिन या तो चरित्रहीन है या चरित्र का उपयोग करने से बचने की कोशिश कर रहा हूं /। मैं कर सकता हूं, इसके बजाय 47asdऔर फिर भविष्य में जब मुझे 16 को 4 से विभाजित करने की आवश्यकता होगी 16 4 ldx

  • यह केवल एकल-वर्ण ऑपरेटरों के लिए काम करेगा (एक स्ट्रिंग का निर्माण नहीं कर सकता है), और आदेशों के लिए काम नहीं करेगा जैसे sकि कुछ से पोस्टफिक्स करने की आवश्यकता है।
  • यह काफी कुछ बाइट्स जोड़ता है, और इसलिए केवल तभी उपयुक्त होता है जब विशिष्ट चरित्र से बचना आवश्यक होता है या किसी तरह स्कोर बोनस प्राप्त होता है।

1

व्हाट्सएप से परहेज

व्हॉट्सएप से बचना काफी कुछ चुनौतियों में आता है, और आम तौर पर आसान है dc। तार के अलावा, एक बहुत विशिष्ट समय जो व्हॉट्सएप आवश्यक हो जाता है, जब एक पंक्ति में कई संख्याओं को धक्का दिया जाता है 1 2 3:। यदि इसे टाला जाना चाहिए:

  • बीच में एक खाली मैक्रो निष्पादित करें: 1[]x2[]x3[]x :।
  • यदि कोष्ठक तालिका से बाहर हैं, तो समय से पहले एक मैक्रो का एनओपी स्टोर करें: 35asnऔर इसे बीच में निष्पादित करें 1lnx2lnx3lnx:।

यदि आप dc: ',' (054) unimplementedचेतावनियों के साथ आने को तैयार हैं, तो आप अलग-अलग नंबरों पर भी कॉमा कर सकते हैं ।
डिजिटल ट्रॉमा

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