अंग्रेजी अंक कैलकुलेटर


16

चुनौती

एक कैलकुलेटर लिखें जो एक मौखिक रूप में इनपुट लेता है (जैसा कि एक समीकरण बोल सकता है) और एक मौखिक रूप में आउटपुट भी करता है (जैसा कि एक नंबर बोल सकता है)।

नियम

कैलकुलेटर में सक्षम होना चाहिए:

  • जोड़ना, घटाना, गुणा और भाग करना
  • दस लाख और एक लाख के बीच संचालन संभालती है
  • एक अरब से एक अरब के बीच आउटपुट को संभालता है
  • अपने इनपुट में दशमलव बिंदुओं को संभालें और उन्हें अपने आउटपुट में सही ढंग से रखें
  • सौवें स्थान पर दशमलव आउटपुट को संभालना, जहां आवश्यकता हो, गोलाई

भिन्नात्मक परिणाम देने वाले सभी परिचालनों को निकटतम सौवें स्थान पर जाना चाहिए (संवेदी रूप से आउटपुट स्वरूपण के लिए)।

आउटपुट "ई" (त्रुटि के लिए) के साथ रिपोर्ट करें जब इनपुट गलत तरीके से स्वरूपित होने या 0 से विभाजित होने के कारण प्रोग्राम विफल हो जाएगा; मूल रूप से, प्रोग्राम खराब इनपुट पर क्रैश नहीं होना चाहिए, क्योंकि यह एक घटिया कैलकुलेटर होगा।

कैलकुलेटर की अनुमति है , लेकिन ऑपरेशंस या आउटपुट उनके सीमा से बाहर होने पर त्रुटियों की रिपोर्ट करने की आवश्यकता नहीं है । यह समस्या को सरल बनाने के लिए है, लेकिन यदि आप मुझसे असहमत हैं, तो बिना किसी त्रुटि के रिपोर्टिंग के बिना अधिक ऑपरेंड और आउटपुट को सही ढंग से संभालने के लिए एक कैलकुलेटर बनाने के लिए स्वतंत्र महसूस करें।

इस घटना में आउटपुट "ई" कि एक ऑपरेशन के लिए एक ऑपरेंड ऑपरेंड के लिए परिभाषित सीमा से अधिक है।

आउटपुट "ई" इस घटना में कि आउटपुट आउटपुट के लिए वर्णित सीमा से अधिक है

कैसे प्रोग्राम केस-सेंसिटिविटी को हैंडल करता है और व्हॉट्सएप को गोल्फर तक छोड़ दिया जाता है, जैसा कि ब्रिटिश या अमेरिकी अंग्रेजी का विकल्प है। 1

प्रोग्राम जो भाषा या लाइब्रेरी का उपयोग करके कैलकुलेटर के कार्यान्वयन को बायपास करते हैं, जो पहले से ही ऊपर वर्णित कार्यक्षमता को लागू कर चुके हैं, जीत के लिए अयोग्य होंगे।

विजेता

सबसे कम वर्णों वाला कार्यक्रम जीतता है।

उदाहरण

इनपुट: दो प्लस दो
आउटपुट: चार

इनपुट: इक्कीस बिंदु पांच शून्य से एक अंक पांच
आउटपुट: बीस

इनपुट: एक शून्य से दो
आउटपुट: नकारात्मक एक

इनपुट: पांच बार पाँच
आउटपुट: पच्चीस

इनपुट: पच्चीस को पांच
आउटपुट से विभाजित : पांच

इनपुट: दो प्लस दो शून्य से पांच गुना पांच शून्य ऋणात्मक शून्य से विभाजित पांच
आउटपुट: दस

इनपुट एक लाख गुना एक हजार
आउटपुट: एक अरब

इनपुट: एक लाख गुना एक हजार प्लस एक
आउटपुट:

इनपुट: दो मिलियन प्लस एक मिलियन
आउटपुट:

इनपुट: एक मिलियन प्लस एक मिलियन प्लस एक मिलियन
आउटपुट:


