আমি যখন এই বন্ধ প্রশ্নের শিরোনামটি দেখেছি তখন আমি ভেবেছিলাম এটি একটি আকর্ষণীয় কোড গল্ফ চ্যালেঞ্জের মতো দেখাচ্ছে। সুতরাং আমাকে এটি উপস্থাপন করুন:
চ্যালেঞ্জ:
একটি প্রোগ্রাম, অভিব্যক্তি বা সাবরুটিন যেটি, একটি আঙ্কিক অভিব্যক্তি দেওয়া লিখুন পোতা স্বরলিপি , মত 1 + 2
, আউটপুট একই অভিব্যক্তি পোস্টসাফিক্স স্বরলিপি , অর্থাত্ 1 2 +
।
(দ্রষ্টব্য: জানুয়ারির প্রথম দিকে একটি অনুরূপ চ্যালেঞ্জ পোস্ট করা হয়েছিল However তবে, আমি মনে করি এই পৃথক চ্যালেঞ্জকে ন্যায়সঙ্গত করার জন্য দুটি কাজই বিশদরূপে যথেষ্ট আলাদা। এছাড়াও, নীচে সমস্ত কিছু টাইপ করার পরে আমি কেবল অন্য থ্রেডটি লক্ষ্য করেছি, এবং আমি বরং বলছি) শুধু এটি সব ফেলে দিন।)
ইনপুট:
ইনপুট গঠিত একটি বৈধ পোতা আঙ্কিক অভিব্যক্তি নিয়ে গঠিত সংখ্যার (অ-নেতিবাচক পূর্ণসংখ্যার এক বা একাধিক দশমিক সংখ্যা ক্রমের হিসাবে প্রতিনিধিত্ব), সুষম প্রথম বন্ধনী একটি দলবদ্ধ subexpression ইঙ্গিত এবং চার পোতা বাইনারি অপারেটর +
, -
, *
এবং /
। এর যে কোনওটি স্থানের অক্ষরের একটি স্বেচ্ছাসেবী সংখ্যার দ্বারা পৃথক করা যেতে পারে (এবং পুরো ভাবটি ঘিরে রয়েছে), যা উপেক্ষা করা উচিত। 1
যারা প্রথাগত ব্যাকরণ পছন্দ করেন তাদের জন্য, এখানে একটি সাধারণ বিএনএফ-এর মতো ব্যাকরণ যা বৈধ ইনপুটগুলি সংজ্ঞায়িত করে। সংক্ষিপ্ততা এবং স্পষ্টতার জন্য, ব্যাকরণটিতে alচ্ছিক স্থানগুলি অন্তর্ভুক্ত করা হয় না, যা কোনও দুটি টোকেনের মধ্যে হতে পারে (একটি সংখ্যার মধ্যে অঙ্ক ব্যতীত):
expression := number | subexpression | expression operator expression
subexpression := "(" expression ")"
operator := "+" | "-" | "*" | "/"
number := digit | digit number
digit := "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
1 একমাত্র ক্ষেত্রে যেখানে স্পেসগুলির উপস্থিতি পার্সিংকে প্রভাবিত করতে পারে যখন তারা পরপর দুটি সংখ্যা পৃথক করে; তবে যেহেতু অপারেটর দ্বারা পৃথক নয় দুটি সংখ্যা বৈধ ইনফিক্স এক্সপ্রেশনে ঘটতে পারে না, বৈধ ইনপুটটিতে এই মামলাটি কখনই ঘটতে পারে না।
আউটপুট:
আউটপুট ইনপুট সমতুল্য একটি পোস্টফিক্স এক্সপ্রেশন হওয়া উচিত। আউটপুট অভিব্যক্তি, একমাত্র সংখ্যা এবং অপারেটরদের হওয়া উচিত একটি একক স্থান অক্ষর সংলগ্ন টোকেন প্রতিটি জোড়া মধ্যবর্তী নিম্নলিখিত ব্যাকরণ (যেখানে যেমন নেই শূণ্যস্থান অন্তর্ভুক্ত) 2 :
expression := number | expression sp expression sp operator
operator := "+" | "-" | "*" | "/"
number := digit | digit number
digit := "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
sp := " "
2 আবার সরলতার জন্য, number
এই ব্যাকরণে উত্পাদন নেতৃস্থানীয় শূন্যগুলির সাথে সংখ্যাকে স্বীকার করে, যদিও তারা নীচের বিধি দ্বারা আউটপুটে নিষিদ্ধ।
অপারেটর অগ্রাধিকার:
বন্ধনীগুলির অনুপস্থিতিতে, নিম্নলিখিত অগ্রাধিকার বিধিগুলি প্রয়োগ করা হয়:
- অপারেটার
*
এবং/
বেশী প্রাধান্য আছে+
এবং-
। - অপারেটর
*
এবং/
একে অপরের সমান নজরে আছে। - অপারেটর
+
এবং-
একে অপরের সমান নজরে আছে। - সমস্ত অপারেটর বাম-সহযোগী হয়।
উদাহরণস্বরূপ, নিম্নলিখিত দুটি এক্সপ্রেশন সমতুল্য:
1 + 2 / 3 * 4 - 5 + 6 * 7
((1 + ((2 / 3) * 4)) - 5) + (6 * 7)
এবং তাদের উভয়কেই নিম্নলিখিত আউটপুট প্রদান করা উচিত:
1 2 3 / 4 * + 5 - 6 7 * +
(এই সি ল্যাঙ্গুয়েজ হিসেবে এবং সবচেয়ে তা থেকে উদ্ভূত ভাষায় একই প্রাধান্য নিয়ম আছে। তারা সম্ভবত, বিধি আপনি প্রাথমিক স্কুলে শেখানো হয় অনুরূপ আপেক্ষিক প্রাধান্য জন্য সম্ভবত ছাড়া *
এবং /
।)
বিবিধ বিধি:
প্রদত্ত সমাধানটি যদি একটি অভিব্যক্তি বা সাবরুটিন হয় তবে ইনপুট সরবরাহ করা উচিত এবং আউটপুটটি একক স্ট্রিং হিসাবে ফিরে আসবে। যদি সমাধানটি সম্পূর্ণ প্রোগ্রাম হয় তবে এটি স্ট্যান্ডার্ড ইনপুট থেকে ইনফিক্স এক্সপ্রেশন সম্বলিত একটি লাইন পড়তে হবে এবং পোস্টফিক্স সংস্করণ সহ একটি লাইন স্ট্যান্ডার্ড আউটপুটে প্রিন্ট করা উচিত।
ইনপুট নম্বরগুলি নেতৃস্থানীয় শূন্য অন্তর্ভুক্ত থাকতে পারে। আউটপুট সংখ্যার নেতৃস্থানীয় শূন্য থাকতে হবে না (0 নম্বর বাদে, আউটপুট হিসাবে হবে
0
)।আপনি কোনওভাবেই অভিব্যক্তিটির মূল্যায়ন বা অনুকূলকরণ করবেন না বলে আশা করা যায়। বিশেষত, আপনাকে ধরে নেওয়া উচিত নয় যে অপারেটরগুলি অগত্যা কোনও সংঘবদ্ধ, পরিবর্তনকারী বা অন্যান্য বীজগণিত পরিচয় পূরণ করে। এটি হ'ল আপনার অবশ্যই ধরে নেওয়া উচিত নয় যে
1 + 2
সমান2 + 1
বা1 + (2 + 3)
সমান(1 + 2) + 3
।আপনি ধরে নিতে পারেন যে ইনপুটটিতে সংখ্যাগুলি 2 31 - 1 = 2147483647 এর বেশি নয় ।
এই বিধিগুলি সঠিকভাবে আউটপুটটিকে ইনপুট দ্বারা স্বতন্ত্রভাবে সংজ্ঞায়িত করা হয়েছে তা নিশ্চিত করার উদ্দেশ্যে are
উদাহরণ:
এখানে কিছু বৈধ ইনপুট এক্সপ্রেশন এবং সংশ্লিষ্ট আউটপুটগুলি ফর্মটিতে উপস্থাপন করা হয়েছে "input" -> "output"
:
"1" -> "1"
"1 + 2" -> "1 2 +"
" 001 + 02 " -> "1 2 +"
"(((((1))) + (2)))" -> "1 2 +"
"1+2" -> "1 2 +"
"1 + 2 + 3" -> "1 2 + 3 +"
"1 + (2 + 3)" -> "1 2 3 + +"
"1 + 2 * 3" -> "1 2 3 * +"
"1 / 2 * 3" -> "1 2 / 3 *"
"0102 + 0000" -> "102 0 +"
"0-1+(2-3)*4-5*(6-(7+8)/9+10)" -> "0 1 - 2 3 - 4 * + 5 6 7 8 + 9 / - 10 + * -"
(কমপক্ষে, আমি আশা করি যে এগুলি সব ঠিক আছে; আমি রূপান্তরটি হাতে হাতে করেছিলাম, যাতে ভুলগুলি ভ্রূণু হতে পারে))
কেবল স্পষ্ট করে বলতে গেলে, নিম্নলিখিত ইনপুটগুলি সমস্ত অবৈধ; আপনার সমাধানটি যদি তাদের দেওয়া হয় তবে তা বিবেচ্য নয় (যদিও, অবশ্যই উদাহরণস্বরূপ, একটি ত্রুটি বার্তা প্রদান করা অসম্পূর্ণ পরিমাণ স্মৃতি গ্রহন করে) এর চেয়ে সুন্দর:
""
"x"
"1 2"
"1 + + 2"
"-1"
"3.141592653589793"
"10,000,000,001"
"(1 + 2"
"(1 + 2)) * (3 / (4)"
1 2 3 4 + *
?
1 2 3 4 +
`1 + 2 + 3 + 4` অর্থ`