এমন একটি প্রোগ্রাম লিখুন যা জায়গাগুলির ধনুর্বন্ধনীগুলিতে স্থির হয় এমন ক্ষেত্রে স্পেসগুলির সাথে প্রতিস্থাপন করে ces


17

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

ইনপুটটি একটি একক লাইন হবে, যার মধ্যে বাম বন্ধনীর সংখ্যা ( ( [ {) এবং ডান বন্ধনী ( ) ] }) থাকবে। এটিতে, তবে সর্বদা নয়, মন্তব্য ( /* */) এবং স্ট্রিং আক্ষরিক ( " "বা ' ') এবং বিভিন্ন সংখ্যা, অক্ষর বা চিহ্ন থাকতে পারে।

কমপক্ষে একটি বন্ধনী থাকবে (কোনও মন্তব্যের বাইরে বা স্ট্রিং আক্ষরিক) এর বিপরীতে কোনও প্রতিক্রিয়া নেই (মন্তব্য বা স্ট্রিং আক্ষরিকের বাইরে)। উদাহরণস্বরূপ, পূর্ববর্তী }ব্যতীত একজন ভ্রান্ত {। আরেকটি উদাহরণ: একটি (যার )পরে নেই। আপনার প্রোগ্রামটি ব্র্যাককেট মেলে তুলতে প্রয়োজনীয় ন্যূনতম সংখ্যক বন্ধনীগুলির স্থানের সাথে প্রতিস্থাপন করবে।

উদাহরণ:

(4 + (2 + 3))]==> (4 + (2 + 3)) (শেষে বর্গাকার বন্ধনী)
][][[]]==> [][[]](শুরুতে বর্গাকার বন্ধনী)
("Hel(o!"))==> ("Hel(o!") (শেষে বন্ধনী)
( /* )]*/==> /* )]*/ (শুরুতে প্রথম বন্ধনী)
{()]==> () (কোঁকড়া বন্ধনী এবং বর্গাকার বন্ধনী)

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

এটি কোড গল্ফ, তাই ন্যূনতম সংখ্যা বাইট জেতে। স্পেসিফিকেশন পরিষ্কার না হলে মন্তব্যে প্রশ্ন জিজ্ঞাসা করুন।


উফফ, আমাদের সম্পাদনাগুলি সেখানে ধাক্কা খায়। : পি সব কিছু এখনই ঠিক করা উচিত।
ডুরকনব

@ ডুরকনব, এর জন্য ধন্যবাদ। কিভাবে স্পেস সম্মার্জনী থেকে দঃপূঃ থামাতে জানি না।
সোমরস

আমাদের কী স্ট্রিং আক্ষরিক (উদাঃ ("foo (\") bar")) স্ট্রিপিং স্টাফগুলি পরিচালনা করতে হবে ?
ডুরকনব

1
আমি যুক্তি দেব যে এর সঠিক আউটপুটটি সমতুল্য বা সমতুল্য {{(})হওয়া উচিত { } , যেহেতু খোলার দৃশ্যের দ্বারা বোঝা যাচ্ছে যে কোডটি শুরু হওয়ার সাথে সাথে কাজ শুরু করছিল, এবং {(})আমি জানি প্রতিটি প্রোগ্রামিং ভাষায় মিল নেই (যেমন "স্ট্যাসিসের কারণ" ??)) mat তবে, আমি ইতিমধ্যে একটি উত্তর লিখেছি, তাই আমি পক্ষপাতদুষ্ট।
DLosc

3
আমি দেখি. অনুমান আমি যথেষ্ট অক্ষম না। ;)
DLosc

উত্তর:


6

রুবি, 223 টি অক্ষর

এটি একটি দীর্ঘ দীর্ঘ পরিণত।

