প্রথম বন্ধনীযুক্ত ইনফিক্সে পানফিক্স


16

কাইলথুলগ ক্রিস প্রিসির একটি ভাষা যা ইনফিক্স নোটেশনের সমস্যাটিকে পানফিক্স বলে যা সমাধান করে তা সমাধান করার চেষ্টা করে :

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


উপসর্গ বা পোস্টফিক্সের অসামান্যতার সাথে আপনি কীভাবে ইনফিক্স স্বরলিপিটির সুবিধা পাবেন? তিনটি অবশ্যই ব্যবহার করুন!

=y=+*3*x*+1+=

আরও আনুষ্ঠানিকভাবে, +একটি অপারেটর হতে দিন aএবং bভাব প্রকাশ করুন। তারপরে (a+b)একটি বৈধ (প্রথম বন্ধনীযুক্ত) ইনফিক্স এক্সপ্রেশন, সেই অভিব্যক্তির প্যানফিক্স উপস্থাপনাটি +a+b+যেখানে সংক্ষিপ্ত অবস্থানটি উপসংহারকে উপস্থাপন করে ।

আপনার লক্ষ্যটি হল একটি প্যানফিক্স স্ট্রিং নেওয়া এবং একে সম্পূর্ণ বন্ধনীযুক্ত ইনফিক্সে রূপান্তর করা:

(y=((3*x)+1))

সরলতার জন্য, আমরা নিম্নলিখিত পরিবর্তনগুলি করব:

  • অপারেটরগুলিতে কেবল দুটি অনন্য অক্ষর থাকতে পারে (আপনি যে কোনও চয়ন করতে পারেন, তবে এখানে আমি ব্যবহার করব *এবং +)।
  • এখানে কেবল একটি আক্ষরিক রয়েছে, যা অন্য একটি স্বতন্ত্র চরিত্র নিয়ে গঠিত (আপনি যে কোনও চয়ন করতে পারেন, তবে আমি এখানে ব্যবহার করব _)।
  • ইনপুটটি একটি সুগঠিত পানফিক্স এক্সপ্রেশন হবে।

জন্য জটিলতা , আমরা নিম্নলিখিত পরিবর্তন করে নেব:

  • অপারেটরগুলি কেবল একটি নয়, কোনও ধনাত্মক সংখ্যক অক্ষর নিয়ে গঠিত ।

এটি চ্যালেঞ্জটিকে আরও জটিল করে তোলে কারণ অপরিহার্যভাবে অপারেটর অক্ষরের একটি প্রদত্ত স্তরকে বাকী স্ট্রিং না দেখে পার্টিশন করা যায় তা আপনি নির্ধারণ করতে পারবেন না।

চ্যালেঞ্জের জন্য এখানে একটি রেফারেন্স বাস্তবায়ন , @ ব্যবহারকারী ২০২২২৯ এর সৌজন্যে।

পরীক্ষার কেস

format: input -> output
+*+_*+_*+++_+*+_*+_*+++ -> ((_*+_)+(_+(_*+_)))
**++*+***++_+_++_+*++*+***_*++*+*****_**_*_*** -> ((((_+_)+_)*++*+***_)*(_*(_*_)))
***_**_***_* -> ((_**_)*_)
+_+_+ -> (_+_)
*+*+++**+***+++++_*+*+++**+***+++++_*+*+++**+***+++++ -> (_*+*+++**+***+++++_)
*++++*+*_*_*+*+++****+_++****+_++****++*+*+++_*+++ -> (((_*_)+*+(_++****+_))*+++_)
+**+_*+_*+*_*+*_*+*_+*_+**+ -> (((_*+_)*_)+(_*(_+*_)))
+**+++++_+++++_+++++*_*+*+_++++++_+++++_+++++++* -> (((_+++++_)*_)+*(_+(_+++++_)))
+*+*+_+*+_+*+*_*+*_*+*+_+*+_+*+*+ -> (((_+*+_)*_)+(_*(_+*+_)))
**_**_**_*_****_* -> ((_*(_*(_*_)))*_)

আমি এই চ্যালেঞ্জটির জন্য ইনফিক্স স্ট্রিং উত্পন্ন করতে এই প্রোগ্রামটি ব্যবহার করেছি (পানফিক্সে রূপান্তর করা তুচ্ছ, তবে বিপরীতটি নয়)।