2
आपके द्वारा उपयोग किए जा रहे मूल्यांकन का क्रम क्या है? आम तौर पर, two plus two minus five times five divided by negative zero point five-> 2 + 2 - 5 * 5 / -0.5-> 54
मारीनस

1
@marinus सख्ती से बाएं से दाएं की तरह दिखता है। ध्यान देने के लिए धन्यवाद
जॉन ड्वोरक

1
हम करते है के लिए विफल one million oneइनपुट पर या one billion oneउत्पादन पर? इसके अलावा, क्या 1e6 सीमा या 1e9 सीमा मध्यवर्ती परिणामों पर भी लागू होती है?
जॉन ड्वोरक

2
@JanDvorak मैं यह कहने जा रहा हूँ कि कुछ भी (इनपुट, आउटपुट, मध्यस्थ परिणाम) पर विफल होना आवश्यक नहीं है, जब तक कि आप सही आउटपुट दे सकें; असफलता का उद्देश्य लोगों पर ईमानदार होना आसान बनाना था।
अतिथि

1
आप दशमलव को समर्थन देने के बारे में बात करते हैं, लेकिन आप ठीक से निर्दिष्ट नहीं करते हैं कि उन्हें कैसे संभाला जाए। सही आउटपुट किसके लिए होगा one hundred divided by three point nought? (इसके अलावा, अंतिम उदाहरण के Eबजाय आउटपुट क्यों है three million?)
पीटर टेलर

जवाबों:


6

सबसे पहले, यह पूरी तरह से धोखा है, और ऐनक तक पूरा नहीं है।

--disable-web-securityक्रोम पर ध्वज की आवश्यकता होती है , 13:

जावास्क्रिप्ट 509 + 22 = 531

x=new XMLHttpRequest;y=Object.keys(x);b=alert;q="querySelectorAll";s="send";x[y[3]]="document";x.open("GET","http://www.wolframalpha.com/input/?i="+escape(prompt()));x[y[10]]=function(c){4===x.readyState&&(w=[].filter.call(x.response[q](".pod h2"),function(a){return"ame:"==a.innerText.slice(-4)})[0].parentElement,(k=w[q]("a")[0])&&"Words only"==k.innerText?(x.open("GET",k.href),x.send()):alert(JSON.parse([].pop.call(x[y[2]][q]("script")).innerHTML.match(/d_0.00\.push\((.+?)\)/)[1]).stringified))};x[s]()

पहली बार कल्पना से आउटपुट उदाहरण के रूप में
इनपुट two plus two minus five times five divided by negative zero point fiveआउटपुट है

यहाँ छवि विवरण दर्ज करें

किसी भी अन्य मामले को ठीक किया जाना चाहिए (अब), यह अभी तक बहुत ही असहनीय है जैसा कि, मैं चाहता था कि यह ठीक हो जाए।

input: two plus two
output: four

input: twenty-one point five minus one point five
output: twenty

input: one minus two
output: negative one

input: five times five
output: twenty-five

input: twenty-five divided by five
output: five

input: two plus two minus five times five divided by negative zero point five
output: fifty-four

input: one million times one thousand
output: one billion

input: one million times one thousand plus one
output: one billion, one

input: two million plus one million:
output: three million

input: one million plus one million plus one million
output: three million

ओह, और यदि आप वास्तव में इसका परीक्षण करने जा रहे हैं, तो कुछ सेकंड लग सकते हैं, क्योंकि यह पूरा वुल्फराम अल्फा पृष्ठ दो बार तक लोड करता है।

हालांकि, हालांकि बहुत कुछ बढ़ाना हो सकता है।


मैं इस बात से इनकार नहीं कर सकता कि यह एक मनोरंजक जवाब है, हालांकि यह बहुत बुरा है क्योंकि यह सही प्रारूप में आउटपुट प्रदान नहीं करता है। ध्यान दें कि पिछले दो उदाहरणों में भी गलत आउटपुट है। बेशक, यह भी सवाल है कि यह उत्तर कितना वैध है ... हालांकि मैंने स्पष्ट रूप से यह नहीं बताया कि आप किसी अन्य पूर्व-मौजूदा कार्यक्रम को क्वेरी नहीं कर सकते, मेरा मतलब इस विचार से अवगत कराना था कि अंग्रेजी से संख्या में अनुवाद गणना, और संख्या से अंग्रेजी में अनुवाद, गोल्फर द्वारा लागू किया जाना चाहिए। यह नियमों की शाब्दिक व्याख्या को पारित करता है, हालांकि, मैं इसे दूंगा। :)
अतिथि

