Chuyển đổi số Trung Quốc


10

Trong tiếng Trung, các số được viết như sau:

1 一 2 二 3 三 4 四 5 五 6 六 7 七 8 八 9 九 10 十

Đối với các số trên 10, nó được biểu thị bằng số hàng chục và số thứ tự. Nếu chỉ có một mười, bạn không cần phải nói một cách rõ ràng và nếu không có ai, bạn không cần phải đặt bất cứ điều gì sau:

11 十一
24 二十四
83 八十三
90 九十

Đối với các số trên 100, bạn sử dụng cùng logic, nhưng với ký tự . Tuy nhiên, lần này, nếu chỉ có một trăm, bạn vẫn cần phải viết nó ra, và nếu không có hàng chục, bạn cần phải nói .

100 一百 231 二百三十一 803 八百零三 999 九百九十九

Nhiệm vụ của bạn là chuyển đổi các chữ số Trung Quốc này thành chữ số Ả Rập. Cho một số N bằng tiếng Trung ( (1) <= N <= 九百九十九(999)), chuyển đổi nó thành số Ả Rập.

Hãy nhớ rằng, đây là , vì vậy mã có số byte nhỏ nhất sẽ thắng.


3
Bạn có thể thêm trường hợp thử nghiệm 503380?
Martin Ender

1
^ Điểm tốt. Nếu tôi đang theo dõi một cách chính xác, nó nên 503 -> 五百三380 -> 三百八十. Ngoài ra, bạn nói cho hàng chục rằng you do not need to explicitly say one. Điều đó có nghĩa là nó không quan trọng nếu chúng ta làm?
Kade


Lên tới 999? Bạn đã đưa ra giới hạn trên
edc65

503 nên 五百零三như không có hàng chục (tôi nghĩ)
edc65

Câu trả lời:


3

JavaScript (ES6), 112 byte

s=>[...s].map(c=>d=(i="零一二三四五六七八九十百".search(c))>9?(n+=(d||1)*(i*90-890),0):i,n=d=0)&&n+d

Các chữ số - được chuyển đổi thành số thập phân và được lưu vào d, trong khi và nhân chữ số cuối cùng với 10 hoặc 100 tương ứng và tích lũy nó vào n. được bỏ qua một cách hiệu quả, vì dđã bằng không khi nó gặp phải.


2

Perl, 110 byte

Mã 98 byte + 12 cho -plC -Mutf8.

Perl không ghét unicode. Hy vọng rằng tôi đã không bỏ lỡ bất kỳ trường hợp cạnh nào, tôi đã gặp vấn đề với những con số như 二百十nhưng tôi đã giải quyết nó ngay bây giờ!

s/十/*10+/;s/百/*100+/;y/一二三四五六七八九零/123456789 /;s/^\*|\+\*/+/g;$_=eval"$_-0"

Sử dụng

perl -plC -Mutf8 -e 's/十/*10+/;s/百/*100+/;y/一二三四五六七八九零/123456789 /;s/^\*|\+\*/+/g;$_=eval"$_-0"' <<< '一
十一
二十四
八十三
九十
一百
二百三十一
八百零三
九百九十九'
1
2
3
4
5
6
7
8
9
10
11
24
83
90
100
231
803
999

2

PHP, 225 byte

preg_match_all("#[1-9]?10+|[1-9]#",str_replace(["一","二","三","四","五","六","七","八","九","十","百"],[1,2,3,4,5,6,7,8,9,10,100],$argv[1]),$z);foreach($z[0]as$p)$s+=($b=substr_count($p,0))?$p[0]*10**$b:$p;echo$s;

Quá tệ strtrlà không an toàn đa bào. Nó có thể giúp bạn tiết kiệm 23 byte. Nhưng bạn có thể sử dụng 0+thay vì 00?, lưu một byte hoặc bạn có thể a) thay thế bằng aaathay vì 10100, b) sử dụng a+thay vì 100?trong regex và c) athay vì 0cho substr_count(-4).
Tít

@Titus theo cách của bạn với một không thể làm việc trong phạm vi 10-19
Jörg Hülsermann

2

Java 7, 236 233 229 byte

int c(String s){String x=" 一二三四五六七八九十百";int l=s.length(),i=x.indexOf(s.charAt(l-1)),j=x.indexOf(s.charAt(0)),q=j*100;return l<2?i:l<3?i==10?j*10:i>10?q:10+i:l<4?j*10+i:l<5?q+i:q+i+x.indexOf(s.charAt(2))*10;}

