ট্যাবগুলি প্রসারিত করুন (প্রসারিত করুন (1))


10

আপনার কাজটি হ'ল পসিক্স expand(1)ইউটিলিটির একটি বৈকল্পিক প্রয়োগ করা যা ট্যাবগুলিকে স্পেসে প্রসারিত করে।

আপনার প্রোগ্রামটি একটি ট্যাবস্টপ স্পেসিফিকেশন নেওয়া এবং তারপরে স্ট্যান্ডার্ড ইনপুট পড়ুন এবং পরবর্তী ট্যাবস্টপে পৌঁছানোর জন্য উপযুক্ত পরিমাণে ফাঁকা স্থানের সাথে ইনপুটটিতে ট্যাব অক্ষরগুলি প্রতিস্থাপন করতে হবে। ফলাফল স্ট্যান্ডার্ড আউট লেখা উচিত ।

ট্যাবস্টপ স্পেসিফিকেশন

একটি ট্যাবস্টপ স্পেসিফিকেশন একটি একক সংখ্যা, বা কমা দ্বারা পৃথক ট্যাবস্টপের তালিকা নিয়ে গঠিত। একক সংখ্যার ক্ষেত্রে এটি পুনরাবৃত্তি হয় যেন এর বহুগুণ কমা-বিচ্ছিন্ন তালিকায় ঘটে (যেমন 4হিসাবে কাজ করে 4,8,12,16,20,...)। কমা দ্বারা পৃথক করা তালিকাতে থাকা প্রতিটি এন্ট্রি একটি ধনাত্মক পূর্ণসংখ্যা ঐচ্ছিকভাবে একটি দ্বারা পূর্বনির্ধারিত +। একটি +উপসর্গ কমা-বিচ্ছিন্ন তালিকার পূর্বের মানের সাথে তুলনামূলক পার্থক্য নির্দেশ করে। তালিকার প্রথম মানটি অবশ্যই নিরঙ্কুশ (অর্থাত্ অপরিবর্তিত)। ট্যাবস্টপগুলি পরবর্তী অ-স্পেস অক্ষরটির কলাম নির্দিষ্ট করে (প্রসারিত ট্যাব অনুসরণ করে), বামদিকের কলামটি নম্বর হিসাবে নেওয়া হয়েছে Tab ট্যাবগুলি সর্বদা কমপক্ষে একটি স্পেসে প্রসারিত হওয়া উচিত।

ইনপুট আউটপুট

ট্যাবস্টপ স্পেসিফিকেশনটি হয় প্রোগ্রামের প্রথম কমান্ড-লাইন প্যারামিটার হিসাবে নেওয়া হবে, বা আপনার বিবেচনার ভিত্তিতে স্ট্যান্ডার্ড থেকে ইনপুটটির প্রথম লাইন (একটি নতুন লাইন দ্বারা সমাপ্ত) হিসাবে পড়তে হবে। ট্যাবস্টপটি পড়ার পরে, ইওএফ প্রক্রিয়াজাতকরণ এবং প্রসারিত হওয়া অবধি বাকি ইনপুট (সমস্ত ইনপুট, পূর্বের ক্ষেত্রে)। প্রসারিত আউটপুট মান আউট লেখা হবে।

সমস্ত বর্ধিত ট্যাবস্টপ এবং সমস্ত ইনপুট সর্বোচ্চ 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

গল্ফস্ক্রিপ্ট ( 75 77 75 টি অক্ষর)

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

আমি ট্যাবস্পেক পার্সিং নিয়ে বেশ সন্তুষ্ট।

# 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। ভাল পরিমাপের জন্য আমরা শেষ পার্স করা ট্যাবস্টপের ৮১ টি গুণক যুক্ত করি। 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ইতিমধ্যে এটির মান রয়েছে)। তবে ট্যাবটির যত্ন না নেওয়ার জন্য কঠোরভাবে বাড়ানো বন্ধ করুন: এটি আপনাকে ৪ টি চর বাঁচায় এবং আমি এটি ২ সংরক্ষণ করতে ধার নিতে পারি
পিটার টেলর

@ পিটারটেলর ইনপুট দেওয়ার জন্য ধন্যবাদ! এটি সরাসরি বগি ছিল না, তবে অবশ্যই কিছুটা ফুলে গেছে। নিজেকে এইরকম কোডে অন্ধের দিকে তাকাতে খুব সহজ লাগে।
দানিরো

1

সি, 228 অক্ষর

জিনিসগুলি বন্ধ করার জন্য এখানে একটি সি সমাধান রয়েছে। এখনও (সমস্ত তাদের দিকে তাকাও golfing অনেকটা এখানে করতে করতে ifs এবং fors এবং putcharগুলি ...)। উদাহরণস্বরূপ টেস্টকেস, পাশাপাশি একই ইনপুট দিয়ে তবে 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);}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.