6
প্রস্তাবিত পরীক্ষা মামলা: **_**_**_*_****_*। আমি যে উত্তরগুলি পরীক্ষা করেছি সেগুলি এই সমস্ততে ব্যর্থ হয়েছে।
নাইট্রডন

1
আমার আউটপুটে অতিরিক্ত স্থান থাকতে পারে, যেমন (_ + _)?
টন হসপেল

2
@ টনহোস্পেল শিওর
ফল

উত্তর:


6

প্রোলোগ (এসডাব্লুআই) , 194 16 বাইট

0 থেকে এই টিপটি ব্যবহার করে পুরো 31 বাইট সংরক্ষণ করা হয়েছে !

[C|T]/O/R:-C\=x,(T/P/R,concat(C,P,O);O=C,R=T).
[x|R]-x-R.
L-X-R:-L/O/A,A-Y-B,B/O/C,C-Z-D,D/O/R,atomics_to_string(['(',Y,O,Z,')'],X).
X^P:-string_chars(X,L),L-P-[].

অপারেটর ^তার বাম আর্গুমেন্টের জন্য একটি প্যানফিক্স এক্সপ্রেশন যুক্ত একটি স্ট্রিং নেয় এবং তার ডান আর্গুমেন্টটিকে সম্পর্কিত প্যারেন্টেসাইজড ইনফিক্স এক্সপ্রেশন যুক্ত একটি স্ট্রিংয়ে সেট করে। এটি xজায়গায় আক্ষরিক হিসাবে ব্যবহার করে _

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

ব্যাখ্যা

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

ব্যাখ্যায় এই সামান্য উজ্জ্বল সংস্করণ ব্যবহার করা হয়েছে:

oper([C|T],O,R) :- C\=x, oper(T,P,R), concat(C,P,O).
oper([C|T],C,T).

expr([x|R],x,R).
expr(L,X,R) :- oper(L,O,A), expr(A,Y,B), oper(B,O,C), expr(C,Z,D), oper(D,O,R),
               atomics_to_string(['(',Y,O,Z,')'],X).

parenthesize(X,P) :- string_chars(X,L), expr(L,P,[]).

আমাদের মূল উত্পাদনটি parenthesize, যা একটি প্যানফিক্স এক্সপ্রেশনটি Xস্ট্রিং হিসাবে গ্রহণ করে এবং সংশ্লিষ্ট প্যারেন্টাইসাইজড ইনফিক্স এক্সপ্রেশনটিকে Pস্ট্রিং হিসাবে প্রেরণ করে । এটি string_charsইনপুট স্ট্রিংকে অক্ষরের তালিকায় রূপান্তর করতে ব্যবহার করে এবং তারপরে এটিকে সহজভাবে পাস করে expr

exprঅক্ষরের একটি তালিকা লাগে L, প্রথম panfix অভিব্যক্তি এটা খুঁজে বের করে parses Lএবং আলাদা সমতুল্য পাঠায় Xএবং অক্ষর একটি তালিকা বাকি R। সম্ভাব্য দুটি ধরণের অভিব্যক্তি রয়েছে:

  • যদি এর প্রথম চরিত্রটি Lহয় xতবে প্রকাশটি হয় xএবং বাকীটি সমস্ত কিছু পরে থাকে x
  • অন্যথায়, একটি অপারেটরকে পার্স করুন O( operনীচে দেখুন); একটি অভিব্যক্তি পার্স Y; Oআবার পার্স ; অন্য প্রকাশকে পার্স করা Z; এবং Oতৃতীয়বার পার্স করুন । বাকিটি তৃতীয় উদাহরণের পরে সমস্ত কিছু O। অভিব্যক্তি যোগদান ফল Y, Oএবং Z, প্রথম বন্ধনী দ্বারা বেষ্টিত একটি স্ট্রিং মধ্যে।

operঅক্ষরগুলির একটি তালিকা গ্রহণ করে, যেখানে প্রথম অক্ষরটি রয়েছে Cএবং বাকিগুলি রয়েছে T; এটি একটি অপারেটরকে পার্স করে (যেমন এক বা একাধিক অপারেটরের অক্ষরের একটি রান) এবং অপারেটর Oএবং বাকী অক্ষরের তালিকার বাইরে পাঠায় R। অপারেটর গঠনের জন্য চরিত্রটি Cঅবশ্যই অন্য কিছু হতে পারে x; এছাড়াও, হয়

  • অপারেটর Pঅবশ্যই বাকী অংশ Tসহ পার্সেবল হতে হবে R; এই ক্ষেত্রে, Oএর সংযুক্তকরণের হয় Cএবং P; বা,
  • Oএকক চরিত্র C; এই ক্ষেত্রে, Rঠিক হয় T

