একটি স্ট্রিং ডি-প্যারেন্টেসাইজিং


25

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

আপনি ধরে নিতে পারেন যে ইনপুটটিতে কেবলমাত্র ছোট-বড় ASCII অক্ষর এবং প্রথম বন্ধনী রয়েছে।

আপনার উত্তরটি এমন একটি ফাংশন হওয়া উচিত যা স্ট্রিং দেওয়ার পরে স্ট্রিংগুলির একটি তালিকা প্রদান করে।

উদাহরণ:

                   'a(b)c(d)e' -> ['ace', 'b', 'd']
                   'a(b(c)d)e' -> ['ae', 'bd', 'c']
                  'a((((b))))' -> ['a', 'b']
                        'a()b' -> ['ab']
                            '' -> []
                           'a' -> ['a']
          '(((a(b)c(d)e)f)g)h' -> ['h', 'g', 'f', 'ace', 'b', 'd']
'ab(c(((d)ef()g)h()(i)j)kl)()' -> ['ab', 'ckl', 'hj', 'efg', 'i', 'd']

সবচেয়ে কম বাইট জেতা


হয় 'i'এবং 'd'শেষ টেস্ট ক্ষেত্রে সঠিক অনুক্রমে?
পূর্কাকাডারী

@ পিটু ১৯৯৮ এর iচেয়ে কম গভীরভাবে বাসা বাঁধে d
feersum

ওফ, ঠিক আছে
পূর্কাকাডারী

1
আপনি কি পুরো স্ট্যান্ডার্ড প্রোগ্রামগুলিতে অন্যান্য স্ট্যান্ডার্ড সাবমিশন প্রকারগুলিকেও অনুমতি দিতে আপত্তি করবেন? সমস্ত ভাষায় ফাংশনগুলির ধারণা নেই। ডিফল্ট sens কমত্যের জন্য meta.codegolf.stackexchange.com/a/2422/8478 এবং meta.codegolf.stackexchange.com/questions/2447/… দেখুন
মার্টিন এন্ডার

2
@redstonerodent আমি যে শব্দটি ব্যবহার করতে চাইছি তা হ'ল "আপনি কোনও প্রোগ্রাম বা ফাংশন লিখতে পারেন, এসটিডিআইএন (বা নিকটতম বিকল্প), কমান্ড-লাইন আর্গুমেন্ট বা ফাংশন যুক্তি এবং এসটিডিআউট (বা নিকটতম বিকল্প) এর মাধ্যমে ফলাফল আউটপুট, ফাংশন রিটার্ন মান বা ফাংশন (আউট) প্যারামিটার। " এবং আপনার ক্ষেত্রে "আউটপুটটি কোনও সুবিধাজনক, দ্ব্যর্থহীন, ফ্ল্যাট তালিকা ফর্ম্যাটে হতে পারে।"
মার্টিন ইন্ডার

উত্তর:


11

জাভাস্ক্রিপ্ট ES6, 91 93 104 133 148

সম্পাদনা 2 2 বাইট সংরক্ষিত হয়েছে THX ব্যবহারকারী 81655

আরও স্ট্রিং এবং কম অ্যারে ব্যবহার করে সম্পাদনা করুন

নীচে স্নিপেট চলমান পরীক্ষা করুন একমাস্ক্রিপ্ট l অনুবর্তী ব্রাউজারে

f=s=>[...s].map(c=>l+=c<')'||-(o[l]=(o[l]||'')+c,c<'a'),o=[],l=0)&&(o+'').match(/\w+/g)||[]

// Less golfed

u=s=>{
  o=[]; l=0;
  [...s].map(c=>{
    if (c>'(') // letters or close bracket
      o[l]=(o[l]||'')+c, // add letter or close bracket to current level string
      l-=c<'a' // if close bracket, decrement level
    else
      ++l // open bracket, increment level
  })
  o = o+'' // collapse array to comma separated string
  return o.match(/\w+/g)||[] // fetch non empty strings into an array
}

// TEST
console.log=x=>O.innerHTML+=x+'\n'

