একটি স্ট্যাক বিড়াল প্রোগ্রাম ফ্ল্যাট করুন


13

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

  1. যখন একটি লুপ অন্য লুপ দিয়ে শুরু হয়, আমরা সামনের অভ্যন্তরীণ লুপটি বের করতে পারি: ((A)B)হয়ে যায় (A)(B)
  2. যখন একটি লুপ অন্য লুপের সাথে শেষ হয়, আমরা অন্তঃস্থ লুপটি শেষ পর্যন্ত বের করতে পারি: (B(A))হয়ে যায় (B)(A)
  3. খালি লুপগুলি, ()পুরোপুরি প্রোগ্রাম থেকে সরানো যায়। একটি তাত্পর্য হিসাবে (অন্যান্য নিয়মের সাথে একত্রে), ((A))সমতুল্য (A)

শুধুমাত্র নেস্টেড loops যে থাকবে ফর্ম হয় (A(B)C), যেখানে A, Bএবং Cঅ খালি আছে।

চ্যালেঞ্জ

আপনাকে একটি বৈধ স্ট্যাক বিড়াল প্রোগ্রাম দেওয়া হয়েছে এবং আপনার কাজটি উপরের ট্রান্সফর্মেশনগুলি ব্যবহার করে ফাঁকা ফাঁকা ফাঁকা রেখে যতটা সম্ভব নীচের নীড়ের স্তর হ্রাস করা।

একটি বৈধ স্ট্যাক বিড়াল প্রোগ্রাম ...

  • ... শুধুমাত্র চরিত্র নিয়ে গঠিত ()/\<>[]{}!"*+-:=ITX^_|
  • ... আয়না প্রতিসাম্য রয়েছে (যেমন \(]{}!{}[)/একটি বৈধ প্রোগ্রাম, তবে /|/তা নয়)।
  • ... সঠিকভাবে মিলেছে হয়েছে এবং নেস্টেড ()এবং {}( [], <>এবং \/যদিও তারা মিরর প্রতিসাম্য প্রয়োজন কারণে জোড়া প্রদর্শিত হবে অগত্যা যথারীতি মিলেছে করা প্রয়োজন হবে না)।

আপনি ইনপুট হিসাবে স্ট্রিং বা অক্ষরের একটি তালিকা নিতে পারেন, তবে আউটপুট একই বিন্যাসে উপস্থাপন করা দরকার।

আপনি কোনও প্রোগ্রাম বা একটি ফাংশন লিখতে পারেন এবং ইনপুট গ্রহণ এবং আউটপুট সরবরাহের আমাদের মানক পদ্ধতির কোনওটি ব্যবহার করতে পারেন । নোট করুন যে এই ফাঁকগুলি ডিফল্টরূপে নিষিদ্ধ করা হয়েছে।

এটি , তাই সংক্ষিপ্ততম বৈধ উত্তর - বাইটগুলিতে মাপা - জয় w

পরীক্ষার কেস

পরীক্ষার কেস দুটি খালি লাইন দ্বারা পৃথক পৃথক (ইনপুট এবং আউটপুট) দুটি লাইন হয়। মনে রাখবেন যে একটি আউটপুট খালি। আপনাকে খালি ইনপুটটিও সমর্থন করতে হবে (যার ফলে খালি আউটপুট আসতে হবে)।

(((=+|+=)))
(=+|+=)

({(=+|+=)})
({(=+|+=)})

((\)/)I(\(/))
(\)(/)I(\)(/)

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


((<|>((X((T)))[_]))\^/(([_](((T))X))<|>))
(<|>)(X)(T)([_])(\^/)([_])(T)(X)(<|>)

কেবল নিশ্চিত হওয়ার জন্য, আমাদের যে লুপগুলি বের করতে হবে তা কেবলমাত্র প্রথম বন্ধনী দ্বারা নির্দেশিত (), সুতরাং একটি ইনপুট {{A}B}যেমন থাকবে তেমন থাকবে এবং তাও সরানো হবে না {A}{B}?
কেভিন ক্রুইজসেন

