Konversi angka berbahasa Mandarin

10

Dalam bahasa Cina, angka ditulis sebagai berikut:

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

Untuk angka di atas 10, dinyatakan sebagai jumlah puluhan dan jumlah. Jika hanya ada satu, Anda tidak perlu mengatakannya secara eksplisit, dan jika tidak ada, Anda tidak perlu menuliskan apa pun setelah:

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

Untuk angka di atas 100, Anda menggunakan logika yang sama, tetapi dengan karakter . Namun kali ini, jika hanya ada seratus, Anda masih perlu menuliskannya, dan jika tidak ada puluhan, Anda perlu mengatakannya .

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

Tugas Anda adalah mengubah angka-angka Cina ini menjadi angka-angka Arab. Diberi angka N dalam bahasa Cina ( (1) <= N <= 九百九十九(999)), ubah menjadi angka Arab.

Ingat, ini adalah , jadi kode dengan jumlah byte terkecil menang.

Oliver Ni
sumber
3
Bisakah Anda menambahkan test case 503dan 380?
Martin Ender
1
^ Poin bagus. Jika saya mengikuti dengan benar, seharusnya 503 -> 五百三dan 380 -> 三百八十. Juga, Anda mengatakan untuk puluhan itu you do not need to explicitly say one. Apakah itu berarti tidak masalah jika kita melakukannya?
Kade
Terkait
NoOneIsHere
Hingga 999? Anda harus memberi batas atas
edc65
503 seharusnya 五百零三karena tidak ada puluhan (saya pikir)
edc65

Jawaban:

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

Digit 一 - 九 dikonversi menjadi desimal dan disimpan d, sementara 十 dan 百 gandakan digit terakhir dengan masing-masing 10 atau 100 dan akumulasikan dalam n. diabaikan secara efektif, karena dsudah nol ketika ditemui.

Neil
sumber
2

Perl, 110 byte

Kode 98 byte + 12 untuk -plC -Mutf8.

Perl tidak membenci unicode. Mudah-mudahan saya tidak melewatkan kasus tepi, saya punya masalah dengan angka seperti 二百十tetapi saya sudah mengatasinya sekarang!

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

Pemakaian

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
Dom Hastings
sumber
2

PHP, 225 Bytes

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;
Jörg Hülsermann
sumber
Sayang sekali itu strtrtidak aman multibyte. Ini bisa menghemat 23 byte. Tapi Anda bisa menggunakan 0+alih-alih 00?, menyimpan satu byte atau Anda dapat a) ganti dengan adan aabukannya 10dan 100, b) gunakan a+bukan 100?di regex dan c) abukan 0untuk substr_count(-4).
Titus
@Titus jalan Anda dengan tidak dapat bekerja di kisaran 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;}

Tidak digabungkan & kode uji:

Coba di sini.

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("九百九十九"));
  }
}

Keluaran:

1
2
3
4
5
6
7
8
9
10
11
24
83
90
100
231
803
999
Kevin Cruijssen
sumber
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)));}

Hitungan byte salah sebelumnya karena penyandian diabaikan ...

Pengkodean Big5

Solusi rekursif yang mengisi input jika 10-19 untuk pemrosesan yang lebih mudah, kemudian memproses dari kiri 2 karakter sekaligus.

Tidak disatukan

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
}
Tautan Ng
sumber
0

Python 3, 128 byte

Menyimpan 2 + 3 byte berkat peristiwa dan 2 untuk mengganti (d>9)+(d>10)denganmax(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)

Tidak Disatukan:

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)

Jawaban awal

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)

nakan menjadi angka terakhir dan amerupakan angka sebelumnya.

Karl Napf
sumber
Spek telah berubah.
Kade
@ Shebang Untungnya tidak masalah, 803 masih berfungsi.
Karl Napf
1
@TimmyD Itu diabaikan. findmengembalikan -1 dan itu lebih kecil dari 9itu ndan a tidak tersentuh.
Karl Napf
1
[1,a][a>0]*10 -> 10*a**(a>0)menghemat dua byte :)
Kade
1
[0,d][d<=9] -> d*(d<10)menghemat tiga byte juga!
Kade