中国の数字を変換する


10

中国語では、数字は次のように表記されます。

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

10より大きい数値の場合は、10の数と1の数で表されます。10が1つしかない場合は、明示的に1つと言う必要はありません。10がない場合は、後に何も置く必要はありません。

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

100より大きい数値の場合、同じロジックを使用しますが、文字を使用します百。ただし、今回は、100しかない場合でも書き出す必要があり、10がない場合はと言う必要があります零。

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

あなたの仕事は、これらの中国の数字をアラビア数字に変換することです。中国語の数値N(一(1)<= N <= 九百九十九(999))を指定して、アラビア数字に変換します。

これはなので、バイト数が最も少ないコードが優先されます。


3
あなたは、テストケースを追加することができます503し、380?
— マーティンエンダー

1
^良い点。私が正しくフォローしている場合、それは503 -> 五百三およびである必要があり380 -> 三百八十ます。また、あなたはそれを数十の間言うyou do not need to explicitly say one。それは私たちがそうするかどうかは問題ではないという意味ですか?
— Kade


999まで?あなたは上限を与えるべきでした
— edc65

503は五百零三10はないので(私は思う)
— edc65

回答:


3

JavaScript(ES6)、112バイト

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

数字の1〜9は10進数に変換されてに保存されますd。一方、十と百は、最後の数字にそれぞれ10または100を掛けて、に累積しnます。零はd発生時にすでに0 であるため、事実上無視されます。


2

Perl、110バイト

98バイトのコード+の12 -plC -Mutf8。

Perlはユニコードを嫌います。うまくいけば、エッジケースを見逃したことはありません。次のような数値に問題二百十がありましたが、今は対処しました!

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

使用法

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バイト

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;

strtrマルチバイトセーフではないことは残念です。23バイト節約できます。しかし、あなたは使用することができる0+代わりに00?、1つのバイトを保存したり、あなたが)で置き換えることができますaし、aa代わりに10と100、b)の使用a+の代わりに、100?正規表現およびc)において、a代わりの0ためのsubstr_count(-4)。
— タイタス

10-19の範囲内のことはできない仕事とあなたの方法@Titus
— イェルクHülsermann

2

Java 7、236 233 229バイト

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

Ungolfed&test code:

ここで試してください。

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

出力:

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

0

C#、197210バイト

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

エンコードが無視されたため、以前は間違ったバイト数...

Big5エンコーディング

処理を容易にするために入力が10〜19の場合に入力にパディングし、一度に左から2文字処理する再帰的ソリューション。

未ゴルフ

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バイト

交換する2つの+ 3バイトシェバングおかげ及び2省(d>9)+(d>10)とをmax(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)

未ゴルフ:

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)

最初の答え

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)

n最後の数字になりa、前の桁になります。


仕様が変更されました。
— Kade

@Shebang幸いなことにそれは重要ではありません、803はまだ機能します。
— Karl Napf 2016年

1
@TimmyD無視されます。find-1を返し、それよりも小さい9ので、nそしてa 変更されません。
— Karl Napf 2016年

1
[1,a][a>0]*10 -> 10*a**(a>0)2バイトを節約:)
— Kade

1
[0,d][d<=9] -> d*(d<10)3バイトも節約できます!
— Kade
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.