संख्यात्मक शॉर्टहैंड के साथ अभिव्यक्ति का मूल्यांकन


10

आप एक कंपनी एक उपयोगकर्ता के अनुकूल कैलकुलेटर बनाना चाहता है कि के लिए काम करते हैं, और इस तरह आप उन "संख्यात्मक shorthands," यह है कि, पत्र है कि इस तरह के रूप में संख्यात्मक मानों, प्रतिनिधित्व का उपयोग करने के लिए की क्षमता जोड़ने का काम सौंपा गया है kके लिए 1000। क्योंकि आपकी कंपनी ने कहा कैलकुलेटर में भंडारण पर पैसे बचाने के लिए, आप भंडारण की लागत को कम करने के लिए अपने कोड को जितना संभव हो उतना कम से कम करना चाहिए।


आपका कार्य

आपको एक फ़ंक्शन बनाना है जो या तो STDIN से इनपुट के रूप में एक अभिव्यक्ति पढ़ता है या इसे एक पैरामीटर के रूप में लेता है और इसका मूल्यांकन लौटाता है या इसे STDOUT में प्रिंट करता है।

कुछ स्पष्टता

मुझे कुछ परिभाषाएँ करने दो। सबसे पहले, हमारे पास इनपुट है, जिसे मैं एक अभिव्यक्ति कहता हूं। यह कुछ इस तरह हो सकता है:

x + y / z

इस अभिव्यक्ति के भीतर हम तीन नंबर हैं: x, y, और z, ऑपरेटरों (द्वारा अलग +और /)। ये संख्या आवश्यक रूप से सकारात्मक पूर्णांक (या पूर्णांक) भी नहीं हैं। जब हम संख्याओं के भीतर निहित आशुलिपि का मूल्यांकन करते हैं, तो क्या चीजें उलझती हैं। उदाहरण के लिए, साथ

2k15

मूल्यांकन के प्रयोजनों के लिए, हम इस तीन नंबर में विभाजित: 2, 1000(जो k), और 15। फिर, नियमों के अनुसार, हम उन्हें प्राप्त करने के लिए जोड़ते हैं

2*1000 + 15 = 2015

उम्मीद है कि इससे निम्नलिखित नियमों को समझना थोड़ा आसान हो जाएगा।

नियम

जब तक एनबी निर्दिष्ट नहीं होता है, आप शॉर्टहैंड को शामिल करने के लिए "संख्या" या इसके पर्यायवाची शब्द की व्याख्या कर सकते हैं।

  1. निम्नलिखित संख्यात्मक शॉर्टहैंड्स का गठन करता है जो आपके फ़ंक्शन को संसाधित करने में सक्षम होना चाहिए k, m, b, t, and e:। क्रमशः k, m, b, and tमूल्यों के अनुरूप 1000, 1000000, 1000000000, and 1000000000000(एक हजार, एक मिलियन, एक अरब, और एक ट्रिलियन)। eआशुलिपि हमेशा की तरह, एक और नंबर के बाद किया जाएगा n, और का प्रतिनिधित्व करता है 10^n। आपको संख्यात्मक शॉर्टहैंड को nपहले और वर्तमान में उपस्थित होने की अनुमति देनी चाहिए e। उदाहरण के लिए, का kekमूल्यांकन करता है 1000*10^1000

  2. सादगी के लिए, यदि किसी संख्या में शॉर्टहैंड eहै, तो इसका उपयोग केवल एक बार किया जाएगा।

  3. शॉर्टहैंड से पहले किसी भी संख्या ( शॉर्टहैंड शामिल ) को इसके द्वारा गुणा किया जाता है। उदाहरण के 120kkलिए मूल्यांकन किया जाएगा 120 * 1000 * 1000। यदि यह पहले कोई संख्या है, तो आप यह मान लेना चाहिए कि (जैसे कि कैसे आप, गणित में, एक चर का इलाज हो सकता है 1 है xपरोक्ष रूप 1x)। उदाहरण के लिए e10मूल्यांकन करता है 10^10। एक अन्य उदाहरण: इसका 2m2kमूल्यांकन करता है 2*1000000*2*1000(इसमें कुछ भी नहीं जोड़ा जाता है)।

  4. शॉर्टहैंड की संख्या वाले अंतिम शॉर्टहैंड के बाद कोई भी संख्या (आशुलिपि लागू नहीं होती) को इसमें जोड़ा जाता है। उदाहरण के 2k12लिए मूल्यांकन किया जाएगा 2*1000 + 12। इसका अपवाद यह है कि यदि शॉर्टहैंड eका उपयोग किया जाता है, तो जिस स्थिति में नंबर ( शॉर्टहैंड्स शामिल हैं ) को निम्न के eरूप में माना जाएगा nऔर इसका मूल्यांकन किया जाएगा 10^n(पहला नियम देखें)।

  5. आपका कार्य उन ऑपरेटरों को संसाधित करने में सक्षम होना चाहिए +, -, *, and /जो क्रमशः इसके अलावा, घटाव, गुणा, और विभाजन हैं। यह और अधिक प्रक्रिया हो सकती है, यदि आप इतनी इच्छा रखते हैं।

  6. संचालन के क्रम के अनुसार संचालन का मूल्यांकन किया जाता है

  7. शॉर्टहैंड में संख्याएं केवल पूर्णांक नहीं हैं। 3.5b1.2मान्य है और इसका मूल्यांकन किया जाना है3.5*1000000000 + 1.2 = 3500000001.2

  8. बिल्ट-इन की अनुमति नहीं है, अगर वे इस तरह की चीज के लिए मौजूद हैं। यदि मैं आपकी भाषा स्वचालित रूप से बड़ी संख्या में वैज्ञानिक संकेतन में परिवर्तित कर देता हूं, तो वह अपवाद होगा, उस स्थिति में जो आपके आउटपुट के लिए स्वीकार्य है।

  9. बाइट्स जीत में सबसे छोटा कोड, मानक खामियों को लागू करना।