@guest =) मैं पूरी तरह से, उस पर आपसे सहमत हूं =) यह वास्तविक उत्तर कोडरफ़ की तुलना में मज़ेदार उत्तर है, नियमों को तोड़ना है। मैं आउटपुट को ठीक करने की प्रक्रिया में हूं और एक नया संस्करण पोस्ट कर रहा हूं। वोल्फ्राम अल्फा केवल छवियों का उपयोग करता है, मुझे एक डेटा विशेषता, बी 64 एनकोडेड के रूप में संग्रहीत करने के लिए थोड़ी देर लगी।
C5H8NNOO4

@guest, ने इसे अपडेट किया है। मुझे आशा है कि आउटपुट अब ठीक हैं =)
C5H8NNOO4

यदि आप इसे गणितज्ञ में करते हैं, तो आप सही संख्या दशमलव स्थानों को देने के लिए आउटपुट को नियंत्रित कर सकते हैं और इसी तरह (जो कि एन क्या अंशों के लिए करेंगे): स्क्रीनशॉट

+1 वास्तव में धोखा देने के साथ रचनात्मक होना, भले ही यह लोकप्रियता-प्रतियोगिता नहीं है
nyuszika7h

4

अजगर, 982

from re import*
S=split
U=sub
a=S(' ',U('_','teen ','zero one two three four five six seven eight nine ten eleven twelve thir_four_fif_six_seven_eigh_nine_')+U('_','ty ','twen_thir_for_fif_six_seven_eigh_nine_'))
b=range(20)+range(20,99,10)
d=dict(zip(a,b))
D=dict(zip(b,a))
p='point'
v='negative'
def f(s):
 s=S('[ -]',s);n=0.;m=10**(p in s and(s.index(p)-len(s)))
 for x in s[::-1]:m*=10*(m<1)+100*('hu'in x)+1e3*('ho'in x)+1e6*('m'in x)or 1;n+=(x in d)and m*d[x]
 return n-2*n*(v in s)
def F(n):
 l=[v]*(n<0);x=abs(n)
 for i in(9,6,3,0):z=int(x/10**i);h=z%100;g=(z>99)*[D[z/100],'hundred']+(h>0)*[h in D and D[h]or D[h-z%10]+'-'+D[z%10]];l+=g and g+[[],['thousand'],['million'],['billion']][i/3];x%=10**i
 l+=[c=='.'and p or D[int(c)]for c in'%.2g'%x][n**2>=1:];return' '.join(l)
c=lambda n,l:c(eval(`n`+l[0]+`f(l[1])`),l[2:])if l else n
i=S(' (?=. )|(?<= .) ',U('di.*?y','/',U('times','*',U('minus','-',U('plus','+',raw_input())))))
try:print F(c(f(i[0]),i[1:]))
except:print'E'

मुझे लगता है कि यह चश्मे के अनुसार काम करना चाहिए, लेकिन शायद कुछ और कीड़े हैं। यह इनपुट के लिए अजीब तरह से काम कर सकता है> = एक अरब या कोई अप्रत्याशित शब्द जो इसे गलत तरीके से व्याख्या करता है।

यहां कुछ बदलावों के साथ थोड़ा और पठनीय संस्करण दिया गया है:

import re
words = re.split(' ', re.sub('_', 'teen ', 'zero one two three four five six seven eight nine ten eleven twelve thir_four_fif_six_seven_eigh_nine_') + re.sub('_', 'ty ', 'twen_thir_for_fif_six_seven_eigh_nine_'))
values = range(20) + range(20, 99, 10)
d = dict(zip(words, values))
D = dict(zip(values, words))

