Konvertera kinesiska siffror
On februari 10, 2021 by adminPå kinesiska skrivs siffror enligt följande:
1 一
2 二
3 三
4 四
5 五
6 六
7 七
8 八
9 九
10 十
För siffror över 10 uttrycks det som antalet tiotals och antalet ett. Om det bara finns en tio, behöver du inte uttryckligen säga en, och om det inte finns några behöver du inte lägga något efter:
11 十一
24 二十四
83 八十三
90 九十
För siffror över 100 använder du samma logik, men med tecknet 百
. Den här gången, om det bara finns hundra, behöver du fortfarande skriva ut det och om det inte finns några tiotal måste du säga 零
.
100 一百
231 二百三十一
803 八百零三
999 九百九十九
Din uppgift är att konvertera dessa kinesiska siffror till arabiska siffror. ett tal N på kinesiska (一
(1) < = N < = 九百九十九
(999)), konvertera det till ett arabiskt nummer.
Kom ihåg att det här är kod-golf , så koden med det minsta antalet byte vinner.
Kommentarer
Svar
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
Siffror 一 – 九 konverteras till decimal och sparas i d
, medan 十 och 百 multiplicerar den sista siffran med 10 respektive 100 och ackumulerar den i n
. 零
ignoreras effektivt eftersom d
redan är noll när det påträffas.
Svar
Perl, 110 byte
98 byte kod + 12 för -plC -Mutf8
.
Perl hatar unicode. Förhoppningsvis har jag inte missat några kantfall, jag hade problem med siffror som 二百十
men jag har tagit upp det nu!
s/十/*10+/;s/百/*100+/;y/一二三四五六七八九零/123456789 /;s/^\*|\+\*/+/g;$_=eval"$_-0"
Användning
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
Svar
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;
Kommentarer
- Synd att
strtr
inte är multibytesäker. Det kan spara 23 byte. Men du kan använda0+
istället för00?
, spara en byte eller så kan du a) ersätta meda
ochaa
istället för10
och100
, b) använda+
istället för100?
i regex och c)a
istället för0
försubstr_count
(-4). - @Titus din väg med en kan inte fungera i intervallet 10-19
Svar
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;}
Ungolfed & testkod:
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("九百九十九")); } }
Utgång:
1 2 3 4 5 6 7 8 9 10 11 24 83 90 100 231 803 999
Svar
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)));}
Fel byteantal tidigare på grund av kodning ignorerad …
Big5-kodning
En rekursiv lösning som dynar ingången om den är 10-19 för enklare bearbetning, bearbeta sedan från vänster två tecken åt gången.
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 }
Svar
Python 3, 128 byte
Sparar 2 + 3 byte tack vare Shebang och 2 för att ersätta (d>9)+(d>10)
med 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)
Ursprungligt svar
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
blir det sista numret och a
är föregående siffra.
Kommentarer
- Specifikationen har ändrats.
- @Shebang Lyckligtvis spelar det ingen roll, 803 fungerar fortfarande.
- @TimmyD Det ignoreras.
find
returnerar -1 och det är mindre än9
sån
ocha
är orörda. -
[1,a][a>0]*10 -> 10*a**(a>0)
sparar två byte 🙂 -
[0,d][d<=9] -> d*(d<10)
sparar också tre byte!
503
och380
?503 -> 五百三
och380 -> 三百八十
. Du säger också i tiotal attyou do not need to explicitly say one
. Betyder det att det inte ’ spelar någon roll om vi gör det?五百零三
eftersom det inte finns några tiotal (tror jag)