;[ 'a(b)c(d)e'                    // ['ace', 'b', 'd']
 , 'a(b(c)d)e'                    // ['ae', 'bd', 'c']
 , 'a((((b))))'                   // ['a', 'b']
 , 'a()b'                         // ['ab']
 , ''                             // []
 , 'a'                            // ['a']
 , '(((a(b)c(d)e)f)g)h'           // ['h', 'g', 'f', 'ace', 'b', 'd']
 , 'ab(c(((d)ef()g)h()(i)j)kl)()' // ['ab', 'ckl', 'hj', 'efg', 'i', 'd']
].forEach(t=>console.log(t +" -> " + f(t)))
<pre id=O></pre>


সাথে 2 বাইট সংরক্ষণ করুন c=>l+=c<')'||-(o[l]=(o[l]||'')+c,c<'a'),
ব্যবহারকারী81655

@ ব্যবহারকারী 81655 সুন্দর, ধন্যবাদ
edc65

8

জুলিয়া, 117 86 83 বাইট

v->(while v!=(v=replace(v,r"(\(((?>\w|(?1))*)\))(.*)",s"\g<3> \g<2>"))end;split(v))

এটি একটি রেজেক্স সমাধান।

Ungolfed:

function f(v)
  w=""
  while v!=w
    w=v
    v=replace(v,r"(\(((?>\w|(?1))*)\))(.*)",s"\g<3> \g<2>"))
  end
  split(v)
end

r"(\(((?>\w|(?1))*)\))(.*)"একটি পুনরাবৃত্ত ( (?1)গ্রুপ 1 পুনরাবৃত্তি ) রেজেেক্স যা প্রথম বহিরাগত সুষম বন্ধনীর সাথে মিলবে (এতে ভারসাম্যহীন / বিপরীত বন্ধনী নেই), দ্বিতীয় গ্রুপটির সাথে প্রথম বন্ধনীর অভ্যন্তরে সমস্ত কিছুই রয়েছে (তাদের প্রথম বন্ধনী নিজেই নয়) এবং তৃতীয় গ্রুপটি রয়েছে প্রথম বন্ধনীর পরে সবকিছু (স্ট্রিংয়ের শেষ অবধি)।

replace(v,r"...",s"\g<3> \g<2>")এরপরে প্রাসঙ্গিক বন্ধনীগুলি সরানো হয়ে দ্বিতীয় গ্রুপটিকে স্ট্রিংয়ের শেষে (একটি স্থানের পরে, একটি ডিলিমিটার হিসাবে কাজ করতে) সরানো হবে। ভি == ডাব্লু পর্যন্ত পুনরাবৃত্তি করার মাধ্যমে, এটি নিশ্চিত করা হয়েছে যে কোনও বন্ধনীর বাকী অংশ না থাকা পর্যন্ত প্রতিস্থাপনটি পুনরাবৃত্তি হবে। কারণ ম্যাচগুলি শেষের দিকে চলে যায়, এবং তারপরের ম্যাচটি প্রথম প্রথম বন্ধনীতে চলে যায়, ফলস্বরূপ স্ট্রিংটি গভীরতার ক্রমে বিভক্ত হবে।

তারপরে splitস্ট্রিংয়ের অ-হোয়াইটস্পেস উপাদানগুলির সমস্তগুলি স্ট্রিংগুলির অ্যারের আকারে (যা কোনও শ্বেত স্থান নেই) হিসাবে ফিরিয়ে দেয়।

দ্রষ্টব্য w=""কোডটিতে যেহেতু লুপটি অন্তত একবার চালিত হয় তা নিশ্চিত করার জন্য নোটটি ব্যবহার করা হয়েছে (অবশ্যই ইনপুট স্ট্রিংটি খালি রয়েছে তা বাদে) এবং গল্ফযুক্ত আকারে প্রয়োজন নেই তা নিশ্চিত করুন।

3 বাইট সংরক্ষণে সহায়তার জন্য মার্টিন বাটনারকে ধন্যবাদ।


ঝরঝরে, আমি একই সমাধানটিতে স্বাধীনভাবে রেটিনায় এসেছি। এটি সেখানে 44 বাইট রয়েছে, তবে এটি পুরো প্রোগ্রামের সমাধানগুলির জন্য অনুমোদিত নয়। : /
মার্টিন ইন্ডার

