टेप उपाय स्ट्रिंग


15

प्रेरणा : कभी-कभी आपको यह जानना होगा कि आप एक स्ट्रिंग में कहां हैं। आप किसी स्ट्रिंग के किसी भी हिस्से को देखने में सक्षम होना चाहते हैं और यह जानना चाहते हैं कि आप जहां तक ​​संभव हो, कहां हैं।

चुनौती : किसी दिए गए लम्बाई के टेप माप स्ट्रिंग को आउटपुट करने के लिए एक प्रोग्राम लिखें । एक टेप माप स्ट्रिंग स्वयं अपनी लंबाई का वर्णन करता है-अब तक जितनी बार संभव हो उतनी लंबाई के साथ।

नियम :

  1. टेप माप स्ट्रिंग की कुल लंबाई के लिए आपके प्रोग्राम को एक सकारात्मक पूर्णांक पैरामीटर लेना चाहिए
  2. आउटपुट में अंकों के प्रत्येक सन्निहित तार के लिए, इन अंकों को सटीक रूप से अब तक के आउटपुट की लंबाई को रिपोर्ट करना होगा - समावेशी !
    1. लंबाई को स्ट्रिंग की शुरुआत से प्रत्येक संख्या के अंत तक मापा जाता है
  3. स्ट्रिंग में जितनी संभव हो उतनी लंबाई की संख्या शामिल की जानी चाहिए
  4. अस्पष्टता से बचें। विभाजक / सीमांकक का उपयोग संख्याओं के बहिष्कृत होने से बचने के लिए किया जा सकता है, अर्थात 12बारह एक नहीं, दो कहते हैं।
  5. स्ट्रिंग को हमेशा अपने अंत की कुल लंबाई की रिपोर्ट करनी चाहिए, जिसमें कोई पीछे न जाने वाले विभाजक हों
  6. लंबाई को सही रखने के लिए आपको कई विभाजकों की आवश्यकता हो सकती है, उदाहरण के लिए यहां एक उदाहरण टेप माप स्ट्रिंग की लंबाई 4 है: 1--4

गैर निर्धारित / संपूर्ण उदाहरण:

  • टेप माप स्ट्रिंग की लंबाई 1: 1
  • टेप माप स्ट्रिंग की लंबाई 2: -2
  • टेप माप स्ट्रिंग की लंबाई 3: 1-3
  • लंबाई 4 के टेप माप स्ट्रिंग: 1--4या -2-4(दोनों रिपोर्ट लंबाई जितनी बार संभव हो, यानी दो बार, और सही कुल लंबाई के साथ समाप्त होती है)
  • टेप माप स्ट्रिंग लंबाई 10: 1-3-5-7-10
  • लंबाई 11 के टेप उपाय स्ट्रिंग: 1-3-5-7--11या 1-3-5--8-11या 1-3--6-8-11या 1--4-6-8-11या -2-4-6-8-11(सभी संभव के रूप में कई लंबाई नंबर, और कुल स्ट्रिंग की लंबाई के साथ खत्म के रूप में है)

इसलिए स्ट्रिंग में प्रत्येक अंक दूसरे अंक के निकट नहीं है, स्ट्रिंग पूरी तरह से डैश से बना है -, और आपको स्ट्रिंग में संभवतः जितनी लंबाई हो सकती है उतनी लंबाई के निशान होने चाहिए?
R

क्या हम 0 आधारित अनुक्रमण का उपयोग कर सकते हैं?
R

@EasterlyIrk नियम 3 जितनी संख्या में संभव हो उतने स्ट्रिंग में फिट होना चाहिए।
पोस्ट रॉक गार्फ हंटर


@EasterlyIrk आपके पास सभी डैश नहीं हो सकते क्योंकि यह प्रेरणा को पूरा करने में विफल रहता है और नियम 3 और 5 को तोड़ता है। कोई अनुक्रमण नहीं है। बस लंबाई है। तो नहीं, एक टेप माप स्ट्रिंग की लंबाई एक, नहीं हो सकती 0
टॉम विनर

जवाबों:


12

पायथन, 50 48 47 46 बाइट्स

f=lambda x:x*"1"if x<2else f(x-len(`-x`))+`-x`

व्याख्या

बहुत सरल पुनरावर्ती लंबोदर समाधान

हमारा आधार मामलों 1 और 0 है जिसके द्वारा कवर कर रहे हैं कर रहे हैं "1"*xअन्यथा हम की स्ट्रिंग पाने -xके साथ `-x`और पर समारोह बुला का परिणाम पहले जोड़ें len(`-x`)कम।


