एक असीमित काउंटरस्ट्रिंग बनाएं


11

एक काउंटरस्ट्रिंग कुछ प्रकार के आत्म-वर्णन परीक्षण डेटा है जो सॉफ्टवेयर परीक्षण में उपयोग किया जाता है। यह सुनिश्चित नहीं है कि यह वास्तव में जेम्स बाख द्वारा आविष्कार किया गया था , लेकिन मैं इसे वहां से जानता हूं।

विचार इस प्रकार है: परीक्षण डेटा में कई तारांकन ( *) होते हैं। तारांकन के सामने की संख्या आपको बताती है कि उस बिंदु पर परीक्षण डेटा कितने समय के लिए है। यदि आपको परीक्षण डेटा में एक स्थिति जानने की आवश्यकता है जो कि तारांकन नहीं है, तो अंतिम तारांकन ढूंढें, पहले संख्या को देखें और उसके बाद आने वाले अंकों की संख्या जोड़ें।

अनुक्रम इस तरह शुरू होता है:

2*4*6*8*11*14*17*20*23*
             ^

जैसा कि आप देख सकते हैं, चिह्नित तारांकन स्थिति 14 पर है।

यदि किसी फ़ाइल को निम्नानुसार छोटा किया जाता है

[...]2045*20

तब आप यह पा सकते हैं कि कहीं 2047 वर्णों की सीमा है (2045 जहां तारांकन 2 से अधिक है 2और 0)।

यह सबसे छोटा (यह ) प्रोग्राम है जो आउटपुट (std :: out या file या जो कुछ भी) है, उस प्रारूप का एक मनमाना लंबा परीक्षण स्ट्रिंग बनाना आपका कार्य है। अक्षरों में लंबाई तर्क के रूप में दी गई है। कार्यक्रम 2 जीबी परीक्षण डेटा (इनपुट मूल्य 2147483647 वर्ण) तक समर्थन करेगा।

2 जीबी फ़ाइल में "खतरनाक" स्थिति:

8*11*
98*102*
998*1003*
9998*10004*
99998*100005*
999995*1000003*
9999995*10000004*
99999995*100000005*
999999995*1000000006*

यदि 995 * 999 * और 995 * 1000 * या इसी तरह के बीच कोई निर्णय लेने का निर्णय है, तो @Leaky नन के प्रश्न का उत्तर देना चाहिए : नहीं।

इनपुट मूल्य 2147483647 के साथ 2 जीबी फ़ाइल का अंत है:

2147483640*2147483

अगर यह रुकता नहीं है तो आप इसे कैसे परखेंगे?
लीक नून

2
क्या पात्रों में यह लंबाई है?
बाइकिंग बाइक

4
आप को साबित कर सकते हैं कि हम के बीच चयन करने के लिए कभी नहीं होगा 995*999*और 995*1000*या कुछ भी है कि पसंद है?
लीक नून

1
भविष्य में, कृपया उन्हें पोस्ट करने से पहले अपनी चुनौतियों में किंक आउट करने के लिए सैंडबॉक्स का उपयोग करें।
मेगो

1
@ThomasWeller यदि हम एक लंबा आउटपुट बना सकते हैं, तो क्या हम कोई इनपुट नहीं ले सकते हैं और सिर्फ 2GB स्ट्रिंग का उत्पादन कर सकते हैं?
xnor

जवाबों:


4

हास्केल, 60 58 बाइट्स

एक समारोह के रूप में हमें मिलता है:

f=length.show
iterate(\n->1+n+(f$n+1+f n))2>>=(++"*").show

पूर्ण कार्यक्रम, 72 70 बाइट्स

यह STDOUT के लिए एक अनंत काउंटरस्ट्रिंग को आउटपुट करता है:

f=length.show
main=putStr$iterate(\n->1+n+(f$n+1+f n))2>>=(++"*").show

लंबाई इनपुट करने के लिए 20 अतिरिक्त बाइट्स की आवश्यकता होती है:

main=interact(\j->take(read j)$iterate(\n->1+n+(f$n+1+f n))2>>=(++"*").show)

यह आपके लगभग आपके RAM आकार तक काम करता है, क्योंकि हास्केल संख्यात्मक अभिन्न प्रकार से चूक करता है Integer



