প্রিফিক্স নোটেশন পোস্টফিক্স নোটেশন


19

দাবি অস্বীকার: না, এটি কোনও স্ট্রিংকে বিপরীত করা জোক চ্যালেঞ্জ নয়।

কার্য

সমর্থন করার জন্য কেবল একটি অপারেশন রয়েছে: বিয়োগ ( -)।

আপনার সমর্থন করার জন্য কেবল দুটি পরমাণু রয়েছে: শূন্য ( 0) এবং একটি ( 1)।

এখানে, উপসর্গ চিহ্নটি -ABপোস্টফিক্স সংকেতের সমান AB-, কোথায় Aএবং Bএক্সপ্রেশন রয়েছে।

আপনার কাজটি হ'ল (পুনরাবৃত্তভাবে) উপসর্গের স্বরলিপিতে কোনও অভিব্যক্তিটিকে পোস্টফিক্স স্বরলিখনের সমতুল্য রূপান্তর করতে।

সংজ্ঞা

উপসর্গ সংকেত মধ্যে একটি অভিব্যক্তি নিম্নলিখিত ব্যাকরণ দ্বারা উত্পাদিত:

S > -SS
S > 0
S > 1

পোস্টফিক্স স্বরলিপিতে একটি অভিব্যক্তি নিম্নলিখিত ব্যাকরণ দ্বারা উত্পাদিত হয়:

S > SS-
S > 0
S > 1

উদাহরণ

Prefix notation:  --01-0-01
Parentheses:      -(-01)(-0(-01))
Convert:          (01-)(0(01-)-)-
Postfix notation: 01-001---

বিধি এবং স্বাধীনতা

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

পরীক্ষা ক্ষেত্রে

Input       Output
1           1
0           0
-01         01-
-10         10-
--01-0-01   01-001---

টেডেস কেস ক্রেডিট দাদার কাছে


1
দয়া করে আরও কয়েকটি পরীক্ষার মামলা যুক্ত করতে পারেন?
শেগি

@ শেগি আপনি কি ধরণের টেস্টকেস পছন্দ করবেন?
ফাঁস নুন

@ ল্যাকিয়ুনুন আমার উত্তরের সর্বশেষতম সংস্করণে যেমন করা হয়েছে তেমনি পুনরুক্তিকারী হিসাবে ইনপুট এবং আউটপুট নেওয়া কি ঠিক আছে?
L3viathan

@ L3viathan আমি মনে করি তাই ...
লিকি নুন

উত্তর:


12

ব্রেনফাক , 32 বাইট

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

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

আমি @অপারেশন হিসাবে ব্যবহার করেছি , কারণ এর কোড পয়েন্ট ()৪) সুবিধাজনক। U3 * 85 + 1 = 256 = 0 ব্যবহার করে একই বাইট গণনা দিয়েও সম্ভব।

ব্যাখ্যা

টেপটি স্ট্যাক হিসাবে ব্যবহৃত হয়। মূল লুপের প্রতিটি পুনরাবৃত্তিতে, ডেটা পয়েন্টারটি স্ট্যাকের শীর্ষের ডানদিকে দুটি ঘর শুরু করে।

,[                Take input and start main loop
  [->++++<<+>]    Push input, and compute 4*input
  >[              If 4*input is nonzero (and thus input is not @):
    [-]<<           Zero out this cell and move to top of stack
    [.[-]<]         Pop from stack and output until \0 is reached
  ]
  >,              Move pointer into the correct position.  If input was @, the earlier > pushed \0 onto the stack.
]

6

রেটিনা , 37 30 29 বাইট

M!`-*.
+m`^-(.*)¶(\d.*)
$1$2-

এটি অনলাইন চেষ্টা করুন! শর্তাবলী সর্বদা একটি অঙ্ক দিয়ে শুরু হয় তা বুঝতে পেরে 7 বাইট সংরক্ষণ করা হয়েছে, সুতরাং আমাকে ম্যাচটি আর -কোনও সীমাবদ্ধ করতে হবে না (আগে এটি দুটি শর্ত অনুসরণ করার একমাত্র একমাত্র গ্যারান্টিযুক্ত ছিল)। -তাদের নিজস্ব লাইনে s না রেখে 1 বাইট সংরক্ষণ করা হয়েছে । উদাহরণস্বরূপ, -01হয়ে যায় -0¶1যা পরে প্রতিস্থাপন করা হয় 01-। এখন, আমি যদি আছে --010অর্থাত --0¶1¶0তারপর আমি ভেতরের পরিবর্তন করতে চান -0¶1করতে 01-যাতে আমি প্রতিস্থাপন করতে পারেন -01-¶0সঙ্গে 01-0-, কিন্তু এটি আসলে কোন ব্যাপার না যা দুই -গুলি আমি অপসারণ, তাই আমি লাইনের শুরুতে সরান হিসাবে, এটি পরীক্ষা করা সহজ।


আমি মনে করি এই আপনার কিছু :) হল
লিও

@ লিও সাধারণভাবে কাজ করে না, যেমন -0-0-00হওয়া উচিত 0000---
নীল

