Konverter kinesiske tal
On februar 10, 2021 by adminPå kinesisk skrives tal som følger:
1 一
2 二
3 三
4 四
5 五
6 六
7 七
8 八
9 九
10 十
For tal over 10 udtrykkes det som antallet af tiere og antallet af dem. Hvis der kun er en ti, behøver du ikke udtrykkeligt sige en, og hvis der ikke er nogen, behøver du ikke lægge noget efter:
11 十一
24 二十四
83 八十三
90 九十
For tal over 100 bruger du den samme logik, men med tegnet 百
. Denne gang, hvis der kun er hundrede, skal du stadig skrive det ud , og hvis der ikke er tiere, skal du sige 零
.
100 一百
231 二百三十一
803 八百零三
999 九百九十九
Din opgave er at konvertere disse kinesiske tal til arabiske tal. et tal N på kinesisk (一
(1) < = N < = 九百九十九
(999)), konverter det til et arabisk nummer.
Husk, dette er code-golf , så koden med det mindste antal bytes vinder.
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
Cifre 一 – 九 konverteres til decimal og gemt i d
, mens 十 og 百 gang det sidste ciffer med henholdsvis 10 eller 100 og akkumulerer det i n
. 零
ignoreres effektivt, da d
allerede er nul, når det opstår.
Svar
Perl, 110 byte
98 bytes kode + 12 for -plC -Mutf8
.
Perl hader unicode. Forhåbentlig har jeg ikke savnet nogen kanttilfælde, jeg havde et problem med tal som 二百十
men jeg har taget fat på det nu!
s/十/*10+/;s/百/*100+/;y/一二三四五六七八九零/123456789 /;s/^\*|\+\*/+/g;$_=eval"$_-0"
Brug
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
- Alt for dårlig, at
strtr
ikke er multibytesikker. Det kan spare dig for 23 byte. Men du kan bruge0+
i stedet for00?
og gemme en byte, eller du kan a) erstatte meda
ogaa
i stedet for10
og100
, b) bruga+
i stedet for100?
i regex og c)a
i stedet for0
forsubstr_count
(-4). - @Titus din måde med en kan ikke fungere i området 10-19
Svar
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 & testkode:
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("九百九十九")); } }
Output:
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)));}
Forkert byteantal tidligere på grund af kodning ignoreret …
Big5-kodning
En rekursiv løsning, der padser input, hvis det er 10-19 for lettere behandling, og behandl derefter fra venstre 2 tegn ad gangen.
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
Gemme 2 + 3 byte takket være Shebang og 2 for at erstatte (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)
Indledende 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
vil være det sidste tal, og a
er det forrige ciffer.
Kommentarer
- Specifikationen er ændret.
- @Shebang Heldigvis betyder det ikke noget, 803 fungerer stadig.
- @TimmyD Det ignoreres.
find
returnerer -1 og det er mindre end9
sån
oga
er uberørt. -
[1,a][a>0]*10 -> 10*a**(a>0)
gemmer to byte 🙂 -
[0,d][d<=9] -> d*(d<10)
gemmer også tre byte!
503
og380
?503 -> 五百三
og380 -> 三百八十
. Du siger også i tiere, atyou do not need to explicitly say one
. Betyder det, at det ikke betyder ‘, hvis vi gør det?五百零三
da der ikke er nogen tiere (tror jeg)