विस्तार टैब (लागू करें विस्तार (1))


10

इस समय आपका कार्य POSIX expand(1)उपयोगिता का एक प्रकार लागू करना है जो टैब को रिक्त स्थान तक विस्तारित करता है।

आपका प्रोग्राम एक टैबस्टॉप विनिर्देशन लेना है और फिर अगले टैबस्टॉप तक पहुंचने के लिए उचित मात्रा में रिक्त स्थान के साथ इनपुट में मानक पर इनपुट टैब को बदलें और टैब वर्णों को बदलें। परिणाम को मानक से बाहर लिखा जाना चाहिए ।

टैबस्टॉप विनिर्देशन

एक tabstop विनिर्देश या तो एक नंबर, या tabstops की एक अल्पविराम द्वारा पृथक सूची के होते हैं। एकल संख्या के मामले में, इसे दोहराया जाता है जैसे कि इसका गुणक अल्पविराम से अलग की गई सूची में होता है (जैसे कि 4कार्य करता है 4,8,12,16,20,...)। अल्पविराम से अलग की गई सूची में प्रत्येक प्रविष्टि एक सकारात्मक रूप से पूर्णांक होती है, जो कि पहले से एक उपसर्ग होती है +। एक +उपसर्ग अल्पविराम से अलग सूची में पिछले मूल्य के लिए एक रिश्तेदार अंतर को दर्शाता है। सूची में पहला मान पूर्ण होना चाहिए (अर्थात उपसर्ग)। टैबस्टॉप अगले गैर-अंतरिक्ष वर्ण (विस्तारित टैब के बाद) के कॉलम को निर्दिष्ट करता है, नंबर 0. टैब के रूप में लिया गया सबसे बाएं स्तंभ हमेशा कम से कम एक स्थान तक विस्तारित होना चाहिए।

इनपुट आउटपुट

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

सभी विस्तारित टैबस्टॉप और सभी इनपुट को अधिकतम 80 कॉलम चौड़ा माना जाता है। सभी विस्तारित टैबस्टॉप सख्ती से बढ़ रहे हैं।


उदाहरण

टैबस्टॉप विनिर्देशन इनपुट के साथ और दोनों के 4,6,+2,+8बराबर है4,6,8,16

ab<Tab>c
<Tab><Tab>d<Tab>e<Tab>f

में विस्तारित किया गया है ( एक स्थान को इंगित करता है)

ab␣␣c
␣␣␣␣␣␣d␣e␣␣␣␣␣␣␣f

01234567890123456   (Ruler for the above, not part of the output)
          1111111

स्कोरिंग शुद्ध ; सबसे छोटा कोड जीतता है।

जवाबों:


2

गोल्फस्क्रिप्ट ( 77 75 चार्ट )

n/(','/{'+'/{~t++}*~:t}%81,{t*}%+:T;{[0\{.9={;T{1$>}?(.)@-' '*}*\)}/;]n+}/;

मैं tabspec पार्सिंग से काफी खुश हूँ।

# Split on commas
','/
# For each element:
{
    # Split on '+'
    '+'/
    # We now have either ["val"] or ["" "val"]
    # The clever bit: fold
    # Folding a block over a one-element array gives that element, so ["val"] => "val"
    # Folding a block over a two-element array puts both elements on the stack and executes,
    # so ["" "val"]{~t++}* evaluates as
    #     "" "val" ~t++
    # which evaluates val, adds the previous value, and concatenates with that empty string
    {~t++}*
    # Either way we now have a string containing one value. Eval it and assign to t
    ~:t
}%

तब मैं अंतिम तत्व के गुणकों को तब तक जोड़ता हूं जब तक कि मैं 80 कॉलम के अंत तक पहुंचने के लिए पर्याप्त होने की गारंटी नहीं देता:

81,{t*}%+

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

बाकी सब बहुत सीधा है।


2

रूबी 161 145

इनपुट की पहली पंक्ति पर टैबटॉप स्पेसिफिकेशन पढ़ता है।