@ কেভিন ক্রুইজসেন হ্যাঁ, রূপান্তরটি কেবলমাত্র- (...)টাইপ লুপগুলির জন্য বৈধ ।
মার্টিন এন্ডার

চূড়ান্ত পরীক্ষার ক্ষেত্রে, \^/বন্ধনী ভিতরে কেন ?
কেভিন ক্রুইজসেন

1
@ কেভিন ক্রুইজসেন আপনার নিষ্কাশনের পরে এগুলি বাহ্যতম বন্ধনী (<|>((X((T)))[_]))এবং (([_](((T))X))<|>)
মার্টিন এন্ডার

1
আহ আমি দেখি. সুতরাং নিয়ম 1 এবং 2 পরবর্তী উভয় কারণে ((A)B(C))হয়ে যাবে (A)(B)(C): ((A)B(C))(A)(B(C))(বিধি 1) → (A)(B)(C)(বিধি 2)।
কেভিন ক্রুইজসেন

উত্তর:


6

রেটিনা 0.8.2 , 113 107 67 66 বাইট

+`\(\)|(\()?(\(((\()|(?<-4>\))|[^()])*(?(4)@)\))(?(1)|(\)))
$5$2$1

এটি অনলাইন চেষ্টা করুন! সহ 3 @MartinEnder 4 বাইট সংরক্ষণ ধন্যবাদ। ব্যাখ্যা:

+`

কোনও মিল না হওয়া পর্যন্ত বারবার প্রতিস্থাপন প্রয়োগ করুন।

\(\)|

একটি খালি লুপটি মিলান (কোনও ক্ষেত্রে কিছুই ধরা পড়েনি তাই বিকল্পটি কেবল এটি মুছে ফেলে) বা:

(\()?

Ptionচ্ছিকভাবে মেলে ক (। এটি 1 টির সাথে মিলছে তবে এটি ক্যাপচার হয়েছে, তবে তা না মিললে।

(\(

গ্রুপ 2 তে ম্যাচের মূল সংস্থাটি ক্যাপচার করুন এবং ম্যাচ ক (

(
 (\()
|
 (<-4>\))
|
 [^()]
)*

বারে বারে একটির সাথে মেলে (, এটিকে গ্রুপ 4 এ ক্যাপচার করুন, বা এ ), গ্রুপ 4 থেকে ক্যাপচার সরিয়ে ফেলুন (সেখানে না থাকলেও ব্যর্থ হচ্ছে), বা অন্য কিছু।

(?(4)@)

নিশ্চিত করুন যে গ্রুপ 4-এ কোনও অতিরিক্ত ক্যাপচার নেই।

\))

অপরটির সাথে গ্রুপ 2 ক্যাপচার করুন )

(?(1)|(\)))

যদি ক্যাপচার গ্রুপ 1 খালি ছিল, তবে একটি )ক্যাপচার গ্রুপে ক্যাপচার করুন 5 (সুতরাং ঠিক এই দুটি দলের মধ্যে একটিতে ক্যাপচার থাকবে)।

$5$2$1

গ্রুপ 1 বা 5 গ্রুপের দুটিতে ক্যাপচার করা বন্ধনীটি 2 গ্রুপের অন্য দিকে সরিয়ে ফেলুন এটি কোন পাশের সাথে মিলছে তার উপর নির্ভর করে অভ্যন্তরীণ লুপটিকে সামনের বা বাইরের লুপের প্রান্তে নিয়ে যাওয়ার প্রভাব ফেলে has


2

স্ট্যাক্স v1.0.3 +, 76 65 64 62 58 বাইট সিপি 437

îÜ•$o,Γ{í]Üf╒9♦╛üΣóç*\$ñ₧└ΦJ♠¥c╥jóu≥3E.╘ⁿ◄◘W₧<¶┼7úê╟┴zç↨aG

