Chinesische Zahlen konvertieren
On Februar 10, 2021 by adminAuf 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 nach setzen:
11 十一
24 二十四
83 八十三
90 九十
Für Zahlen über 100 verwenden Sie dieselbe Logik, jedoch mit dem Zeichen 百
. Dieses Mal müssen Sie es jedoch noch ausschreiben, wenn es nur einhundert gibt Wenn keine Zehner vorhanden sind, müssen Sie 零
sagen.
100 一百
231 二百三十一
803 八百零三
999 九百九十九
Ihre Aufgabe ist es, diese chinesischen Ziffern in arabische Ziffern umzuwandeln eine Zahl N auf Chinesisch (一
(1) < = N < = 九百九十九
(999)), konvertieren Sie es in eine arabische Zahl.
Denken Sie daran, dies ist Code-Golf , also der Code mit der kleinsten Anzahl von Bytes gewinnt.
Kommentare
- Können Sie Testfälle hinzufügen
503
und380
? - ^ Guter Punkt. Wenn ich richtig folge, sollte es
503 -> 五百三
und380 -> 三百八十
sein. Außerdem sagen Sie für zehn, dassyou do not need to explicitly say one
. Bedeutet das, dass es ‚ nicht wichtig ist, wenn wir dies tun? - Verwandte
- Bis zu 999? Sie sollten die Obergrenze angeben.
- 503 sollte
五百零三
sein, da es keine Zehner gibt (glaube ich)
Antwort
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
Ziffern 一 – 九 werden konvertiert zu dezimal und in d
gespeichert, während 十 und 百 die letzte Ziffer mit 10 bzw. 100 multiplizieren und in n
akkumulieren. 零
wird effektiv ignoriert, da d
bereits Null ist, wenn es auftritt.
Antwort
Perl, 110 Byte
98 Byte 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"
Verwendung
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
Antwort
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;
Kommentare
- Schade, dass
strtr
nicht multibyte-sicher ist. Es könnte Ihnen 23 Bytes sparen. Sie können jedoch0+
anstelle von00?
verwenden, um ein Byte zu sparen, oder Sie können a) durcha
undaa
anstelle von10
und100
, b) verwenden Siea+
anstelle von100?
im regulären Ausdruck und c)a
anstelle von0
fürsubstr_count
(-4). - @Titus Ihr Weg mit a kann nicht im Bereich von 10-19
Antwort
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:
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
Antwort
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 jeweils 2 Zeichen von links 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 }
Antwort
Python 3, 128 Bytes
Speichern von 2 + 3 Bytes dank Shebang und 2 durch Ersetzen von (d>9)+(d>10)
durch 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)
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)
n
ist die endgültige Nummer und a
ist die vorherige Ziffer.
Kommentare
- Die Spezifikation hat sich geändert.
- @Shebang Zum Glück spielt es keine Rolle, 803 funktioniert immer noch.
- @TimmyD It wird ignoriert.
find
gibt -1 zurück und das ist kleiner als9
, alson
unda
bleibt unberührt. -
[1,a][a>0]*10 -> 10*a**(a>0)
speichert zwei Bytes 🙂 -
[0,d][d<=9] -> d*(d<10)
spart auch drei Bytes!
Schreibe einen Kommentar