Konvertieren Sie chinesische Zahlen

10

Auf Chinesisch werden Zahlen wie folgt geschrieben:

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

Bei Zahlen über 10 wird dies als Anzahl der Zehner und Anzahl der Einsen ausgedrückt. Wenn es nur eine Zehn gibt, müssen Sie nicht explizit eine sagen, und wenn es keine gibt, müssen Sie nichts danach setzen:

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

Für Zahlen über 100 verwenden Sie dieselbe Logik, jedoch mit dem Zeichen . Dieses Mal, wenn es nur einhundert gibt, müssen Sie es noch aufschreiben, und wenn es keine Zehner gibt, müssen Sie sagen .

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

Ihre Aufgabe ist es, diese chinesischen Ziffern in arabische Ziffern umzuwandeln. Wenn Sie eine Zahl N auf Chinesisch ( (1) <= N <= 九百九十九(999)) angeben, konvertieren Sie diese in eine arabische Zahl.

Denken Sie daran, dies ist , also gewinnt der Code mit der geringsten Anzahl von Bytes.

Oliver Ni
quelle
3
Können Sie Testfälle hinzufügen 503und 380?
Martin Ender
1
^ Guter Punkt. Wenn ich richtig folge, sollte es 503 -> 五百三und sein 380 -> 三百八十. Außerdem sagst du das für zehn you do not need to explicitly say one. Bedeutet das, dass es keine Rolle spielt, ob wir es tun?
Kade
Verwandte
NoOneIsHere
Bis zu 999? Sie sollten die Obergrenze geben
edc65
503 sollte sein, 五百零三da es keine Zehner gibt (glaube ich)
edc65

Antworten:

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

Die Ziffern 一 - 九 werden in Dezimalzahlen umgewandelt und in gespeichert d, während 十 und 百 die letzte Ziffer mit 10 bzw. 100 multiplizieren und in akkumulieren n. wird effektiv ignoriert, da des bereits Null ist, wenn es angetroffen wird.

Neil
quelle
2

Perl, 110 Bytes

98 Bytes Code + 12 für -plC -Mutf8.

Perl hasst Unicode. Hoffentlich habe ich keine Randfälle verpasst, ich hatte ein Problem mit Zahlen wie, 二百十aber das habe ich jetzt angesprochen!

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

Verwendungszweck

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
quelle
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
quelle
Schade, dass strtrdas nicht multibyte-sicher ist. Sie könnten 23 Bytes sparen. Aber Sie können verwenden 0+statt 00?, speichern ein Byte oder Sie können a) ersetzen aund aastatt 10und 100, b) Verwendung a+statt 100?in der Regex und c) astatt 0für substr_count(-4).
Titus
@Titus Ihr Weg mit einem kann nicht im Bereich 10-19 arbeiten
Jörg Hülsermann
2

Java 7, 236 233 229 Bytes

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 & Testcode:

Probieren Sie es hier aus.

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

Ausgabe:

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

C #, 197 210 Bytes

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

Falsche Byteanzahl zuvor aufgrund ignorierter Codierung ...

Big5-Codierung

Eine rekursive Lösung, die die Eingabe auffüllt, wenn sie zur einfacheren Verarbeitung zwischen 10 und 19 liegt, und dann von links 2 Zeichen gleichzeitig verarbeitet.

Ungolfed

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
}
Link Ng
quelle
0

Python 3, 128 Bytes

Speichern von 2 + 3 Bytes dank Shebang und 2 für das Ersetzen (d>9)+(d>10)durchmax(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)

Ungolfed:

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)

Erste Antwort

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)

nwird die endgültige Nummer sein und aist die vorherige Ziffer.

Karl Napf
quelle
Die Spezifikation hat sich geändert.
Kade
@Shebang Zum Glück spielt es keine Rolle, 803 funktioniert immer noch.
Karl Napf
1
@TimmyD Es wird ignoriert. findgibt -1 zurück und das ist kleiner als 9das nund bleibt a unberührt.
Karl Napf
1
[1,a][a>0]*10 -> 10*a**(a>0)spart zwei Bytes :)
Kade
1
[0,d][d<=9] -> d*(d<10)spart auch drei Bytes!
Kade