i=t=[]
gets.scan(/(\+)?(\d+)/){t<<i=$2.to_i+($1?i:0)}
81.times{|j|t<<j*i}
while gets
$_.sub!$&," "*(t.find{|s|s>i=$`.size}-i)while~/\t/
print
end

संपादित करें: दो पंक्तियों को जोड़ा गया है जो अंतिम रीड टैबटॉप रिपीट बनाता है ताकि एक ही नंबर के टैबस्टॉप विनिर्देशों भी सही ढंग से काम कर सकें

iपिछले पार्स टैबस्टॉप को रखने के लिए एक अस्थायी चर है। tटैबस्टब्स की सूची है, जिसे gets.scanलाइन से पार्स किया गया है । अच्छे माप के लिए हम पिछले पार्स किए गए टैबस्टॉप के 81 गुणकों को जोड़ते हैं। while getsजब तक वहाँ कोई और अधिक इनपुट है पाश चलती है। इनपुट की प्रत्येक पंक्ति के लिए हम रिक्त स्थान के लिए टैब स्थानापन्न करते हैं, समय पर एक टैब क्योंकि स्ट्रिंग स्पेस को जोड़ते हैं और हमें सही टैबस्टॉप को पुनर्गणना करना चाहिए।


मैं वास्तव में रूबी को नहीं जानता, लेकिन क्या आप x+($1?i:0)छोटे के रूप में लिख सकते हैं $1?x+i:x?
तिमवी

@ टिमवी नोप! रूबी टर्नरी ऑपरेटर के साथ थोड़ी अजीब है। आमतौर पर आपको कहीं पर एक जगह लगाने की आवश्यकता होती है, क्योंकि कोलन ( :) एक प्रतीक की शुरुआत को भी चिह्नित कर सकता है , लेकिन चूंकि एक प्रतीक एक अंक से शुरू नहीं हो सकता है, :0यह अंतरिक्ष के बिना ठीक है। या कुछ और। यह अजीब है। कोष्ठक महत्वपूर्ण हैं यह भी लगता है।
डेनियारो

वह टैबस्टॉप स्कैनिंग मुझे छोटी लगती है। में t<<x+($1?i:0);i=xपहले बयान में परिवर्तन नहीं होता xहै, यह करता है? मुझे लगता है कि आपको इसे रिवर्स करने की आवश्यकता हैi=x+($1?i:0);t<<i
पीटर टेलर

1
वास्तव में आप पहली दो पंक्तियों को बदलकर 16 को बचा सकते हैं i=t=[](क्योंकि iयह गारंटी है कि पहली बार आसपास की आवश्यकता नहीं है); टैब-स्टॉप पार्स को सरल बनाना {t<<i=$2.to_i+($1?i:0)}, और lपूरी तरह से समाप्त करना ( iपहले से ही उस मूल्य को रखता है)। लेकिन टैब के बारे में परवाह नहीं करने पर अच्छा एक सख्ती से बढ़ रहा है: जो आपको 4 चार्ट बचाता है, और मैं इसे बचाने के लिए इसे उधार ले सकता हूं 2.
पीटर टेलर

@PeterTaylor इनपुट के लिए धन्यवाद! यह सीधे छोटी गाड़ी नहीं थी, लेकिन निश्चित रूप से थोड़ी फूली हुई थी। मुझे इस तरह से कोड पर अपने आप को अंधा करना बहुत आसान लगता है।
डानिएरो

1

C, 228 वर्ण

यहाँ चीजों को शुरू करने का एक C हल है। यहाँ अभी भी बहुत कुछ करने के लिए गोल्फिंग है (उन सभी को देखें ifऔर forएस एंड putcharएस ...)। साथ ही एक ही इनपुट लेकिन साथ के रूप में उदाहरण के testcase के साथ परीक्षण किया गया, 4और 8टैब कल्पना के लिए।

S[99],i;L,C;main(v){for(v=1;v;)v=scanf("+%d",&C),v=v>0?C+=L:scanf("%d",&C),
v&&(S[L=C]=++i,getchar());for(;i==1&&C<80;)S[C+=L]=1;for(C=L=0;C=~getchar();)
if(C+10)putchar(~C),L+=C+11?1:-L;else for(putchar(32);!S[++L];)putchar(32);}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.