def str_to_num(s):
    s = re.split('[ -]', s)
    n = 0.0
    multiplier = 10 ** ('point' in s and (s.index('point') - len(s)))

    for word in s[::-1]:
        multiplier *= 10 * (multiplier < 1) + 100 * ('hundred' == word) + 1e3 * ('thousand' == word) + 1e6 * ('million' == word) or 1
        n += (word in d) and multiplier * d[word]

    return n - 2 * n * ('negative' in s)


three_digit_num_to_str = lambda n: (n > 99) * [D[n / 100], 'hundred'] + (n % 100 > 0) * [n % 100 in D and D[n % 100] or D[n % 100 - n % 10] + '-' + D[n % 10]]

def num_to_str(n):
    word_list = ['negative'] * (n < 0)
    x = abs(n)

    for i in (9, 6, 3, 0):
        three_digit_str = three_digit_num_to_str(int(x / 10 ** i))
        if three_digit_str:
            word_list += three_digit_str + [[], ['thousand'], ['million'], ['billion']][i / 3]

        x %= 10 ** i

    word_list += [char == '.' and 'point' or D[int(char)] for char in '%.2g' % x][n ** 2 >= 1:]
    return ' '.join(word_list)

calculate = lambda n, l: calculate(eval(str(n) + l[0] + str(str_to_num(l[1]))), l[2:]) if l else n

i = re.split(' (?=. )|(?<= .) ', re.sub('di.*?y', '/', re.sub('times', '*', re.sub('minus', '-', re.sub('plus', '+', raw_input())))))

try:
    print num_to_str(calculate(str_to_num(i[0]), i[1:]))
except:
    print 'E'

1

हम वहाँ चलें। संस्करण तोड़ने से पहले इसे तोड़ दिया, लेकिन अब हम ऑनलाइन वापस आ गए हैं। मैं सकारात्मक हूं कि इसे और आगे बढ़ाया जा सकता है। मैं कल इस पर काम करूंगा। यह काफी कठिन था इसे ठीक से काम किए बिना इसे गोल्फिंग के बिना, हालांकि, और मेरी आँखें इसे घूर रही हैं। haha

जावा - 3220