একটি কাজের উদাহরণ

+*+x+x++*x+*উদাহরণস্বরূপ ইনপুটটি নেওয়া যাক ।

  • আমরা একটি অভিব্যক্তি পার্স করতে চাই +*+x+x++*x+*। এটি দিয়ে শুরু হয় না x, তাই আমরা শুরু থেকেই কোনও অপারেটরকে পার্স করি।
  • operযত বেশি সম্ভব অপারেটরকে বিশ্লেষণ করবে, তাই আমরা চেষ্টা করব +*+
    • এরপরে আমরা একটি অভিব্যক্তি পার্স করি x+x++*x+*। এই হতে হবে x
    • এখন +*+থেকে , একই অপারেটরটিকে, পার্স করার চেষ্টা করি +x++*x+*। তবে, এটি ব্যর্থ হয়
  • সুতরাং আমরা ব্যাকট্র্যাক করি এবং +*পরিবর্তে অপারেটরটিকে বিশ্লেষণ করার চেষ্টা করি ।
    • আমরা থেকে একটি অভিব্যক্তি বিশ্লেষণ +x+x++*x+*। এটি দিয়ে শুরু হয় না x, সুতরাং আমাদের একটি অপারেটরকে পার্স করা দরকার।
    • একমাত্র সম্ভাবনা +
    • এখন থেকে একটি subexpression পার্স x+x++*x+*। এই হতে হবে x
    • এখন +থেকে আবার পার্স করুন +x++*x+*
    • এখন থেকে অন্য একটি সূক্ষ্ম এক্সপ্রেশন পার্স করুন x++*x+*। এই হতে হবে x
    • শেষ +পর্যন্ত আবার পার্স করুন ++*x+*
    • প্রকাশটি সাফল্যের সাথে বিশ্লেষণ করা হয়েছে। আমরা স্ট্রিং ফিরে (x+x)
  • পূর্ববর্তী পুনরাবৃত্তির স্তরে ফিরে আমরা +*আবার অপারেটরটিকে পার্স করব +*x+*
  • এখন থেকে অন্য একটি সূক্ষ্ম এক্সপ্রেশন পার্স করুন x+*। এই হতে হবে x
  • শেষ +*পর্যন্ত আবার পার্স করুন +*
  • প্রকাশটি সাফল্যের সাথে বিশ্লেষণ করা হয়েছে। আমরা স্ট্রিং ফিরে ((x+x)+*x)

যেহেতু আর কোনও অক্ষর অবশিষ্ট নেই, তাই আমরা সাফল্যের সাথে অনুবাদটি অনুবাদ করেছি।


4

পার্ল, 78 60 58 57 50 বাইট

+1জন্য অন্তর্ভুক্তp

এর 1জন্য +এবং এর 2জন্য ব্যবহার করে *(বা আসলে কোনও সংখ্যক কোনও অপারেটরের জন্য কাজ করে)

perl -pe 's/\b((\d+)((?1)|_)\2((?3))\2)\b/($3 $2 $4)/&&redo' <<< 22_22_22_2_2222_2

প্রদত্ত উদাহরণগুলি বনাম সুবিধাজনক পরীক্ষার জন্য আপনি এটি ব্যবহার করতে পারেন যা আপনার জন্য অনুবাদ এবং স্থান অপসারণ করে:

perl -pe 'y/+*/12/;s/\b((\d+)((?1)|_)\2((?3))\2)\b/($3 $2 $4)/&&redo;y/ //d;y/12/+*/' <<< "**_**_**_*_****_*"

3

পরিষ্কার , 200 192 189 বাইট

import StdEnv,Text
f"_"=["_"]
f l=["("+a+p+b+")"\\p<-[l%(0,i)\\i<-[0..indexOf"_"l]|endsWith(l%(0,i))l],t<-[tl(init(split p l))],n<-indexList t,a<-f(join p(take n t))&b<-f(join p(drop n t))]

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

অভ্যন্তরীণ ফলাফলের সাথে একটি সিঙ্গলটন ফাংশন fগ্রহণ, গ্রহণ Stringএবং ফিরিয়ে আনা হয়েছে [String]