প্যাকযুক্ত যখন 70 বাইট,

{{.((:/Yc{Z{40=+_41=-c^Ci~^Fdy,,\32&jEa:{a:{a4l$c}Md}X!:Rx!:Rc.()z:rgp

চালান এবং অনলাইন ডিবাগ!

ব্যাখ্যা

{.((:/Yc{Z{40=+_41=-c^Ci~^Fdy,,\32&jEa:{a:{a4l$c}Mdএকটি ব্লক যা A((B)C)Dচারটি ভাগে বিভক্ত হয়ে রূপান্তর করে A(B)(C)D

X!:Rx!:Rইনপুট স্ট্রিং (ধাপ 1) এ ব্লকটি কার্যকর করে, তারপরে স্ট্রিং প্রতিফলিত করে (স্ট্যাক্সের স্ট্রিং প্রতিবিম্ব বোঝায় স্ট্রিংকে উল্টানো এবং পরিবর্তিত (অনুবাদ করা) এর (<[{/সাথে (থেকে) \}]>)) এবং প্রাপ্ত স্ট্রিংয়ের ব্লকটি কার্যকর করে এবং তারপরে এটি প্রতিফলিত করে (ধাপ ২). পদক্ষেপ 2 মূলত রূপান্তরিত (A(B))হয় (A)(B)

c.()z:r সমস্ত খালি লুপগুলি সরান (পদক্ষেপ 3)।

gpএকটি জেনারেটর যা কোনও পুনরাবৃত্তির স্থির বিন্দু খুঁজে পায়। এই ক্ষেত্রে স্ট্রিংটি 3-পদক্ষেপের প্রক্রিয়াটির সাথে পুনরাবৃত্তি করা হয় যতক্ষণ না এটি আর পরিবর্তন হয় না।

অন্তর্নির্মিত আউটপুট।


1

পাইথন 3 , 226 223 212 206 বাইট

ঠিক আছে, এখানে এমন ভাষায় এটি সমাধান করার চেষ্টা করা হচ্ছে যা পুনরাবৃত্তিকারী রেজেক্সকে সমর্থন করে না।

lambda s:g(g(s,*'()'),*')(').replace('()','')
def g(s,t,u):
 m,*a={},;i=v=0
 for c in s:
  i+=1;a+=[i]*(c==t)
  if c==u:*a,x=a;m[x]=i;v=m.get(x+1)
  if v:return g(s[:x]+s[x+1:v]+t+s[v:],t,u)
 return s[::-1]

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

সম্পাদনা:

  • রি-ফ্যাক্টর [::-1]6 বাইট, Mr.Xcoder ধন্যবাদ সংরক্ষণ করুন।

gফাংশন মৌলিক বিল্ডিং ব্লক, যার মধ্যে একটি সংঘটন খোঁজে হয় ((A)B), পরিবর্তন এটি (A)(B), তারপর নিজেই ফলাফলের জন্য প্রযোজ্য না হওয়া পর্যন্ত আর কোনো রূপান্তর করা সম্ভব।

প্রধান পদক্ষেপগুলি হ'ল:

  • ইনপুটটিতে gসাধারণত প্রয়োগ করুন।
  • gউল্টানো ইনপুট প্রয়োগ করুন। এই রানটি ))A(B(বিপরীত ইনপুটটিতে উপস্থিতি আবিষ্কার করে , যা কার্যকরভাবে পরিচালনা করে (A(B))
  • এর যেকোন ঘটনা সরিয়ে ফেলুন ()

সমস্যাটি হ'ল, gএত খারাপ নিয়ন্ত্রণ কাঠামো রয়েছে যে এক-লাইনের চেষ্টা করার ফলে এটি খারাপভাবে ফুলে উঠেছে, সুতরাং আমি মনে করি না যে এই সমাধানের ভিত্তিতে বড় উন্নতি সম্ভব।

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