\wপরিবর্তে ব্যবহার করে আপনি তিনটি বাইট সংরক্ষণ করতে পারেন [^()]
মার্টিন ইন্ডার

@ মার্টিনবাটনার - ধন্যবাদ আমি আসলে এটি বিবেচনা করেছি, তবে আমি চিন্তিত ছিলাম যে আমি কিছু উপেক্ষা করব এবং এটি কোনও প্রকার ক্ষেত্রে ব্যর্থ হবে। যদি আপনি বলেন যে এটি ঠিক আছে, তবে, এটি ঠিক আছে।
গ্লেন ও

6

পাইথন, 147 বাইট

def f(s):
 d=0;r=[['']for c in s]
 for c in s:
  if c=='(':d+=1;r[d]+=['']
  elif c==')':d-=1
  else:r[d][-1]+=c
 return[i for i in sum(r,[])if i]

ইউনিট পরীক্ষা:

assert f('a(b)c(d)e') == ['ace', 'b', 'd']
assert f('a(b(c)d)e') == ['ae', 'bd', 'c']
assert f('a((((b))))') == ['a', 'b']
assert f('a()b') == ['ab']
assert f('') == []
assert f('a') == ['a']
assert f('(((a(b)c(d)e)f)g)h') == ['h', 'g', 'f', 'ace', 'b', 'd']
assert f('ab(c(((d)ef()g)h()(i)j)kl)()') == ['ab', 'ckl', 'hj', 'efg', 'i', 'd']

আমি এই ধাঁধা পছন্দ করি; এটা ভীষণ সুন্দর!


4

পাইথ, 32 বাইট