u,b,i=[],[[],[],[]],-1
s=gets.gsub(/(\/\*|"|').*?(\*\/|"|')|~/){|m|u+=[m];?~}
s.chars{|c|i+=1
(t='{[('.index(c))?b[t].push(i):((t='}])'.index(c))&&(b[t].pop||s[i]=' '))}
b.flatten.map{|l|s[l]=' '}
puts s.gsub(/~/){u.shift}

এটি যা করে তা হ'ল প্রথমে স্ট্রিং এবং মন্তব্যগুলি বের করা, যাতে তারা গণনা না করে (এবং এগুলি পরে রাখে)।

তারপরে, এটি স্ট্রিং অক্ষর দ্বারা অক্ষরে অক্ষরে যায়। এটি যখন একটি খোলার ধনুর্বন্ধনী আবিষ্কার করে, এটি তার অবস্থান সঞ্চয় করে। যখন এটি একটি বন্ধনী বন্ধনীটি সন্ধান করে, এটি তার নিজের খোলা ব্রেস স্টোরেজ অ্যারে থেকে পপ করে।

যদি popরিটার্ন nil(যেমন পর্যাপ্ত খোলার ধনুর্বন্ধনী ছিল না), এটি বন্ধনী বন্ধনী বন্ধ করে দেয়। এই পুরো জিনিসটি সম্পন্ন হওয়ার পরে এটি বাকী অতিরিক্ত খোলার ধনুর্বন্ধনীগুলি সরিয়ে দেয় (যেমন পর্যাপ্ত ক্লোজিং বন্ধনীগুলি ছিল না)।

প্রোগ্রামের শেষে, এটি সমস্ত স্ট্রিং এবং মন্তব্যগুলি পিছনে রাখে এবং সেগুলি আউটপুট করে।

Ungolfed:

in_str = gets

# grab strings and comments before doing the replacements
i, unparsed = 0, []
in_str.gsub!(/(\/\*|"|').*?(\*\/|"|')|\d/){|match| unparsed.push match; i += 1 }

# replaces with spaces the braces in cases where braces in places cause stasis
brace_locations = [[], [], []]
in_str.each_char.with_index do |chr, idx|
    if brace_type = '{[('.index(chr)
        brace_locations[brace_type].push idx
    elsif brace_type = '}])'.index(chr)
        if brace_locations[brace_type].length == 0
            in_str[idx] = ' '
        else
            brace_locations[brace_type].pop
        end
    end
end
brace_locations.flatten.each{|brace_location| in_str[brace_location] = ' ' }

# put the strings and comments back and print
in_str.gsub!(/\d+/){|num| unparsed[num.to_i - 1] }
puts in_str

এটি মারাত্মকভাবে চিত্তাকর্ষক। একটি প্রশ্ন, যদিও: এটি এখনও একটি ইনপুট মত কাজ করবে (("string"/*comment*/)"string"? যদি আমি সঠিকভাবে (অব্যাহত সংস্করণ) পড়ছি, আপনি স্ট্রিং এবং মন্তব্যগুলিকে unparsedঅ্যারেতে তাদের সূচক দিয়ে প্রতিস্থাপন করুন , যার ফলে প্রতিস্থাপন ((12)3এবং অস্তিত্বের সূচক 12(বা 11) খুঁজবে । আমি গল্ফ করা সংস্করণটি কেবলমাত্র ব্যবহার করে দেখছি shift, তবে এটির পরেও কি একইরকম সমস্যা হতে পারে না?
DLosc

4

পাইথন 3, 410 322 317

import re;a='([{';z=')]}';q=[re.findall('".*?"|/\*.*?\*/|.',input())]
while q:
 t=q.pop(0);s=[];i=0
 for x in t:
  if x in a:s+=[x]
  try:x in z and 1/(a[z.find(x)]==s.pop())
  except:s=0;break
 if[]==s:print(''.join(t));break
 while 1:
  try:
   while t[i]not in a+z:i+=1
  except:break
  u=t[:];u[i]=' ';q+=[u];i+=1

ক্ষুদ্রতরগুলি দিয়ে শুরু করে মুছে ফেলার প্রতিটি সম্ভাব্য সেট চেষ্টা করে, যতক্ষণ না এটি এমন কোনও সন্ধান পায় যেখানে বন্ধনীগুলি ভারসাম্যযুক্ত। (যার দ্বারা আমি পুরোপুরি সঠিকভাবে ভারসাম্য বলতে চাইছি: {{(})উত্পাদন করে ( ), না {(})))

প্রথম সংস্করণটিতে একটি পুনরাবৃত্ত জেনারেটর ফাংশন ব্যবহৃত হয়েছিল, যা সত্যিই দুর্দান্ত ছিল তবে এটিও দীর্ঘ। এই সংস্করণটি একটি সারি ব্যবহার করে একটি সাধারণ প্রস্থের প্রথম অনুসন্ধান করে। (হ্যাঁ, এটি একটি কাল্পনিক সময় অ্যালগোরিদম। সমস্যা কি?? ^ ডি)


আমি এটি পছন্দ করি কারণ এটি প্রকৃতপক্ষে সর্বনিম্ন অপসারণটি খুঁজে পায় এবং সঠিকভাবে নেস্টেড ভাব প্রকাশ করে তবে @ ভনিলিয়ার শেষ মন্তব্যটি বোঝায় যে সঠিক বাসা বাঁধাই গুরুত্বপূর্ণ নয়। তবে প্রচুর ধনুর্বন্ধনী অপসারণ করা প্রয়োজন যদি এটি সত্যিই ধীর।
ধনী

2

সি - 406

নিয়মিত অভিব্যক্তি ব্যবহার না করে সি তে একটি প্রচেষ্টা।

#define A if((d==125||d==93||d==41)
char*s;t[256];f(i,m,n,p){while(s[i]!=0){int c=s[i],k=s[i+1],v=1,d;if((c==42&&k==47)||(c==m&&i>n))return i;if(!p||p==2){if((c==39||c==34)||(c==47&&k==42)){i=f(i,c*(c!=47),i,p+1);
c=c==47?42:c;}d=c+1+1*(c>50);A){v=f(i+1,d,i,2);if(!p&&v)t[d]++;if(p==2&&v)i=v;}}d=c;A&&!p){v=!!t[c];t[c]-=v;}if(p<2)putchar(c*!!v+32*!v);i++;}return 0;}main(int c,char*v[]){s=v[1];f(0,0,0,0);}

সংকলন করতে এবং চালাতে (একটি লিনাক্স মেশিনে):
gcc -o বন্ধনী বন্ধনীর জন্য।
C /। "" (()) "

[(]) এর মতো অপরিজ্ঞাত ক্ষেত্রে এটি সর্বশেষ বৈধ বন্ধনী জুড়ায় ()


2

পাইথন 3, 320

import re
O=dict(zip('([{',')]}'))
def o(s,r,m=0,t=[]):m+=re.match(r'([^][)({}/"]|/(?!\*)|/\*.*?\*/|".*?")*',s[m:]).end();return r and o(s[:m]+' '+s[m+1:],r-1,m+1,t)or(o(s,r,m+1,t+[O[s[m]]])if s[m]in O else[s[m]]==t[-1:]and o(s,r,m+1,t[:-1]))if s[m:]else not t and s
s=input();i=0;a=0
while not a:a=o(s,i);i+=1
print(a)

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


ভাল খেলেছে, ভাল খেলেছে। আমি 317-এ নামার ব্যবস্থা করেছিলাম, তবে আমার মনে হয় আপনার খুব সহজেই এটি পাস করা উচিত। (এদিকে, আমার প্রোগ্রামটি এখনও আপনার উদাহরণ
ইনপুটটিতে

@ ডিএলকাস: নিঃশ্বাস ত্যাগ করবেন না :)। 6 টি ওপেন পেরেন্স সহ সেই প্যাটার্নটির সংস্করণটি করতে আমার মেশিনটি 58 ​​মিনিট সময় নিয়েছে। মহাবিশ্বের তাপ-মৃত্যুতে পৌঁছার আগে স্ট্যাসিস সমাধান করার জন্য, আপনাকে এই কাতটি স্মরণ করতে হবে; অন্যথায়, আপনি একটি O(n!!)সমাধান দিয়ে শেষ , না O(n!)। (আমার গল্ফ এর O(n*2^n)পরিবর্তে O(2^n), কারণ oপ্রকৃতপক্ষে rঅপসারণের পরিবর্তে rহ্রাস করা সমস্ত প্যাটার্নগুলি তৈরি করে fix ঠিক করা সহজ, তবে এটির জন্য কয়েকটি অক্ষর
লাগবে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.