import java.util.*;class a{int D=0,i,l,j;static boolean T=true,F=false;enum O{A("plus"),S("minus"),M("times"),D(""),P("point");String t;O(String u){t=u;}double p(double f,double s){if(this==A)f+=s;if(this==S)f-=s;if(this==M)f*=s;if(this==D)f/=s;return f;}static O f(String s){O r=null;for(O o:values())if(s.equals(o.t))r=o;return r;}}enum N{A("zero",0,F),B("one",1,F),C("two",2,F),D("three",3,F),E("four",4,F),AG("five",5,F),G("six",6,F),H("seven",7,F),I("eight",8,F),J("nine",9,F),K("ten",10,F),L("eleven",11,F),M("twelve",12,F),N("thirteen",13,F),O("fourteen",14,F),P("fifteen",15,F),Q("sixteen",16,F),R("seventeen",17,F),S("eighteen",18,F),AH("nineteen",19,F),U("twenty",20,F),V("thirty",30,F),W("forty",40,F),X("fifty",50,F),Y("sixty",60,F),Z("seventy",70,F),AA("eighty",80,F),AB("ninety",90,F),AC("hundred",100,T),AD("thousand",1000,T),AE("million",1000000,T),AF("billion",1000000000,T);String t;double v;boolean q;N(String u,int w,boolean r){t=u;v=w;q=r;}static N f(String s){N r=null;for(N n:values())if(s.equals(n.t))r=n;return r;}static N f(char s){return d(q(""+s));}static N d(double v){N r=null;for(N n:values())if(v==n.v)r=n;return r;}static String c(double n){return d(n).t;}}public static void main(String[]a){new a();}a(){while(T){try{List p=p(new Scanner(System.in).nextLine()),t=new ArrayList();double d=0;for(j=0;j<p.size();j++){Object o=p.get(j);if(o(o)){if((O)o==O.P){t.add((d(t.get(t.size()-1))+((d=d(p.get(j+1)))<10?d*=100:d<100?d*=10:d)/1000));t.remove(t.size()-2);j++;}else t.add(o);}else {N n=N.d(d(o));if(n!=null&&n.q){t.add((d(o))*d(t.get(t.size()-1)));t.remove(t.size()-2);}else t.add(o);}}double r=d(t.get(0));for(j=1;j<t.size();j++){Object c=t.get(j),l=t.get(j-1);if(o(c))continue;if(c instanceof Double&&l instanceof Double)r+=d(c);else r=((O)t.get(j-1)).p(r,d(t.get(j)));}System.out.println(p(r));}catch(Exception e){System.out.println("E");}}}List p(String s) {List r=new ArrayList();Scanner i=new Scanner(s);while(i.hasNext()){String c=i.next();if(c.equals("divided")){r.add(O.D);i.next();}else if(c.indexOf("-")!=-1){String[] num=c.split("-");r.add(N.f(num[0]).v+N.f(num[1]).v);}else{Object o=N.f(c);r.add(o!=null?((N)o).v:O.f(c));}}return r;}String p(double n){String a=String.valueOf(n),w,d=null,b="";l=a.indexOf(".");if(l!=-1){w=a.substring(0,l);d=a.substring(l+1);}else w=a;if(d.equals("0"))d=null;D=0;while(w.length()%3!=0)w=" "+w;for(i=w.length();i>0;i-=3,D++)b=w(w.substring(i-3,i))+b;return b+d(d);}String w(String w) {if(w==null)return "";w=w.trim();String b="";l=w.length();if(l>1&&w.charAt(l-2)!='0'){if(w.charAt(l-2)=='1')b=N.d(q(w.substring(l-2))).t;else b+=N.d(q(w.charAt(l-2)+"0")).t+"-"+N.f(w.charAt(l-1)).t;}for(j=(b.equals("")?l-1:l-3);j>-1;j--){N n=N.f(w.charAt(j));if(n==N.A)continue;if(j==l-1)b=n.t;else if(j==l-2)b=N.f(n.t+"0")+"-"+b;else if(j==l-3)b=n.t+" hundred "+b;}if(!b.trim().equals("")){if(D==1)b+=" thousand ";if(D==2)b+=" million ";if(D==3)b+=" billion ";}return b;}String d(String d) {if(d==null)return"";if(d.length()>3)d=d.substring(0,3);String b = " point ";for(char n:d.toCharArray())b+=N.f(n).t+" ";return b;}boolean o(Object o){return o instanceof O;}Double d(Object o){return (Double)o;}static double q(String s){return Double.parseDouble(s);}}

लाइन ब्रेक और टैब के साथ

import java.util.*;

class a{

    int D=0,i,l,j;
    static boolean T=true,F=false;

    enum O{
        A("plus"),
        S("minus"),
        M("times"),
        D(""),
        P("point");

        String t;       
        O(String u){
            t=u;
        }

        double p(double f,double s){
            if(this==A)f+=s;
            if(this==S)f-=s;
            if(this==M)f*=s;
            if(this==D)f/=s;
            return f;
        }

        static O f(String s){
            O r=null;
            for(O o:values())if(s.equals(o.t))r=o;
            return r;
        }
    }

    enum N{
        A("zero",0,F),
        B("one",1,F),
        C("two",2,F),
        D("three",3,F),
        E("four",4,F),
        AG("five",5,F),
        G("six",6,F),
        H("seven",7,F),
        I("eight",8,F),
        J("nine",9,F),
        K("ten",10,F),
        L("eleven",11,F),
        M("twelve",12,F),
        N("thirteen",13,F),
        O("fourteen",14,F),
        P("fifteen",15,F),
        Q("sixteen",16,F),
        R("seventeen",17,F),
        S("eighteen",18,F),
        AH("nineteen",19,F),
        U("twenty",20,F),
        V("thirty",30,F),
        W("forty",40,F),
        X("fifty",50,F),
        Y("sixty",60,F),
        Z("seventy",70,F),
        AA("eighty",80,F),
        AB("ninety",90,F),
        AC("hundred",100,T),
        AD("thousand",1000,T),
        AE("million",1000000,T),
        AF("billion",1000000000,T);