fTscR)uX0.<GJ-FqLH`()@[Hdk)Jzmkz

পরীক্ষা স্যুট

@ কুইকসপ্লসোন এর পদ্ধতির থেকে শিথিলভাবে ভিত্তিক। প্রতিটি গভীরতায় অক্ষরগুলির স্থান পৃথকীকরণ তালিকা তৈরি করে, সেগুলি বিভক্ত করে এবং খালি দলগুলিকে ফিল্টার করে। বর্তমানের গভীরতার তালিকাটি সর্বদা সামনে রাখতে কার্যকরী তালিকাটি ঘোরানো হয়।


4

রেটিনা , 44 41 বাইট

+`\(((\w|(\()|(?<-3>.))*).(.*)
$4 $1
S_` 

-sপতাকা নিয়ে দৌড়াও। শেষ লাইনের শেষে স্থানটি লক্ষ্য করুন।

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

যদি আপনি প্রথম রেজেেক্স বুঝতে না পারেন তবে আমাকে ভারসাম্যপূর্ণ গ্রুপগুলি সম্পর্কে আমার এসও উত্তরটি উল্লেখ করুন । যেহেতু ইনপুট সঠিকভাবে বন্ধনী হতে নিশ্চিত, তখন আমরা ম্যাচিং দুটি বাইট সংরক্ষণ করতে পারবেন )সঙ্গে .পরিবর্তে \)। তারপরে আমরা কেবল বাকী স্ট্রিংটি সাথে মেলাই (.*)$4 $1প্রথমে লিখেছিল বাকী স্ট্রিংটি (উভয় প্রথম বন্ধনী এবং তাদের সামগ্রী বাদ দিয়ে) এবং তারপরে একটি স্পেসের পরে বন্ধনীগুলির সামগ্রী। +`এই ধাপটি পুনরাবৃত্তি অক্ষিপট বলে যতক্ষণ না স্ট্রিং পরিবর্তন (একবার সমস্ত প্রথম বন্ধনী সরিয়ে দেওয়া হয়েছে যা শুধুমাত্র ঘটবে) স্টপ।

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


3

কমন লিস্প, 160

(lambda(x)(labels((g(l)(cons(#1=format()"~(~{~A~}~)"(#2=remove-if'listp l))(mapcan #'g(#2#'atom l)))))(remove""(g(read-from-string(#1#()"(~A)"x))):test'equal))))

কেস রূপান্তর প্রয়োজনীয় না হলে এটি চার বাইট কম হতে পারে। ধারণাটি হ'ল ইনপুট স্ট্রিংয়ের প্রতিটি পাশে বাম এবং ডান বন্ধনী যুক্ত করা, এটি একটি তালিকা হিসাবে বিবেচনা করা, তালিকার শীর্ষ স্তরের উপাদানগুলিকে স্ট্রিংয়ে লিখুন এবং তারপরে সাবলিস্টগুলি একই পদ্ধতিতে প্রক্রিয়া করা উচিত।


2

হাস্কেল, 114 112 111 বাইট

')'%(h:i:t)=("":i):t++[h]
'('%l=last l:init l
c%((h:i):t)=((c:h):i):t
g x=[a|a<-id=<<foldr(%)(x>>[[""]])x,a>""]

ব্যবহারের উদাহরণ: g "ab(c(((d)ef()g)h()(i)j)kl)()"-> ["ab","ckl","hj","efg","i","d"]

আমি ইনপুট স্ট্রিং মাধ্যমে পিছনে যাচ্ছি। মধ্যবর্তী ডেটা কাঠামো স্ট্রিংগুলির তালিকার একটি তালিকা। বাহ্যিক তালিকাটি প্রতিটি স্তরের প্রতি স্তরের এবং অভ্যন্তরীণ তালিকাটি প্রতিটি স্তরের মধ্যে গ্রুপ অনুসারে থাকে [["ab"],["ckl"],["hj"],["efg","i"],["d"]]( উদাঃ দ্রষ্টব্য: আসল তালিকার মধ্যে অনেকগুলি খালি স্ট্রিং রয়েছে)। এটি সমস্ত ইনপুট দৈর্ঘ্যের সমান বেশিরভাগ খালি স্ট্রিং দিয়ে শুরু হয় - পর্যাপ্তর চেয়ে বেশি, তবে খালি তালিকা যাইহোক ফিল্টার করা হয়। বাহ্যিক তালিকা হয় হয় (/ )অথবা ঘূর্ণন সম্মুখ উপাদানটিতে অক্ষর যুক্ত করে। )এছাড়াও একটি নতুন গ্রুপ শুরু।

সম্পাদনা করুন: @ জগারব সংরক্ষণ করতে একটি বাইট খুঁজে পেয়েছে।


1

সেড, 90 বাইট

:
s/^(\w*)\((.*)\n?(.*)/\1\n\3_\2/M
s/(\n\w*_)(\w*)\)(.*)/\3\1\2/M
t
s/[_\n]+/,/g
s/,$//

বর্ধিত রেজেক্সস ( -rপতাকা) ব্যবহার করে, +1 বাইট দ্বারা গণ্য। এছাড়াও, এটি একটি জিএনইউ এক্সটেনশন ( কমান্ডের Mপতাকা s) ব্যবহার করে।

নমুনা ব্যবহার:

$ echo 'ab(c(((d)ef()g)h()(i)j)kl)()' | sed -r -f deparenthesize.sed
ab,ckl,hj,efg,i,d

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


0

পাইথন, 161 বাইট

এখানে আমি কী নিয়ে এসেছি, এটি একটি লাইনের কার্যকরী অজগর সমাধান:

p=lambda s:filter(None,sum([''.join([s[i]for i in range(len(s))if s[:i+1].count('(')-s[:i+1].count(')')==d and s[i]!=')']).split('(')for d in range(len(s))],[]))

এই চ্যালেঞ্জটি https://github.com/samcoppini/Difinition-book দ্বারা অনুপ্রাণিত হয়েছিল , যা প্যারেন্টেথিকালগুলিতে সংজ্ঞায়িত শব্দের সাথে একটি দীর্ঘ স্ট্রিং আউটপুট করে। আমি কোড লিখতে চেয়েছিলাম যা আমাকে প্রতিটি বাক্য দেবে, প্রথম বন্ধনী সরিয়ে দিয়ে। কার্যকরী সমাধান দীর্ঘ স্ট্রিংগুলিতে কার্যকর হতে খুব ধীর, তবে আবশ্যক সমাধান (@ কোউক্সপ্লাসনের সমাধানের মতো) অনেক দ্রুত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.