আপনি ঠিক বলেছেন, দুঃখিত। আমার আরেকটি ধারণা আছে তবে এটি সম্পূর্ণ আলাদা, তাই আমি এটি একটি নতুন উত্তর হিসাবে পোস্ট করব
লিও

1
@ লিও আমি এখন আমার কিছু পেয়েছি ...
নীল

1
@ লিও আমার সর্বশেষ গল্ফের সাথে আমরা বেঁধেছি!
নীল

6

হাস্কেল , 62 59 বাইট

f(x:r)|x>'-'=([x],r)|(a,(b,c))<-f<$>f r=(a++b++"-",c)
fst.f

এটি অনলাইন চেষ্টা করুন! ব্যবহার: fst.f $ "--01-0-01"0এবং 1চরিত্রের চেয়ে বড় যে নির্বিচারে অক্ষর হতে পারে -

সম্পাদনা করুন: -৩ বাইট জাগরবকে ধন্যবাদ!

ফাংশনটি fপুনরাবৃত্তভাবে একটি এক্সপ্রেশনকে পার্স করে এবং পোস্টফিক্স স্বরলিপি এবং বাকী স্ট্রিংয়ে এই অভিব্যক্তির একটি দ্বিগুণ ফিরিয়ে দেয়, সাধারণ ব্যাকরণ অনুসরণ করে যা থেকে বৈধ উপসর্গ-প্রকাশগুলি তৈরি করা যায়:

<exp> ::= - <exp> <exp> | 0 | 1

aইনপুট স্ট্রিংয়ের প্রথম অক্ষরটি যদি বৃহত্তর হয় তবে -আমরা পারমাণবিক এক্সপ্রেশনে থাকি এবং অক্ষর aএবং বাকী ইনপুট স্ট্রিং সহ একটি স্ট্রিংয়ের টুপল ফিরে পাই ।

আমরা যদি একটি পাই তবে -দুটি এক্সপ্রেশনকে বিশ্লেষণ করা দরকার। এই অর্জন করা সম্ভব (a,x)<-f rপ্রথম অভিব্যক্তি পেতে aএবং তারপর বাকি স্ট্রিং বিশ্লেষণ xআবার (b,c)<-f xদ্বিতীয় অভিব্যক্তি পেতে bএবং চূড়ান্ত বাকি স্ট্রিং c(a,(b,c))<-f<$>f rঠিক এটি করে কারণ <$>টিপলসটিতে একটি ফাংশন দুটি একটি টিউপলের দ্বিতীয় উপাদানকে ম্যাপ করে যখন তিন বাইটের চেয়ে কম হয় (a,x)<-f r,(b,c)<-f x। উভয় এক্সপ্রেশন এবং বাকি স্ট্রিং প্রাপ্তির পর এক্সপ্রেশন ঘনিভূত হয় এবং একটি "-" যোগ করা হয়: (a++b++"-",c)


1
আপনি কেসগুলি একত্রিত করে 3 বাইট সংরক্ষণ করতে পারেন:f(x:r)|x>'-'=([x],r)|(a,(b,c))<-f<$>f r=(a++b++"-",c)
জাগারব

@ জগারব ধন্যবাদ! কোনও কারণে আমি কেবল f(x:r)|x<'0',(a,(b,c))<-f<$>f r=(a++b++"-",c)|1<3=([x],r)তখনই বিবেচনা করি যখন আমি উভয় ক্ষেত্রে সম্মিলিত একটি সংস্করণ অনুসন্ধান করি যা দীর্ঘকাল বাইট হয়।
লাইকনি

5

হাস্কেল, 54 বাইট

v f""=""
v f(a:s)=last(v.v:[id|a>'-'])((a:).f)s
h=v h

ফাংশনটি vএকটি স্ট্রিং এবং একটি ফাংশন নেয়, প্রাথমিক উপ-এক্সপ্রেশনটিকে পুনরায় সাজায়, তারপরে সমস্ত কিছু পুনরায় সাজানো না হওয়া পর্যন্ত স্ট্রিংয়ের বাকী অংশগুলিতে ফাংশনটি প্রয়োগ করে। কল স্ট্যাক এবং ফাংশন আর্গুমেন্ট একসাথে কী এক্সপ্রেশনটি পার্স করা হচ্ছে তা ট্র্যাক করে। ফাংশনটি hচ্যালেঞ্জের জবাব দেয়, এবং কেবল vডামি প্রথম যুক্তি হিসাবে নিজেকে বলা হয়।


1
কি দারুন! (1) এটি কেবল 53, আপনার চূড়ান্ত নিউলাইন গণনা করার দরকার নেই। (২) প্রথম লাইনটি v f l=lআপনি দ্বিতীয় স্থানান্তরিত করলে সংক্ষিপ্ত করা যেতে পারে।
janrjan জোহানসেন

1
আমার মনে হয় না যে আপনার একাধিক সম্পূর্ণ ভাব প্রকাশ করার দরকার আছে, তাই আপনি বেনামে ফাংশনটি ব্যবহার করে একটি বাইট সংরক্ষণ করতে পারেন v id
janর্জন জোহানসেন