        String t;
        double v;
        boolean q;

        N(String u,int w,boolean r){
            t=u;
            v=w;
            q=r;
        }

        static N f(String s){
            N r=null;
            for(N n:values())if(s.equals(n.t))r=n;
            return r;
        }

        static N f(char s){
            return d(q(""+s));
        }

        static N d(double v){
            N r=null;
            for(N n:values())if(v==n.v)r=n;
            return r;
        }

        static String c(double n){
            return d(n).t;
        }

    }


    public static void main(String[]a){
        new a();
    }


    a(){
        while(T){
            try{
                List p=p(new Scanner(System.in).nextLine()),t=new ArrayList();
                double d=0;
                for(j=0;j<p.size();j++){
                    Object o=p.get(j);
                    if(o(o)){
                        if((O)o==O.P){
                            t.add((d(t.get(t.size()-1))+((d=d(p.get(j+1)))<10?d*=100:d<100?d*=10:d)/1000));
                            t.remove(t.size()-2);
                            j++;
                        }
                        else t.add(o);
                    }
                    else {
                        N n=N.d(d(o));
                        if(n!=null&&n.q){
                            t.add((d(o))*d(t.get(t.size()-1)));
                            t.remove(t.size()-2);
                        }
                        else t.add(o);
                    }
                }

                double r=d(t.get(0));
                for(j=1;j<t.size();j++){
                    Object c=t.get(j),l=t.get(j-1);
                    if(o(c))continue;
                    if(c instanceof Double&&l instanceof Double)r+=d(c);
                    else r=((O)t.get(j-1)).p(r,d(t.get(j)));
                }

                System.out.println(p(r));
            }
            catch(Exception e){
                System.out.println("E");
            }
        }
    }

    List p(String s) {
        List r=new ArrayList();
        Scanner i=new Scanner(s);
        while(i.hasNext()){
            String c=i.next();
            if(c.equals("divided")){
                r.add(O.D);
                i.next();
            }
            else if(c.indexOf("-")!=-1){
                String[] num=c.split("-");
                r.add(N.f(num[0]).v+N.f(num[1]).v);
            }
            else{
                Object o=N.f(c);
                r.add(o!=null?((N)o).v:O.f(c));
            }
        }
        return r;
    }

    String p(double n){

        String a=String.valueOf(n),w,d=null,b="";

        l=a.indexOf(".");
        if(l!=-1){
            w=a.substring(0,l);
            d=a.substring(l+1);
        }
        else w=a;

        if(d.equals("0"))d=null;

        D=0;
        while(w.length()%3!=0)w=" "+w;

        for(i=w.length();i>0;i-=3,D++)b=w(w.substring(i-3,i))+b;

        return b+d(d);
    }


    String w(String w) {
        if(w==null)return "";
        w=w.trim();

        String b="";
        l=w.length();

        if(l>1&&w.charAt(l-2)!='0'){
            if(w.charAt(l-2)=='1')b=N.d(q(w.substring(l-2))).t;
            else b+=N.d(q(w.charAt(l-2)+"0")).t+"-"+N.f(w.charAt(l-1)).t;
        }

        for(j=(b.equals("")?l-1:l-3);j>-1;j--){
            N n=N.f(w.charAt(j));
            if(n==N.A)continue;
            if(j==l-1)b=n.t;
            else if(j==l-2)b=N.f(n.t+"0")+"-"+b;
            else if(j==l-3)b=n.t+" hundred "+b;
        }

        if(!b.trim().equals("")){
            if(D==1)b+=" thousand ";
            if(D==2)b+=" million ";
            if(D==3)b+=" billion ";
        }

        return b;
    }


    String d(String d) {
        if(d==null)return"";
        if(d.length()>3)d=d.substring(0,3);

        String b = " point ";
        for(char n:d.toCharArray())b+=N.f(n).t+" ";

        return b;
    }

    boolean o(Object o){
        return o instanceof O;
    }

    Double d(Object o){
        return (Double)o;
    }

    static double q(String s){
        return Double.parseDouble(s);
    }

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