1
क्या आप बाइट्स को स्ट्रिंग करके बचा सकते हैं -x?
मार्टिन एंडर

@MartinEnder ओके मुझे यह काम करने के लिए मिला है। पारितोषिक के लिए धन्यवाद! मुझे लगता है कि पहले नहीं देख के लिए गूंगा की तरह लग रहा है।
पोस्ट रॉक गार्फ हंटर

5

गणितज्ञ, 67 57 बाइट्स

10 बाइट्स की जेटिंग के लिए मार्टिन एंडर को धन्यवाद!

""["1"][[#]]/._@__:>#0[#-1-IntegerLength@#]<>ToString@-#&

एक nonnegative पूर्णांक तर्क ले रहा है और एक स्ट्रिंग लौट रहा है। बहुत अधिक स्पष्ट पुनरावर्ती एल्गोरिथ्म: सुनिश्चित करें कि स्ट्रिंग इनपुट संख्या के साथ समाप्त होती है "-", और फिर फ़ंक्शन का उपयोग करके फिर से कॉल करें #0

लेकिन एल्गोरिथम को लागू करने में गोल्फ का मज़ा है। अभिव्यक्ति ""["1"][[#]]के #वें तर्क को दर्शाता है ""["1"]: 0 तर्क सिर है ""और 1 तर्क दृष्टिगत रूप से है "1", जो पुनरावृत्ति के आधार मामलों को प्रदान करता है। यदि #1 से अधिक है, तो ""["1"][[#]]एक त्रुटि संदेश फेंकता है और एक अनवैल्युएटेड फ़ंक्शन के रूप में रहता है। लेकिन फिर /._@__:>एक नियम है जो किसी भी अनवैल्युएटेड फ़ंक्शन को लेता है और इसे अगले आने वाले एक्सप्रेशन में बदल देता है, जो कि मूल फ़ंक्शन के लिए पुनरावर्ती कॉल है।

मूल प्रस्तुत:

If[#<2,""["1"][[#]],#0[#-1-IntegerLength@#]<>"-"<>IntegerString@#]&

2
""["1"][[#]]/._@__:>#0[#-1-IntegerLength@#]<>ToString@-#&से बचने के लिए Ifऔर बाइट्स का एक गुच्छा से बचने के द्वारा एक बाइट बचाता है IntegerStringऔर "-"<>
मार्टिन एंडर

1
omg, _@__बुराई जादू है
ग्रेग मार्टिन

3

जावास्क्रिप्ट (ईएस 6), 49 बाइट्स

f=(n,s='',t=''+-n)=>n>1?f(n-t.length,t+s):n?n+s:s
<input type=number oninput=o.value=f(this.value)><br><textarea id=o></textarea>


1
मुझे लगता है कि आपको परिभाषित करने की आवश्यकता हैf
टॉम विनर

@TomViner मैं हमेशा ऐसा कर रहा हूं। (कम से कम मेरे पास सही बाइट गिनती थी।)
नील

2

पायथ, 23 बाइट्स

L?<b2*"1"b+y-bl+""_bs_b

व्हीट विजार्ड के उत्तर से पुनरावर्ती समाधान को स्पष्ट रूप से चुरा लिया । इसके अलावा, मेरा मानना ​​है कि यह ठीक से गोल्फ नहीं है।

यहाँ यह कोशिश करो!


1

पर्ल 6 , 43 बाइट्स

{[R~](-$_,{$_+.comb}...^*>-1).&{S/^\-1/1/}}

स्पष्टीकरण:

{                                         }  # A lambda.
                    ...                      # Generate a sequence...
      -$_                                    #   starting from the negated lambda argument,
         ,{        }                         #   continuing iteratively using the formula:
           $_+.comb                          #     Last element plus length of last element.
                        *>-1                 #   until we hit 0 or higher,
                       ^                         end-point not inclusive.
 [R~](                      )                # Reverse and concatenate the number sequence.
                             .&{         }   # Apply to this the transformation:
                                S/^\-1/1/    #   Remove the sign from a leading "-1".

इसलिए इनपुट 10 के लिए उदाहरण के लिए, यह अनुक्रम उत्पन्न करता है (-10, -7, -5, -3, -1), और उस स्ट्रिंग से -1-3-5-7-10, और उस अंतिम स्ट्रिंग से 1-3-5-7-10

इसे ऑनलाइन आज़माएं

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