2

पायथन 2, 74 72 66 64 61 बाइट्स

f=lambda n,i=2:"%d*"%i+f(n,len(`i+2`)-~i)[:n-2]if i<n*2else""

एक पूर्णांक n ले जाता है और लंबाई n का एक मानक सेट करता है।

कार्यक्रम संस्करण, 69 बाइट्स:

s,n,i="",input(),2
while i<2*n:s+="%d*"%i;i+=len(`i+2`)+1
print s[:n]

स्टड से एक पूर्णांक n लेता है और लंबाई n का एक काउंटरस्ट्रिंग प्रिंट करता है।

छोटा, लेकिन केवल लगभग काम कर रहा है, वैकल्पिक संस्करण:

n,i=input(),2
while i<2*n:print("%d*"%i)[:n-i],;i+=len(str(i+2))+1

1

PowerShell v5, 97 बाइट्स

param($n)$l=1;for($i=0;$i-lt$n){$i+="$i*".length;if("$i".Length-gt$l){$i++;$l++};ac .\o "$i*" -n}

कमांड-लाइन तर्क के रूप में इनपुट लेता है $n, सहायक सेट करता है $lजिसका उपयोग हम अपने पूर्णांक लंबाई का ट्रैक रखने के लिए करते हैं। फिर, हम 0ऊपर से लूप करते हैं $n। प्रत्येक पुनरावृत्ति, हम एक तारांकन से निर्मित स्ट्रिंग $iद्वारा वृद्धि करते .lengthहैं $i। तो फिर, अगर .lengthकी $iबदल (उदाहरण के लिए, हम 2 अंकों से 3 अंक के लिए ले जाया), हम दोनों सहायक बढ़ाने के $length चर और $i(अतिरिक्त अंकों के लिए खाते में)। हम तब वर्तमान निर्देशिका में oNewLine के साथ फाइल add-contentकरने के लिए कमांड का उपयोग करते हैं ।"$i*".\o-n

एनबी

  • V5 की आवश्यकता है, क्योंकि उस संस्करण में -noNewLineपैरामीटर आखिरकार जोड़ा गया था ।
  • PowerShell स्वचालित रूप से अप-कन्वर्ट [int]कर देगा [double](नहीं, मुझे नहीं पता कि यह क्यों नहीं जाता है [long]), इसलिए यह 2147483648समस्या के बिना इनपुट को ठीक से और अधिक से अधिक तक हैंडल करेगा । सैद्धांतिक रूप से, यह शिकायत करने से पहले इनपुट को लगभग 1.79769313486232E+308(अधिकतम मूल्य [double]) तक संभाल लेगा , लेकिन मुझे उम्मीद है कि डिस्क को ऐसा होने से पहले भरना होगा। ;-)
  • लूप सशर्त जाँच के कारण, यह फ़ाइल की इनपुट लंबाई के न्यूनतम पर आउटपुट करेगा । उदाहरण के लिए, इनपुट के लिए 10यह आउटपुट होगा 2*4*6*8*11*, चूंकि इनपुट की तुलना में 11पहला $iमूल्य है।

PowerShell v2 +, 97 बाइट्स (गैर-प्रतिस्पर्धात्मक)

param($n)$l=1;-join(&{for($i=0;$i-lt$n){$i+="$i*".length;if("$i".Length-gt$l){$i++;$l++};"$i*"}})

किसी फ़ाइल को भेजने के बजाय, यह लूप पुनरावृत्तियों को एन्क्रिप्ट करता है और फिर -joinउन्हें एक स्ट्रिंग में एक साथ जोड़ देता है। यह v5 की तुलना में पहले संस्करणों के लिए काम करने की अनुमति देता है। हालाँकि, [string]जैसे .NET एक कंस्ट्रक्टर के साथ परिभाषित करता है String(char c,Int32 length), यह संस्करण अधिकतम इनपुट आवश्यकता को पूरा नहीं करता है , क्योंकि आउटपुट स्ट्रिंग ओवरफ्लो और बारफ हो जाएगा।

