Máy tính số tiếng anh


16

Thử thách

Viết một máy tính nhận đầu vào ở dạng lời nói (như người ta có thể nói một phương trình) và cũng đầu ra ở dạng lời nói (như người ta có thể nói một số).

Quy tắc

Máy tính sẽ có thể:

  • cộng, trừ, nhân và chia
  • xử lý toán hạng giữa một triệu âm và một triệu
  • xử lý đầu ra giữa một tỷ âm và một tỷ
  • xử lý các dấu thập phân trong đầu vào của nó và đặt chúng chính xác vào đầu ra của nó
  • xử lý đầu ra thập phân đến vị trí thứ một trăm, làm tròn số khi cần thiết

Tất cả các hoạt động mang lại kết quả phân đoạn sẽ làm tròn đến vị trí thứ một trăm gần nhất (giống hệt với định dạng đầu ra).

Báo cáo với đầu ra "E" (lỗi) khi đầu vào sẽ khiến chương trình bị lỗi do được định dạng không chính xác hoặc chia cho 0; về cơ bản, chương trình không nên gặp sự cố với đầu vào xấu, bởi vì đó sẽ là một máy tính tệ hại.

Máy tính được phép , nhưng không bắt buộc phải báo cáo lỗi khi toán hạng hoặc đầu ra thoát khỏi giới hạn của chúng. Điều này có nghĩa là để đơn giản hóa vấn đề, nhưng nếu bạn không đồng ý với tôi, vui lòng tạo một máy tính có khả năng xử lý chính xác các toán hạng và đầu ra lớn hơn mà không báo cáo lỗi.

Xuất "E" trong trường hợp toán hạng cho một thao tác vượt quá giới hạn được xác định cho toán hạng.

Đầu ra "E" trong trường hợp đầu ra vượt quá giới hạn được mô tả cho đầu ra

Làm thế nào chương trình xử lý độ nhạy trường hợp và khoảng trắng được dành cho người chơi golf, như là sự lựa chọn của tiếng Anh Anh hoặc Mỹ. 1

Các chương trình bỏ qua việc thực hiện máy tính bằng cách sử dụng ngôn ngữ hoặc thư viện đã triển khai chức năng được mô tả ở trên sẽ không đủ điều kiện để chiến thắng.

Người chiến thắng

Chương trình có số lượng nhân vật thấp nhất sẽ thắng.

Ví dụ

Đầu vào: hai cộng hai
Đầu ra: bốn

Đầu vào: hai mươi mốt điểm năm trừ một điểm năm
Đầu ra: hai mươi

Đầu vào: một trừ hai
Đầu ra: âm một

Đầu vào: năm lần năm
Đầu ra: hai mươi lăm

Đầu vào: hai mươi lăm chia cho năm
Đầu ra: năm

Đầu vào: hai cộng hai trừ năm lần năm chia cho số 0 âm năm
đầu ra: mười

Nhập một triệu lần một nghìn
Đầu ra: một tỷ

Đầu vào: một triệu lần một nghìn cộng với một
Đầu ra: E

Đầu vào: hai triệu cộng với một triệu
Đầu ra: E

Đầu vào: một triệu cộng với một triệu cộng với một triệu
Đầu ra: E


2
Thứ tự đánh giá bạn đang sử dụng là gì? Thông thường, two plus two minus five times five divided by negative zero point five-> 2 + 2 - 5 * 5 / -0.5-> 54.
bến tàu

1
@marinus trông giống như hoàn toàn từ trái sang phải. Cảm ơn bạn đã chú ý
John Dvorak

1
chúng ta phải thất bại cho one million oneđầu vào hay one billion oneđầu ra? Ngoài ra, giới hạn 1e6 hay giới hạn 1e9 cũng áp dụng cho kết quả trung gian?
John Dvorak

2
@JanDvorak Tôi sẽ nói rằng không cần thiết phải thất bại với bất cứ điều gì (đầu vào, đầu ra, kết quả trung gian) miễn là bạn có thể cung cấp đầu ra chính xác; Mục đích của sự thất bại là giúp mọi người trung thực dễ dàng hơn.
khách

