Infix संकेतन से उपसर्ग संकेतन में परिवर्तित करें


12

एक अंकगणितीय अभिव्यक्ति को देखते हुए, जिसमें कोष्ठक ( ()), प्रतिपादक ( ^), विभाजन ( /और गुणा *) ( ), जोड़ ( +) और घटाव ( -) (संचालन के क्रम में) शामिल हो सकते हैं, जैसे कि

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

उपसर्ग संकेतन में समान अभिव्यक्ति को आउटपुट करता है।

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

इनपुट के साथ-साथ आउटपुट में स्पेस वैकल्पिक हैं। आप मान सकते हैं कि सभी ऑपरेटर बाएं-सहयोगी हैं और अभिव्यक्ति में सभी संख्याएँ एकल अंक पूर्णांक (यानी [0-9]) हैं।

यह एक कोड गोल्फ चुनौती है, इसलिए सबसे छोटा समाधान जीत जाता है।


1
क्या + और - एक ही पूर्वता है, या + से अधिक है -? यानी, 3+4-5+6 = (((3+4)-5)+6)या है ((3+4)-(5+6))?
कीथ रान्डेल

इसके अलावा, आपने अपनी परिचालन की सूची में विभाजन छोड़ दिया है।
फीनोटपी

क्या कोष्ठक आउटपुट में वैकल्पिक हैं?
अली

@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;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.