কিছু ঝরঝরে জিনিস:

  • রেজেক্স ব্যবহার করে না
  • অপারেটরদের বাদে কোনও চরিত্রের সাথে কাজ করে_

3

রেটিনা 0.8.2 , 138 বাইট

.+
($&)
+`\((\d+)(_|((?<i>(?<i>\d+))|_(?<-i>\k<i>)+)+(?(i)(?!)))\1(_|((?<i>(?<i>\d+))|_(?<-i>\k<i>)+)+(?(i)(?!)))\1\)
(($2)$1($4))
\(_\)
_

এটি অনলাইন চেষ্টা করুন! লিঙ্কে দ্রুত পরীক্ষার কেস অন্তর্ভুক্ত রয়েছে। ব্যাখ্যা: রেজেক্স ইঞ্জিন ব্যাকট্র্যাকিং ব্যবহার করে স্ট্রিংটিকে টোকেনে বিভক্ত করতে থাকে যা পরে iভারসাম্যহীন গ্রুপ থেকে চাপানো বা পপ করা হয় । সর্বদা কমপক্ষে একজন অপারেটর সর্বদা প্রথম চলকটির আগে শুরুর দিকে ধাক্কা খায়। একটি ভেরিয়েবলের পরে, কমপক্ষে একটি অপারেটর পপ করা হয়, যার পর্যায়ে হয় একটি পুশ অপারেটর চালিত হয় বা অন্য কোনও ভেরিয়েবল বৈধ। অপারেটরগুলি নকলটিতে গোষ্ঠীতে ঠেলাঠেলি করে যাতে তারা সঠিকভাবে পপ করা যায়। উদাহরণ:

Input           Stack
Push *          * *
Push *++*+***   * * *++*+*** *++*+***
Push +          * * *++*+*** *++*+*** + +
Push +          * * *++*+*** *++*+*** + + + +
Variable _
Pop +           * * *++*+*** *++*+*** + + +
Variable _
Pop +           * * *++*+*** *++*+*** + +
Pop +           * * *++*+*** *++*+*** +
Variable _
Pop +           * * *++*+*** *++*+***
Pop *++*+***    * * *++*+***
Variable _
Pop *++*+***    * *
Pop *           *
Push *          * * *
Variable _
Pop *           * *
Push *          * * * *
Variable _
Pop *           * * *
Variable _
Pop *           * *
Pop *           *
Pop *

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


1
এটিও ব্যর্থ হয় **_**_**_*_****_*
ব্যবহারকারী 202729

@ ব্যবহারকারী202729 এখন কাজ করছেন?
নিল

@ নীল এটি এখন কাজ করছে, হ্যাঁ।
0urous

1

হাস্কেল , 167 166 বাইট

head.e
e('_':r)=["_",r]
e(x:r)=[x]%r
e _=[]
o%t@(c:r)|[x,u]<-e t,n<-length o,[y,v]<-e$drop n u,all((==o).take n)[u,v]=['(':x++o++y++")",drop n v]|p<-o++[c]=p%r
o%_=[]

এটি অনলাইন চেষ্টা করুন! ব্যবহারের উদাহরণ: head.e "**_**_**_*_****_*"ফলন ((_*(_*(_*_)))*_)। বাদে সমস্ত অক্ষর _অপারেটর হিসাবে ব্যাখ্যা করা হয়, _নিজেই একটি সনাক্তকারী চিহ্নিত করে।


0

পাইথন 3, 226 বাইট

from re import*
P=r'([*+]+)'+r'(\(.+?\)|_)\1'*2;R=lambda i,J=lambda i,o:i[:o]+sub(P,lambda o:'('+o[2]+o[1]+o[3]+')',i[o:],1),s=search:s(P,i)and R([J(i,o)for o in range(len(i))if s(P,J(i,o))or J(i,o)[0]+J(i,o)[-1]=='()'][0])or i

নামের একটি বেনামি ফাংশন সংজ্ঞায়িত করে R

অনলাইনে চেষ্টা করে দেখুন!


মনে রাখবেন যে আপনি ব্যতীত অন্য কোনও অক্ষর ব্যবহার করতে পারেন _*+; উদাহরণস্বরূপ এগুলি কেবল ব্যবহৃত হয়েছিল। আপনি নিজের রেজিক্সগুলি গল্ফ করার জন্য এটি ব্যবহার করতে সক্ষম হতে পারেন (উদাহরণস্বরূপ \dপরিবর্তে ব্যবহার করে [*+])।
ফলমূল Esolanging
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.