Mã thử nghiệm & mã hóa:

Hãy thử nó ở đây.

class M{
  static int c(String s){
    String x = " 一二三四五六七八九十百";
    int l = s.length(),
        i = x.indexOf(s.charAt(l-1)),
        j = x.indexOf(s.charAt(0));
    if(l<2) return i; // 1-10
    if(l<3){
      if(i==10) return j*10; // 20,30,40,50,60,70,80,90
      if(i>10) return j*100; // 100,200,300,400,500,600,700,800,900
      return 10+i; // 11-19
    }
    if(l<4) return j*10+i; // 21-29,31-39,41-49,51-59,61-69,71-79,81-89,91-99
    if(l<5) return j*100+i; // 101-109,201-209,301-309,401-409,501-509,601-609,701-709,801-809,901-909
    return j*100+i+x.indexOf(s.charAt(2))*10; // 111-119,121-129,131-139,...,971-979,981-989,991-999
  }

  public static void main(String[] a){
    System.out.println(c("一"));
    System.out.println(c("二"));
    System.out.println(c("三"));
    System.out.println(c("四"));
    System.out.println(c("五"));
    System.out.println(c("六"));
    System.out.println(c("七"));
    System.out.println(c("八"));
    System.out.println(c("九"));
    System.out.println(c("十"));
    System.out.println(c("十一"));
    System.out.println(c("二十四"));
    System.out.println(c("八十三"));
    System.out.println(c("九十"));
    System.out.println(c("一百"));
    System.out.println(c("二百三十一"));
    System.out.println(c("八百零三"));
    System.out.println(c("九百九十九"));
  }
}

Đầu ra:

1
2
3
4
5
6
7
8
9
10
11
24
83
90
100
231
803
999

0

C #, 197 210 byte

int x(string s){if(s=="")return 0;if(s[0]=='零')s=s.Substring(1);if(s[0]=='十')s="一"+s;string t=" 一二三四五六七八九";return s.Length<2?t.IndexOf(s[0]):(t.IndexOf(s[0])*(s[1]=='百'?100:10)+x(s.Substring(2)));}

Số byte sai trước đây do mã hóa bị bỏ qua ...

Mã hóa Big5

Một giải pháp đệ quy đệm phần đầu vào nếu 10-19 để xử lý dễ dàng hơn, sau đó xử lý từ 2 ký tự bên trái một lần.

Ung dung

public int x(string s)
{
    if (s == "")
        return 0;   // Recursion termination when input is divisible by 10 (no unit digit character)
    if (s[0] == '零')
        s = s.Substring(1);   // Ignore '零'
    if (s[0 ]== '十')
        s = "一" + s;   // Normalize 10-19 by padding with "一"
    string t = " 一二三四五六七八九";   // Index lookup
    return s.Length < 2
        ? t.IndexOf(s[0])   // 0-9
        : (t.IndexOf(s[0]) * (s[1] == '百' ? 100 : 10) + x(s.Substring(2)));
    // Get the first character's digit, multiply by 100 or 10 depends on 2nd character, and recursively process from 3rd character onwards
}

0

Python 3, 128 byte

Tiết kiệm 2 + 3 byte nhờ Shebang và 2 để thay thế (d>9)+(d>10)bằngmax(d-9,0)

n=a=0
for c in input():d=" 一二三四五六七八九十百".find(c);n+=[0,10*a**(a>0),a*100][max(d-9,0)];a=d*(d<10)
print(n+a)

Ung dung:

n=a=0
for c in input():
 d=" 一二三四五六七八九十百".find(c)
 n+=[0, 10*a**(a>0), a*100][max(d-9,0)] 
 a=d*(d<10)
print(n+a)

Câu trả lời ban đầu

n=a=0
for c in input():
 d=" 一二三四五六七八九十百".find(c)
 if d<=9:a=d
 elif d==10:n+=[1,a][a>0]*10;a=0
 elif d==11:n+=a*100;a=0
print(n+a)

nsẽ là số cuối cùng và alà chữ số trước đó.


Thông số kỹ thuật đã thay đổi.
Kade

@Shebang May mắn thay, 803 vẫn hoạt động.
Karl Napf

1
@TimmyD Nó bị bỏ qua. findtrả về -1 và nhỏ hơn 9như vậy na không bị ảnh hưởng.
Karl Napf

1
[1,a][a>0]*10 -> 10*a**(a>0)tiết kiệm hai byte :)
Kade

1
[0,d][d<=9] -> d*(d<10)tiết kiệm ba byte quá!
Kade
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.