1
Bạn nói về việc hỗ trợ số thập phân nhưng bạn không xác định chính xác cách xử lý chúng. Đầu ra chính xác sẽ là one hundred divided by three point noughtgì? (Ngoài ra, tại sao đầu ra của ví dụ cuối cùng Ethay vì three million?)
Peter Taylor

Câu trả lời:


6

Trước hết, điều này là hoàn toàn gian lận, và không hoàn thành với thông số kỹ thuật.

yêu cầu --disable-web-securitycờ trên chrome, +22

Javascript 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]()

Là người đầu tiên ra khỏi spec là cũng ví dụ đầu ra
đầu vào two plus two minus five times five divided by negative zero point fiveđầu ra

nhập mô tả hình ảnh ở đây

Bất kỳ trường hợp nào khác sẽ được xử lý tốt (bây giờ), điều này vẫn chưa được xử lý đúng, tôi chỉ muốn nó được sửa chữa.

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

Ồ, và nếu bạn thực sự sẽ thử nghiệm nó, có thể mất vài giây, vì nó tải trang Wolfram Alpha hoàn chỉnh lên đến hai lần.

Vâng, có thể có rất nhiều để tăng cường mặc dù.


Tôi không thể phủ nhận rằng đây là một câu trả lời thú vị, mặc dù nó quá tệ, nó không cung cấp đầu ra ở định dạng chính xác. Lưu ý rằng hai ví dụ cuối cùng cũng có đầu ra không chính xác. Tất nhiên, cũng có câu hỏi về câu trả lời này hợp pháp như thế nào ... mặc dù tôi không nói rõ rằng bạn không thể truy vấn một số chương trình có sẵn khác, tôi đã có ý định chuyển ý tưởng từ bản dịch sang tiếng Anh sang số , việc tính toán và dịch từ số sang tiếng Anh, nên được người chơi golf thực hiện. Mặc dù vậy, nó vượt qua sự giải thích theo nghĩa đen của các quy tắc, tôi sẽ cung cấp cho nó. :)
khách

@guest =) Tôi hoàn toàn, đồng ý với bạn về điều đó =) Đó là câu trả lời thú vị hơn, dựa trên các quy tắc, hơn là một codegolf thực tế. Tôi đang trong quá trình sửa lỗi đầu ra và đăng phiên bản mới. Wolfram Alpha chỉ sử dụng hình ảnh, tôi mất một lúc để tìm ra nó được lưu dưới dạng thuộc tính dữ liệu, được mã hóa b64.
C5H8NNaO4

@guest, cập nhật nó. Tôi hy vọng các kết quả đầu ra hiện đã ổn =)
C5H8NNaO4

Nếu bạn làm điều này trong Mathicala, bạn có thể điều khiển đầu ra để đưa ra số thập phân chính xác và cứ thế (đó là những gì N sẽ làm cho phân số): ảnh chụp màn hình

+1 cho việc thực sự sáng tạo với gian lận, mặc dù đây không phải là một cuộc thi phổ biến .
nyuszika7h

4

Con trăn, 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'

Tôi nghĩ rằng nó hoạt động như nó nên theo thông số kỹ thuật, nhưng có lẽ có một vài lỗi nữa. Nó có thể hành động kỳ lạ đối với đầu vào> = một tỷ hoặc bất kỳ từ bất ngờ nào mà nó diễn giải không chính xác.

Đây là một phiên bản dễ đọc hơn một chút với một vài thay đổi:

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

Chúng tôi đi đây. Chơi golf phiên bản trước khi phá vỡ nó, nhưng bây giờ chúng tôi đã trở lại trực tuyến. Tôi khẳng định nó có thể được đánh gôn hơn nữa. Tôi sẽ làm việc với nó nhiều hơn vào ngày mai. Mặc dù vậy, nó đã đủ khó để khiến nó hoạt động bình thường mà KHÔNG cần chơi gôn, và đôi mắt tôi mệt mỏi khi nhìn chằm chằm vào nó. Haha

Java - 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);}}

Với dấu ngắt dòng và tab

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);
    }

}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.