इनपुट

इनपुट प्रत्येक संख्या और ऑपरेटर द्वारा रिक्त स्थान से अलग होने के साथ एक अभिव्यक्ति होगी। संख्या में शॉर्टहैंड हो सकता है या नहीं भी हो सकता है। एक नमूना नीचे दिखाया गया है:

10 + 1b - 2k

उत्पादन

आपके फ़ंक्शन को संख्या के रूप में अभिव्यक्ति के मूल्यांकन को आउटपुट करना होगा। यह वैज्ञानिक संकेतन का उपयोग करने के लिए स्वीकार्य है यदि आउटपुट प्रदर्शित करने के लिए बहुत बड़ा होगा। यदि संख्या पूर्णांक नहीं है, तो आपके पास कम से कम तीन दशमलव स्थान होने चाहिए। यदि आप इन दशमलव स्थानों को बनाए रखते हैं तो यह स्वीकार्य है यदि संख्या पूर्णांक है।

परीक्षण के मामलों

इनपुट

t

उत्पादन

1000000000000

इनपुट

1 + 4b / 10k11

उत्पादन

399561.483

इनपुट

e2 + k2ke-1 - b12

उत्पादन

-999799912

या

-999799912.000

इनपुट

142ek12

उत्पादन

142e1012

या

142.000e1012

इनपुट:

1.2m5.25

आउटपुट:

1200005.25

अंतिम नोट्स

यह मेरी पहली चुनौती है (सैंडबॉक्स पर उपयोगकर्ताओं की कुछ मदद के साथ)। यदि कुछ भी स्पष्ट नहीं है, तो मुझे इसके बारे में बताएं और मैं स्पष्ट करने की पूरी कोशिश करूंगा।


1
अच्छी पहली चुनौती
डिजिटल ट्रॉमा

@DigitalTrauma बहुत बहुत धन्यवाद! मैं जवाब देखने के लिए उत्सुक हूं।
कोल

मैं दूसरा उदाहरण नहीं समझता। मैंने सोचा था कि मध्य अवधि की व्याख्या की गई थी 1000 + 2000 * 10 ^ -1, लेकिन इसने अंतिम उत्तर दिया -999998712। (इसके अलावा, मेरी व्याख्या नियम 4 के " अंतिम आशुलिपि " के साथ नहीं लगती है , लेकिन मुझे यकीन नहीं है कि अनुक्रम को कैसे समझा जाए k2k।) क्या आप इसका मूल्यांकन करने के चरणों की व्याख्या कर सकते हैं?
DLosc

@trichoplax हाँ, यह केवल एक संख्या होनी चाहिए; अच्छी पकड़।
कोल

1
सैंडबॉक्स पोस्ट पर टिप्पणियों को देखने के बाद, मुझे लगता है कि 2m2kनियम 3 की चर्चा में एक उदाहरण जोड़ा जाना चाहिए। इसके अलावा, एक अलग शब्द का उपयोग करना सबसे अच्छा हो सकता है - शायद "पूर्णांक" - जैसे 123कि शाब्दिक संख्याओं के लिए। आशुलिपि नहीं हैं । शब्द "संख्या" की लगभग 3 अलग-अलग परिभाषाएँ हैं, जैसे कि यह अब खड़ा है।
DLosc