इसके अलावा, आप अपनी पाइपलाइन में एक ~ 2GB का तार नहीं लगाना चाहते। मैं तो बस कह रहा हूं'।


1.79769313486232E + 308 निश्चित रूप से काम नहीं करेगा, क्योंकि एक फ्लोट में छोटी संख्या जोड़ने से मूल्य में कोई बदलाव नहीं होगा। देखें stackoverflow.com/questions/12596695/… तो मेरा अनुमान है कि यह एक बार काम करना बंद कर देता है क्योंकि इसे "अपग्रेड" करने के लिए डबल
थॉमस वेलर

@ThomasWeller PowerShell [double]s 64-बिट है। उदाहरण के लिए, रन for($i=2147483645;$i-lt2147483655;$i++){"$i - " + $i.GetType()}की एक सतत प्रगति दिखाएगा $iलेकिन Typeमें परिवर्तन 2147483648करने के लिए double। मुझे यकीन है कि कुछ बिंदु पर यह काम करना बंद कर देगा, संभावना है कि सटीकता के ~ 15 अंकों के आसपास या जब .ToStringउपयोग शुरू होता है e[double]::MaxValueएक गंभीर ऊपरी सीमा की तुलना में एक throwaway मजाक का अधिक था।
AdmBorkBork

1

पायथन 3, 126 114 99 बाइट्स

def f(x,s=''):
 i=t=2
 while len(s)<x:i+=len(str(t+i))-len(str(t));s+=str(t)+'*';t+=i
 print(s[:x])

एक फ़ंक्शन जो वर्ण गणना के तर्क के माध्यम से इनपुट लेता है जिस पर स्ट्रिंग को छोटा करना है, और STDOUT को प्रिंट करता है।

यह काम किस प्रकार करता है

स्ट्रिंग में संख्याओं के बीच का अंतर शुरू में है 2. हर बार जब परिमाण का एक आदेश पारित किया जाता है, तो यह अंतर 1 से बढ़ जाता है; यह वर्तमान संख्या के अंकों की संख्या और वर्तमान संख्या के अंकों के अंतर के बीच अंतर को प्राप्त करके प्राप्त किया जा सकता है, जो आवश्यक होने पर केवल 1 है। फ़ंक्शन केवल लूप करता है, जबकि स्ट्रिंग की लंबाई इनपुट से कम होती है, स्ट्रिंग में संलग्न होती है और आवश्यकतानुसार अंतर और संख्या को अपडेट करती है, और फिर छपाई से पहले ट्रंकट हो जाती है।

Ideone पर इसे आज़माएं

अनंत आउटपुट संस्करण, 69 बाइट्स

s=i=2
while 1:i+=len(str(s+i))-len(str(s));print(end=str(s)+'*');s+=i

1

आर, 92 बाइट्स

    N=nchar;f=function(n){z=0;y="";while(z<n){z=z+N(z+N(z)+1)+1;y=paste0(y,z,"*")};strtrim(y,n)}

उदाहरण आउटपुट:

f (103) [1] "2 * 4 * 6 * 8 * 11 * 14 * 17 * 20 * 23 * 26 * 29 * 32 * 35 * 38 * 41 * 44 * 44 * 47 * 50 * 53 * 56 * 59 * 62 * 65 * 68 * 71 * 74 * 77 * 80 * 83 * 86 * 89 * 92 * 95 * 98 * 102 * 1 "


0

जेली , 22 19 18 बाइट्स

2µṾL+®‘¹©=¡=µ³#j”*

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

nस्ट्रिंग में पहले नंबर का पता लगाएं, फिर तारांकन के साथ सूची में शामिल हों। यह हमेशा nओपी द्वारा टिप्पणियों में अनुमति दी गई तुलना में अधिक लंबी होगी ।

कार्यक्रम चुनिंदा क्रम में #लूप में अनुक्रम में वर्तमान संख्या के साथ रजिस्टर को अपडेट करता है ¹©=¡। मुझे उम्मीद थी कि यह छोटा हो सकता है, डालकर©µ उदाहरण के लिए दूसरे के बाद , लेकिन दुर्भाग्य से यह काम नहीं करता है और मैं किसी भी चीज का पता नहीं लगा सकता।

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