1
আসলে প্রথম লাইনটি বৈধ ইনপুটটিতে কখনই ডাকা হয় না, তাই আপনি কেবল এটি মুছতে পারেন।
janর্জন জোহানসেন

1
প্রহরীগুলিতে বিভক্ত হওয়া মনে হয় lastকৌতুকটি এক বাইট দ্বারা হারিয়েছে ।
janrjan জোহানসেন

4

পার্ল 5 , 57 বাইট

sub f{"@_"=~s/x((?0)|.)((?0)|.)/my$n=$2;f($1).f($n).x/re}

আমি xপরিবর্তে অপারেটর হিসাবে ব্যবহার করি -(ট্রাইআইটিঅনলাইন লিংক বেলো দেখুন)।

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

ব্যাখ্যা:
/x((?0)|.)((?0)|.)/ পুনরাবৃত্তভাবে একটি সম্পূর্ণ অভিব্যক্তি মেলে: একটি xসূচনা হয়, তারপরে একটি অভিব্যক্তি (?0)(এটি একটি পুনরাবৃত্তি কল) বা একটি পরমাণু ( .), এর পরে অন্য এক্সপ্রেশন-বা-পরমাণু হয়।
তারপরে আমার দ্বিতীয় প্রকাশ / পরমাণু ( my$n=$2;) সংরক্ষণ করতে হবে কারণ অন্যথায় পুনরাবৃত্ত কলগুলি ওভাররাইড করবে।
ফাংশন তারপর যাও recursively প্রথম অভিব্যক্তি (চালু বলা হয় f($1),) তারপর দ্বিতীয় f($n), এবং xশেষে যোগ করা হয় ( .x)।


4

পাইথন 3, 117 112 105 100 98 76 62 61 59 বাইট

def p(s):x=next(s);yield from[x]*(x>"-")or[*p(s),*p(s),"-"]

পরিবর্তণের:

  • যেখানে সম্ভব লাইনব্রেকগুলি সরানো হয়েছে (-5 বাইট)
  • পূর্ণ ফাংশনের পরিবর্তে ল্যাম্বদা (-7 বাইট, ধন্যবাদ @ দাদা)
  • আর নেই (-5 বাইট, ধন্যবাদ @ লিকি নুন)
  • অতিমাত্রায় গল্ফিং পূর্বাবস্থায় ফিরিয়ে আনুন (-২ বাইট, ধন্যবাদ @ লাকি নুন)
  • পরিবর্তে বিশ্বব্যাপী তালিকায় কাজ করুন (-22 বাইট)
  • আসলে, এর পরিবর্তে পুনরাবৃত্তকারীদের উপর কাজ করা যাক (-14 বাইট)
  • পরিবর্তন !=করার জন্য >(-1 বাইট, @ovs 'প্রস্তাবনা থেকে অনুলিপি করেছে)
  • অলস মূল্যায়নের কৌশল (-২ বাইট, ধন্যবাদ @ ওওএস)

এটি এর মতো ব্যবহার করুন:

>>> list(p(iter("--01-0-01")))
['0', '1', '-', '0', '0', '1', '-', '-', '-']


2
lambda x:p(x)[0] সম্ভবত আপনার প্রতিস্থাপন করতে পারে f ফাংশন পারে।
দাদা

1
আপনার দরকার নেই else , মিথথিক্স।
লিকি নুন

1
থাকার দেয় d="-"সত্যিই বাইট সংরক্ষণ করবেন?
লিকি নুন

1
def p(s):x=next(s);yield from[x]*(x>"-")or[*p(s),*p(s),"-"]59 বাইট
ovs জন্য

3

পাইথ, 20 বাইট

L+&-hbTsyM.-Btbytbhb

এটি এমন একটি ফাংশন তৈরি করে yযা প্যারামিটার হিসাবে একটি স্ট্রিং আশা করে।

এটি অনলাইনে ব্যবহার করে দেখুন: বিক্ষোভ বা পরীক্ষার স্যুট

ব্যাখ্যা:

ফাংশনটি yপ্রথম উপসর্গের এক্সপ্রেশনটিকে পার্স করে এবং পোস্টফিক্স এক্সপ্রেশনে রূপান্তরিত করে। সুতরাং যদি এটির মতো বলা হয় তবে এটি y"10"কেবল ফিরে আসবে 1

L+&-hbTsyM.-Btbytbhb
L                      define a function y(b), that returns:
   -hbT                   remove the chars "10" from the first char b
                          (T=10, and - will convert a number to a string)
  &                       if this gives the empty string (a falsy value)
 +                hb         then append b[0] to it and return it
                             (so this will parse a digit 0 or 1 from the string)
  &                       otherwise (the first char is a -)
               ytb           parse the first prefix expression from b[1:]
                             (recursive call)
          .-Btb              remove this parsed expression bifurcated from b[1:]
                             this gives a tuple [b[1:], b[1:] without first expr]
        yM                   parse and convert an expression from each one
       s                     join the results
 +                hb         and append the b[0] (the minus) to it and return

2

রেটিনা , 34 31 29 বাইট


;
-;
¶
+`¶(.+);(.+)
$1$2-
;

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

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


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