जवाबों:


4

पायथन 2, 553 बाइट्स

import sys
a=lambda i:lambda j:j*10**i
d={'k':a(3),'m':a(6),'b':a(9),'t':a(12)}
e='e'
o={'+':lambda i,j:i+j,'-':lambda i,j:i-j,'*':lambda i,j:i*j,'/':lambda i,j:i/j,e:lambda i,j:i*10**j}
r=[e,'*','/','+','-']
x=0
y=k=b=''
z=[]
q=lambda i,j:float(i or j)
for l in ''.join(sys.argv[1:]):
 if l in d:x,y=d[l](q(x,1)*q(y,1)),b
 elif l==e:z.extend([q(x+q(y,0),1),l]);x,y=0,b
 elif k==e:y+=l
 elif l in o:z.extend([x+q(y,0),l]);x,y=0,b
 else:y+=l
 k=l
z.append(x+q(y,0))
for m in r:
 while m in z:n=z.index(m);z[n-1:n+2]=[o[m](z[n-1],z[n+1])]
print repr(z[0])

यह सवाल थोड़ा अप्रभावित लग रहा था और मजेदार लग रहा था, इसलिए मैंने इसे एक शॉट दिया। मैंने पहले कभी कोड गोल्फ नहीं किया है, इसलिए शायद बहुत कुछ है जिसे सुधारा जा सकता है, लेकिन मैंने इसे भाषा के अपने ज्ञान के आधार पर अपना सर्वश्रेष्ठ दिया। पायथन 3 में एक अतिरिक्त बाइट की लागत पर एक समान समाधान संभव है: print repr(z[0])->print(repr(z[0]))

उपयोग कुछ की तर्ज पर है

python2 ShorthandMath.py <equation>

अर्थात

python2 ShorthandMath.py e2 + k2ke-1 - b12

आउटपुट

-999799912.0

इसे कैसे बेहतर बनाया जाए, इसके लिए इनपुट की बहुत सराहना की जाएगी। यदि पर्याप्त रुचि है, तो मैं प्रोग्राम को अनगल कर सकता हूं और टिप्पणी कर सकता हूं, लेकिन इसमें से अधिकांश पहले से ही सुपाठ्य है (कोड गोल्फ में एक संबंधित तथ्य)।

यह ध्यान दिया जाना चाहिए कि कार्यक्रम उदाहरण के साथ टूट जाता है 142ek12 क्योंकि यह मान बड़े पैमाने पर बड़े पैमाने पर होता है और कार्यक्रम ओवरफ्लो होता है।

क्षतिपूर्ति करने के लिए, निम्नलिखित थोड़ा लंबा है, लेकिन सैद्धांतिक रूप से मनमाने ढंग से सटीक पुस्तकालय में निर्मित होने के कारण इस पर फेंकी गई किसी भी चीज़ को संभाल सकते हैं। सिंटेक्स समरूप है।

अजगर 2, 589 588 बाइट्स (मनमाना परिशुद्धता)

import sys
from decimal import*
a=lambda i:lambda j:j*10**i
d={'k':a(3),'m':a(6),'b':a(9),'t':a(12)}
e='e'
o={'+':lambda i,j:i+j,'-':lambda i,j:i-j,'*':lambda i,j:i*j,'/':lambda i,j:i/j,e:lambda i,j:i*10**j}
r=[e,'*','/','+','-']
x=c=Decimal(0)
y=k=b=''
z=[]
q=lambda i,j:Decimal(float(i or j))
for l in ''.join(sys.argv[1:]):
 if l in d:x,y=d[l](q(x,1)*q(y,1)),b
 elif l==e:z.extend([q(x+q(y,0),1),l]);x,y=c,b
 elif k==e:y+=l
 elif l in o:z.extend([x+q(y,0),l]);x,y=c,b
 else:y+=l
 k=l
z.append(x+q(y,0))
for m in r:
 while m in z:n=z.index(m);z[n-1:n+2]=[o[m](z[n-1],z[n+1])]
print z[0]

मैं कहने जा रहा हूं कि पहला संस्करण ठीक होना चाहिए और अगर कुछ गलत है तो मैं आपके पास वापस आऊंगा (मैं अभी ध्यान से नहीं सोच सकता / सोच सकता हूं)।
कोल

@ बहुत बढ़िया, धन्यवाद। मैंने इसे दिए गए हर उदाहरण पर आज़माया, और इसे कम से कम उन सभी को प्राप्त होता है।
BobChao87
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.