ভিতরে একটি স্ট্রিং ঘুরিয়ে


21

ভারসাম্যযুক্ত স্ট্রিং হল প্রথম বন্ধনীগুলির একটি স্ট্রিং ()যাতে প্রতিটি প্যারেনসিসটি অন্য একটির সাথে মিলে যায়। আরও কঠোরভাবে তারা এই ব্যাকরণ দ্বারা বিভক্ত স্ট্রিং:

S → (S)S | ε

আমরা এর দ্বারা একটি স্ট্রিং "ভিতরে আউট" চালু করতে পারি:

  • এর সমস্ত সংঘটন স্যুইচিং (এবং )একে অপরের সাথে

  • স্ট্রিংটির সামনের দিক থেকে পিছনে অক্ষরগুলি সরানো না হওয়া পর্যন্ত স্ট্রিংটি আবার ভারসাম্য না হওয়া পর্যন্ত।


একটি উদাহরণ দেয়।

আমরা ভারসাম্যযুক্ত স্ট্রিং দিয়ে শুরু করি:

(()(())())

তারপরে আমরা পেরেনগুলি তৈরি করতে স্যুইচ করি

))())(()((

তারপরে স্ট্রিংয়ের ভারসাম্য না হওয়া পর্যন্ত স্ট্রিংয়ের সামনের দিক থেকে স্ট্রিংয়ের পিছনে অক্ষরগুলি সরিয়ে দিন।

))())(()((
)())(()(()
())(()(())
))(()(())(
)(()(())()
(()(())())

আমাদের রেজাল্ট!


নোট করুন যে কয়েকটি স্ট্রিং একাধিক উপায়ে অভ্যন্তরে পরিণত করা যেতে পারে, উদাহরণস্বরূপ স্ট্রিং

(()())

যখন ভিতরে ঘুরিয়ে দেওয়া হয় তা হতে পারে:

()(())

অথবা

(())()

তবে প্রতিটি স্ট্রিংয়ের কমপক্ষে একটি সমাধান থাকে

কার্য

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

এটি একটি প্রতিযোগিতা তাই বাইট দ্বারা পরিমাপ করা হিসাবে আপনার উত্স কোডের আকারটি হ্রাস করার লক্ষ্য করা উচিত।

পরীক্ষার মামলা

(()())     -> ()(()), (())()
(()(())()) -> (()(())())
((())())() -> (()(()()))

সর্বদা একটি সমাধান আছে কি এটি গ্যারান্টিযুক্ত?
লুইস মেন্ডো

@ লুইস মেন্ডো হ্যাঁ, আমি এটি প্রমাণ করেছি। আপনি যদি প্রমাণটি দেখতে চান তবে বিনা দ্বিধায় আমাকে চ্যাটে পিন করুন।
গম উইজার্ড

ধন্যবাদ। এটা আমার পক্ষে যথেষ্ট। হতে পারে আপনার এটিকে চ্যালেঞ্জে লিখতে হবে, অন্যথায় আপনাকে কোনও সমাধান না হলে কী আউটপুট দিতে হবে তা নির্ধারণ করতে হবে
লুইস মেন্ডো

উত্তর:


9

হাস্কেল , 124 120 119 117 113 110 109 106 105 104 101 98 বাইট

বার্টাভেললে ধন্যবাদ 4 টি বাইট!

3 বাইট জগারবকে ধন্যবাদ রক্ষা করেছে

1 বাইট পিটার টেলরকে ধন্যবাদ রক্ষা করেছে

এখানে একটি সমাধান আমি হাস্কেলের বাইরে কাজ করেছি। তার ঠিক ডান এখন কিছু সাহায্য আমি পেয়েছি তাই প্রশংসনীয় ভাল ধন্যবাদ, কিন্তু আমি এই খাটো করতে তাই ফিডব্যাক / পরামর্শ প্রশংসা করা হয় খুঁজছি।

until(!0)g.map d
_!1=1<0
('(':a)!x=a!(x-1)
(_:a)!x=a!(x+1)
_!_=1>0
g(a:b)=b++[a]
d '('=')'
d _='('

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

এই প্রোগ্রামটি 4 টি ফাংশন সংজ্ঞায়িত করে, প্রথমটি (!)নির্ধারণ করে যে কোনও স্ট্রিং ভারসাম্যযুক্ত কিনা। এটি নিম্নলিখিত হিসাবে সংজ্ঞায়িত:

_!1=1<0
('(':a)!x=a!(x-1)
(_:a)!x=a!(x+1)
_!_=1>0

এই চেকটি ধরে নেওয়া হয়েছে যে পিটার টেলরের একটি পরামর্শের জন্য ইনপুটটিতে সমান সংখ্যক উন্মুক্ত এবং নিকট প্যারেনস রয়েছে।

এরপরে gস্ট্রিংটি একবার ঘোরানো হবে।

g(a:b)=b++[a]

তারপরে আমাদের রয়েছে dযা কেবল প্যারেন নেয় এবং এটি মিরর করে

d '('=')'
d _='('

অবশেষে আমরা ফাংশনটি নিয়ে আমাদের সাথে সম্পর্কিত। এখানে আমরা একটি pointfree উপস্থাপনা ব্যবহার until(!0)gসঙ্গে স্থিরীকৃত map d, যা মানচিত্র dইনপুট এবং প্রযোজ্য gপর্যন্ত ফলাফলের সুষম হয়। এটি প্রশ্নের মধ্যে বর্ণিত সঠিক প্রক্রিয়া।

until(!0)g.map d

1
এর g x@(a:b)|x!0=x|1>0=g$b++[a]জন্য পেরেনগুলি মুছতে এবং মুছতে কয়েক বাইট স্ক্র্যাপ করতে পারেন d '('=')'
বার্তাভেল

@ বার্তাওলে প্যারেনগুলি মুছে ফেলার dফলে সংকলক ত্রুটির কারণ হয়, বিশ্বাস করুন আমি চেষ্টা করেছি। তবে প্রথম পরামর্শটি স্বাগত। ধন্যবাদ!
গম উইজার্ড

1
আপনি অন্য একটি বাইট সংরক্ষণ করতে পারেন !কারণ আপনার স্ট্রিংয়ের অসম সংখ্যা ও খোলা এবং ঘনিষ্ঠ বন্ধনীগুলির হ্যান্ডেল করার দরকার নেই, তাই আপনি প্রথম দুটি কেস অদলবদল করতে এবং করতে পারেন_!1=1<0 []!_=0<1
পিটার টেলর

1
untilসংক্ষিপ্ত করতে ব্যবহার করুন g: টিআইও
জাগার্ব

2
আমি মনে করি করে একটি শালীন সংরক্ষণ করার সময় হতে হবে dমানচিত্র '('থেকে (-1)এবং অন্য কিছু 1, এবং তারপর দুই দীর্ঘতম মামলা !করার মিলিত হতে পারে (i:a)!x=a!(x+i)। শীর্ষ স্তরের কাঠামোটির পরে কন্ডিশনের দিকে ধাক্কা দেওয়ার map dজন্য পুনরায় কাজ করা দরকার until, এবং আমাকে চালাতে হবে তাই এখনই আর সময় পেলাম না যে সমস্ত সংযুক্তিকে এটি একসাথে আঠালো করার জন্য কী সংযুক্তকারীগুলির প্রয়োজন।
পিটার টেইলর 16

7

এসওজিএল ভি0.12 , 12 11 বাইট

↔]»:l{Ƨ()øŗ

এখানে চেষ্টা করুন!

ব্যাখ্যা:

↔            mirror characters
 ]           do ... while the top of stack is truthy
  »            put the last letter at the start
   :           duplicate it
    l{         length times do
      Ƨ()        push "()"
         ø       push ""
          ŗ      replace ["()" with ""]
             if the string left on stack is empty (aka all matched parentheses could be removed), then stop the while loop

নোট: l{দ্বারা প্রতিস্থাপিত করা যেতে পারে ( 10 বাইট, কিন্তু দুঃখিতভাবে, এটা বাস্তবায়িত হয়নি জন্য।


আপনি কি নিশ্চিত যে চরিত্রগুলি মিরর করে কাজ করে? আমি এর সঠিক অর্থটি জানি না তবে আমার অন্তর্নিহিততা আমাকে বলেছে যে এটি চরিত্রগুলির ক্রমকেও বিপরীত করে দেয় যা আমি মনে করি না যে এটি কাজ করবে।
গম উইজার্ড

1
@ ওলম্যান এটি চরিত্রগুলি বিপরীত করার উদ্দেশ্যে তৈরি হয়েছিল , তবে তা নয় (যা এখানে একটি বাইট সংরক্ষণ করে!)। গর্ত পরিবর্তন করতে এটি V0.13 এর লাইনে রয়েছে। উদাহরণ
ডিজাইমা

5

সিজেএম (20 টি চর)

q1f^0X${~_}%_:e>#)m<

অনলাইন ডেমো

বা একই চর গণনা জন্য

q1f^_,,{0W$@<~}$W=m<

অনলাইন ডেমো

ব্যবচ্ছেদ

দুটি সংস্করণে একটি সাধারণ শিরোলেখ এবং পাদচরণ রয়েছে

q1f^    e# Read input and toggle least significant bit of each character
        e# This effectively swaps ( and )

m<      e# Stack: swapped_string index
        e# Rotates the string to the left index characters

তারপরে মাঝের বিটটি স্পষ্টভাবে গণনা করে যে এটি কতটা ঘোরানো দরকার। তারা উভয়ই মূল্যায়ন ব্যবহার করে এবং (সিজেএম হ্রাস অপারেটর এবং )ইনক্রিমেন্ট অপারেটর হওয়ার উপর নির্ভর করে ।

0X$     e# Push 0 and a copy of the swapped string
{~_}%   e# Map: evaluate one character and duplicate top of stack
        e# The result is an array of the negated nesting depth after each character
_:e>    e# Copy that array and find its maximum value
#       e# Find the first index at which that value occurs
)       e# Increment

বনাম

_,,     e# Create array [0 1 ... len(swapped_string)-1]
{       e# Sort with mapping function:
  0W$@  e#   Rearrange stack to 0 swapped_string index
  <~    e#   Take first index chars of swapped_string and evaluate
}$      e# The result is an array of indices sorted by the negated nesting depth
W=      e# Take the last one

3

জাভাস্ক্রিপ্ট (ES6), 111 105 বাইট

(@ ক্রেইগএইয়ারকে 2 বাইট সংরক্ষণ করা হয়েছে, @ পেটারটেলরকে 2 বাইট ধন্যবাদ, @ শেগির কাছে 2 বাইট ধন্যবাদ

s=>(r=[...s].map(c=>'()'[c<')'|0])).some(_=>r.push(r.shift(i=0))&&!r.some(c=>(i+=c<')'||-1)<0))&&r.join``

Ungolfed:

s=>(
  r=[...s].map(c=>'()'[c<')'|0]),  //switch "(" and ")"
  r.some(_=>(
    r.push(r.shift(i=0)),          //move last element to beginning of array, initialize i
    !r.some(c=>(i+=c<')'||-1)<0)   //check if balanced (i should never be less than 0)
  )),
  r.join``
)

পরীক্ষার কেস:


3

রেটিনা , 46 38 বাইট

T`()`)(
(.*?)(((\()|(?<-4>\)))+)$
$2$1

এটি অনলাইন চেষ্টা করুন! লিঙ্কে পরীক্ষার কেস অন্তর্ভুক্ত রয়েছে। সম্পাদনা করুন: @ মার্টিনইেন্ডারের সহায়তায় 8 বাইট সংরক্ষণ করা হয়েছে প্রথম পর্যায়ে কেবল প্রথম বন্ধনী স্থানান্তরিত হয়, যখন দ্বিতীয় পর্যায়ে একটি দীর্ঘস্থায়ী প্রত্যয় খুঁজে পাওয়া যায় যা একটি বৈধ ভারসাম্য উপসর্গ, যা সম্ভবত পুরোপুরি ভারসাম্য বজায় রাখার জন্য পর্যাপ্ত শর্ত। ব্যালেন্সিংগুলি ভারসাম্য গোষ্ঠীগুলি ব্যবহার করে সনাক্ত করা হয়। কনস্ট্রাক্টটি যে ((\()|(?<-4>\)))+কোনও সংখ্যক (এর সাথে আরও বহুসংখ্যক গুলি এর সাথে মেলে )যতক্ষণ আমরা ইতিমধ্যে ( গুলি <-4>) এর বেশি দেখেছি (। যেহেতু আমরা কেবলমাত্র একটি বৈধ উপসর্গের সন্ধান করছি আমাদের বাকি )টির সাথে মেলে না ।


সাধারণত, উভয় বন্ধনী পুনরাবৃত্তি করার পরিবর্তে, আপনি কেবল সেগুলি একটি বিকল্পে রেখেছিলেন, যা একটি বাইট সংরক্ষণ করে ((\()|(?<-2>\)))। কিন্তু আপনার প্রয়াস মাত্র একটি সম্পূর্ণ নতুন পদ্ধতির যে অন্য দুই সংরক্ষণ এটি আমাকে অনুপ্রাণিত: (?<-1>(\()*\))+। ভবিষ্যতে এটি অবশ্যই কাজে আসবে, তাই আপনাকে ধন্যবাদ। :)
মার্টিন ইন্ডার

প্রথম প্রত্যয়টি মিলিয়ে আপনি ঘূর্ণনটি নির্ধারণ করা আরও ছোট, যার মাধ্যমে আপনি নেতিবাচক স্ট্যাকের গভীরতা না পেয়ে স্ট্রিংয়ের শেষ প্রান্তে পৌঁছাতে পারবেন: tio.run/…
মার্টিন

@ মার্টিনএন্ডার আমি প্রথমে একটি বিকল্প চেষ্টা করেছিলাম কিন্তু আমি সে সময় এটির কাজ করতে পারিনি, তবে কীভাবে (?<-1>(\()*\))+কাজ করে তাও আমি দেখতে ব্যর্থ হলাম , যেহেতু এটি কোনও 1মিলের আগে স্ট্যাক থেকে পপ করতে চায় বলে মনে হয় ...
নীল

@ মার্টিনএেন্ডার এটি হওয়ার সাথে সাথে, ভারসাম্য উপসর্গগুলির মিলের ক্ষেত্রে বিকল্প রূপটি গল্ফার বলে মনে হয়।
নীল

1
আসল পপিং শুরুতে নয়, গ্রুপের শেষে ঘটে। নকলটি এড়াতে বিকল্পের সাথে ভাল পয়েন্ট \(*
মার্টিন ইন্ডার

2

পিএইচপি, 110 108 বাইট

for($s=$argn;;$p?die(strtr($s,"()",")(")):$s=substr($s,1).$s[$i=0])for($p=1;$p&&$c=$s[$i++];)$p-=$c<")"?:-1;

পাইপ হিসাবে চালান -nRবা এটি অনলাইনে পরীক্ষা করুন

ভাঙ্গন

for($s=$argn;               # import input
    ;                       # infinite loop
    $p?die(strtr($s,"()",")(")) # 2. if balanced: invert, print and exit
    :$s=substr($s,1).$s[$i=0]   #    else: rotate string, reset $i to 0
)                               # 1. test balance:
    for($p=1;                   # init $p to 1
        $p&&$c=$s[$i++];)       # loop through string while $p is >0
        $p-=$c<")"?:-1;             # increment $p for ")", decrement else


2

অক্টাভা, 62 বাইট

@(s)")("(x=hankel(s,shift(s,1))-39)(all(cumsum(2*x'-3)>=0)',:)

এটি অনলাইন চেষ্টা করুন!

একটি ফাংশন যা স্ট্রিংটিকে ইনপুট হিসাবে গ্রহণ করে এবং সমস্ত ফলাফল মুদ্রণ করে।

ব্যাখ্যা:

           hankel(a,shift(a,1))                                % generate a matrix of n*n where n= length(s) and its rows contain incresing circulraly shifted s
         x=...                 -39                             % convert matrix of "(" and ")" to a mtrix of 1 and 2
    ")("(x                        )                            % switch the parens
                                               2*x'-3          % convert [1 2] to [-1 1]
                                        cumsum(      )         % cumulative sum along the rows
                                    all(              >=0)'    % if all >=0
                                   (                       ,:) % extract the desired rows

2

গণিত, 78 বাইট

""<>{"(",")"}[[2ToCharacterCode@#-81//.x_/;Min@Accumulate@x<0:>RotateLeft@x]]&

1

জাভাস্ক্রিপ্ট (ES6), 97 বাইট

f=(s,t=s,u=t.replace(')(',''))=>u?t==u?f(s.slice(1)+s[0]):f(s,u):s.replace(/./g,c=>c<')'?')':'(')

ইনপুট স্ট্রিং এর ট্রান্সপোজ সুষম না হওয়া পর্যন্ত পুনরায় ঘুরিয়ে কাজ করে, তারপরে ট্রান্সপোসিং করে ing


কেবল সুন্দর।
রিক হিচকক

1

এপিএল (ডায়ালগ ইউনিকোড) , 35 30 বাইট

@ অ্যাডমকে ধন্যবাদ জানিয়ে একটি নতুন পদ্ধতির গল্ফ করেছে

1⌽⍣{2::01∊⍎⍕1,¨⍺}')('['()'⍳⎕]

এটি অনলাইন চেষ্টা করুন!

গল্ফিং চলছে।

ব্যাখ্যা

'()'⍳⎕              Find the index of each character of the input in the string '()'
                    (this is 1-indexed, so an input of '(())()' would give 1 1 2 2 1 2)
')('[...]           Find the index of the vector in the string ')('
                    This essentially swaps ')'s with '('s and vice versa
                   On this new string, do:
 1                   rotate it one to the left
                    Until this results in 1:
 1,¨⍺                 Concatenate each element of the argument with a 1
                      This inserts 1 one before each parenthesis
                     Stringify it
                     And evaluate it, if the parentheses are balanced, this produces no errors
 1                   Check if 1 belongs to evaluated value
                      If the parentheses were not matches during ⍎, this causes a syntax error
 2::0                 This catches a syntax error and returns 0
                      Essentially this code checks if the brackets are balanced or not

0

পাইথন 2 , 99 বাইট

r=[0];S=''
for c in input():b=c>'(';r+=[r[-1]+2*b-1];S+=')('[b]
n=r.index(min(r))
print S[n:]+S[:n]

এটি অনলাইন চেষ্টা করুন!

সহজ পরীক্ষার ক্ষেত্রে ফাংশন আকারে:

পাইথন 2 , 108 বাইট

def f(s):
 r=[0];S=''
 for c in s:b=c>'(';r+=[r[-1]+2*b-1];S+=')('[b]
 n=r.index(min(r))
 return S[n:]+S[:n]

এটি অনলাইন চেষ্টা করুন!

এটি কিছুটা আলাদা পদ্ধতির ব্যবহার করে - পুনরাবৃত্তভাবে স্ট্রিংটি ঘোরানোর পরিবর্তে, যদি আমরা প্যারেন্সকে কিছুটা ব্যালেন্স কাউন্টারকে বাড়ানো এবং হ্রাস করে বলে মনে করি, তবে ভারসাম্যযুক্ত স্ট্রিংটিতে মোট ইনক্রিমেন্টের পরিমাণ কখনই না থাকতে পারে - হ্রাস যেগুলি 0 এর চেয়ে কম।

সুতরাং আমরা নিতে

(()(())())

পেরেনগুলি উল্টান:

))())(()((

এবং এগুলি ইনক্রিমেন্ট / হ্রাসের পরিমাণের তালিকায় রূপান্তর করুন:

[-1,-2,-1,-2,-3,-2,-1,-2,-1,0]

-3 হ'ল সূচক নূন্যতম 4 (শূন্য ভিত্তিক); সুতরাং আমরা সেই সূচকটি +1 দ্বারা স্থানান্তরিত করতে চাই। এটি গ্যারান্টি দেয় যে ক্রমবর্ধমান বৃদ্ধি / হ্রাস কখনই 0 এর চেয়ে কম হবে না; এবং যোগফল 0 হবে।


আমার ফোনে তাই আমি পরীক্ষা করতে পারছি না, তবে আপনি কি r=0,তার বদলে করতে পারবেন r=[0]?
সাইয়েস

আপনার সাথে @ Cyoce এর পরামর্শ চলুন, তাহলে আপনি প্রতিস্থাপন করতে হবে r+=[r[-1]+2*b-1]সঙ্গে r+=r[-1]+2*b-1,পাশাপাশি
ovs

0

ক্লোজার, 118 বাইট

#(loop[s(map{\(\)\)\(}%)](let[s(conj(vec(rest s))(first s))](if(some neg?(reductions +(map{\( 1\) -1}s)))(recur s)s)))

অক্ষরের একটি অনুক্রম ফেরত দেয়, তাই আমি এটিকে এটি কল করব:

(apply str (f "(()(())())"))
; "(()(())())"

প্রথমে বন্ধনীগুলি উল্টায়, তারপরে বন্ধনী গণনাটির ক্রমসংখ্যার যোগফল যতক্ষণ না ক্রমের কোনও সময়ে নেতিবাচক হয় as


0

brainfuck , 82 বাইট

,[++[->->++<<]-[--->+>-<<]>-->+[-[-<<+>>>>+<<]],]+[<<]>>>[.[-]>>]<[<<]<[<<]>>[.>>]

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

প্রতিটি অক্ষর পড়ার সাথে সাথে একটি কাউন্টার নিম্নরূপে পরিবর্তিত হয়:

  • কাউন্টার 0 থেকে শুরু হয়।
  • প্রতিটির পর ) , কাউন্টারটি 1 দ্বারা বৃদ্ধি পায়।
  • প্রতিটির পরে (, কাউন্টারটি 0 টি হ্রাস না করে, যদি কাউন্টার 0 না হয় তবে ক্ষেত্রে কাউন্টারটি অপরিবর্তিত রয়েছে।

প্রতিটি উপসর্গই ভারসাম্যযুক্ত স্ট্রিংয়ের একটি বৈধ প্রত্যয় (বিপরীততার পরে) এবং যদি কেবল এই কাউন্টার হয় 0 তবে এই কোডটি আউটপুট গঠনের জন্য দীর্ঘতম এ জাতীয় উপসর্গ ব্যবহার করে।

,[                   Take input and start main loop
                     The cell one space right is the output cell (0 at this point),
                     and two spaces right is a copy of the previous counter value
  ++                 Add 2 to input
  [->->++<<]         Negate into output cell, and add twice to counter
  -[--->+>-<<]       Add 85 to output cell, and subtract 85 from counter
  >-->+              Subtract 2 from output cell and add 1 to counter
                     The output cell now has (81-input), and the counter has been increased by (2*input-80)
  [-[-<<+>>>>+<<]]   If the counter is nonzero, decrement and copy
,]
+[<<]                Go to the last position at which the counter is zero
>>>                  Go to following output character
[.[-]>>]             Output from here to end, clearing everything on the way
                     (Only the first one needs to be cleared, but this way takes fewer bytes)
<[<<]                Return to the same zero
<[<<]>>              Go to beginning of string
[.>>]                Output remaining characters
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.