ইনফিক্স নোটেশন থেকে উপসর্গ নোটে রূপান্তর করুন


12

একটি গাণিতিক এক্সপ্রেশন দেওয়া হয়েছে, যার মধ্যে বন্ধনী ( ()), এক্সপোশনগুলি ( ^), বিভাগ ( /) এবং গুণ ( *), সংযোজন ( +) এবং বিয়োগ ( -) অপারেশনের ক্রমে) অন্তর্ভুক্ত থাকতে পারে

a ^ (2 / 3) * 9 * 3 - 4 * 6

উপসর্গ স্বরলিপি একই আউটপুট আউটপুট।

(- (* (* (^ a (/ 2 3)) 9) 3) (* 4 6))

আউটপুট পাশাপাশি ফাঁকা স্থানগুলি alচ্ছিক। আপনি ধরে নিতে পারেন যে সমস্ত অপারেটরগুলি বাম-সহযোগী এবং এক্সপ্রেশনটিতে সমস্ত সংখ্যার একক অঙ্কের পূর্ণসংখ্যা (অর্থাত্ [0-9])।

এটি একটি কোড গল্ফ চ্যালেঞ্জ, তাই সংক্ষিপ্ততম সমাধানটি জয়লাভ করে।


1
+ এবং - একই নজির, বা + এর চেয়ে বেশি -? অর্থাৎ, 3+4-5+6 = (((3+4)-5)+6)নাকি ((3+4)-(5+6))?
কিথ র্যান্ডাল

এছাড়াও, আপনি আপনার ক্রিয়াকলাপের তালিকার বিভাজন রেখে গেছেন।
PhiNotPi

আউটপুটে প্রথম বন্ধনী কী ?চ্ছিক?
Ali1S232

@KeithRandall *এবং /একই প্রাধান্য আছে, হিসাবে +AMD -
পিটার অলসন

@ গেজেট না, তারা নেই।
পিটার অলসন

উত্তর:


13

রুবি 1.9 - 134

%w[** / * + -].map{|o|String.send(:define_method,o){|n|"(#{o=='**'??^:o} #{self} #{n})"}}
puts eval gets.gsub(/\w/,'?\0').gsub ?^,'**'

খুব খারাপ, কিন্তু এটি কাজ করে:

$ echo 'a ^ (2 / 3) * 9 * 3 - 4 * 6' | ruby sol.rb
(- (* (* (^ a (/ 2 3)) 9) 3) (* 4 6))

3

পাইথন, 222 টি অক্ষর

class A:
 def __init__(s,x):s.v=x
for x in('pow^','mul*','div/','add+','sub-'):exec('A.__'+x[:3]+'__=lambda s,y:A("('+x[3]+'"+s.v+y.v+")")')
import re
print eval(re.sub('(\\w)','A("\\1")',raw_input().replace('^','**'))).v

পাইথন ব্যতীত রুবির মতো, আপনাকে গ্লোবাল অপ্সকে কেবল একটি শ্রেণীর অপসকে নতুন সংজ্ঞা দিতে দেয় না।


2

পার্ল 6 (146 | 150)

এটি করার সহজতম উপায় হ'ল কেবলমাত্র এমন সাবরুটাইনগুলি সরিয়ে নেওয়া যা অপারেটরগুলি নতুনদের জন্য প্রয়োগ করে।

sub infix:«+»   ($a,$b) { "(+ $a $b)" }
sub infix:«-»   ($a,$b) { "(- $a $b)" }
sub infix:«*»   ($a,$b) { "(* $a $b)" }
sub infix:['/'] ($a,$b) { "(/ $a $b)" } # stupid highlighter
sub infix:«**»  ($a,$b) { "(^ $a $b)" }

# currently there seems to be a bug that
# prevents this from modifying the parser correctly
# probably because there is already a different operator with this name
# which has nothing to do with exponentiation
my &infix:«^» := &[**];

say 'a' ** (2 / 3) * 9 * 3 - 4 * 6;
# (- (* (* (^ a (/ 2 3)) 9) 3) (* 4 6))␤

এইভাবে এটি করার জন্য নিখুঁত সর্বনিম্ন পরিমাণ বাইটগুলি হ'ল:

sub infix:<+>{"(+ $^a $^b)"}␤  #   29
sub infix:<->{"(- $^a $^b)"}␤  # + 29
sub infix:<*>{"(* $^a $^b)"}␤  # + 29
sub infix:<**>{"(^ $^a $^b)"}␤ # + 30
sub infix:</>{"(/ $^a $^b)"}␤  # + 29

146 বাইট, যদিও এটি পার্ল 6-তে গ্রাফিমগুলি গণনা করা আরও বোধগম্য।

এটি ধরে নিয়েছে যে " প্রিফিক্স নোটেশনে একই আউটপুট আউটপুট " কেবলমাত্র এক্সপ্রেশনটির ফলাফলকে উল্লেখ করতে পারে, প্রোগ্রামের আউটপুট অগত্যা নয়।

say প্রোগ্রামটি এটি STDOUT এ মুদ্রণের জন্য আপনাকে এক্সপ্রেশনটির সামনে যোগ করতে হবে। (150 বাইট)


0

ইউনিক্স টিএমজি , 189 বাইট

p:ignore(<< >>)parse(e);e:q(t,a);t:q(x,m);x:q(r,h);q:proc(x,y)x k:y/d x={<(>2 3 1<)>}b\k;r:o(!<<+-*/^()>>)|<(>e<)>;a:o(<<+->>);m:o(<<*/>>);h:o(<<^>>);o:proc(n)smark any(n)scopy;d:;b:bundle;

সমাধানটি কেবলমাত্র মৌলিক গল্ফ সহ ভাষার জন্য ম্যানুয়াল থেকে প্রায় সোজা ।

সম্প্রসারিত:

prog:  ignore(<< >>) parse(expr);
expr:  q(term, addop);
term:  q(fact, mulop);
fact:  q(prim, expop);
q:     proc(x,y) x k: y/done x ={ <(> 2 3 1 <)> } b\k;
prim:  op(!<<+-*/^()>>) | <(> expr <)>;
addop: op(<<+->>);
mulop: op(<<*/>>);
expop: op(<<^>>);
op:    proc(n) smark any(n) scopy;
done:  ;
b:     bundle;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.