Conversia numerelor chinezești
On februarie 10, 2021 by adminÎn chineză, numerele sunt scrise după cum urmează:
1 一
2 二
3 三
4 四
5 五
6 六
7 七
8 八
9 九
10 十
Pentru numerele peste 10, este exprimat ca numărul de zeci și numărul de unități. Dacă există doar un zece, nu trebuie să spuneți în mod explicit unul, iar dacă nu există, nu trebuie să puneți nimic după:
11 十一
24 二十四
83 八十三
90 九十
Pentru numerele peste 100, utilizați aceeași logică, dar cu caracterul 百
. De data aceasta, însă, dacă există doar o sută, trebuie totuși să o scrieți , iar dacă nu există zeci, trebuie să spuneți 零
.
100 一百
231 二百三十一
803 八百零三
999 九百九十九
Sarcina dvs. este să convertiți aceste cifre chinezești în cifre arabe. un număr N în chineză (一
(1) < = N < = 九百九十九
(999)), convertiți-l într-un număr arab.
Amintiți-vă, acesta este code-golf , deci codul cu cel mai mic număr de octeți câștigători.
Comentarii
Răspuns
JavaScript (ES6), 112 octeți
s=>[...s].map(c=>d=(i="零一二三四五六七八九十百".search(c))>9?(n+=(d||1)*(i*90-890),0):i,n=d=0)&&n+d
Cifrele 一 – 九 sunt convertite la zecimal și salvat în d
, în timp ce 十 și 百 multiplică ultima cifră cu 10 sau respectiv 100 și o acumulează în n
. 零
este efectiv ignorat, deoarece d
este deja zero atunci când este întâlnit.
Răspuns
Perl, 110 bytes
98 bytes code + 12 for -plC -Mutf8
.
Perl urăște unicode. Sperăm că nu am ratat niciun caz de margine, am avut o problemă cu numere precum 二百十
, dar „am abordat asta acum!
s/十/*10+/;s/百/*100+/;y/一二三四五六七八九零/123456789 /;s/^\*|\+\*/+/g;$_=eval"$_-0"
Utilizare
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
Răspuns
PHP, 225 octeți
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;
Comentarii
- Păcat că
strtr
nu este sigur multibyte. Vă poate economisi 23 de octeți. Dar puteți utiliza0+
în loc de00?
, salvând un octet sau puteți a) înlocui cua
șiaa
în loc de10
și100
, b) utilizația+
în loc de100?
în regex și c)a
în loc de0
pentrusubstr_count
(-4). - @Titus calea ta cu un nu poate funcționa în intervalul 10-19
Răspuns
Java 7, 236 233 229 octeți
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 & cod test:
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("九百九十九")); } }
Ieșire:
1 2 3 4 5 6 7 8 9 10 11 24 83 90 100 231 803 999
Răspuns
C #, 197 210 octeți
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)));}
Număr greșit de octeți anterior datorită codificării ignorate …
Codare Big5
O soluție recursivă care tamponează intrarea dacă este 10-19 pentru o procesare mai ușoară, apoi procesează din stânga 2 caractere odată.
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 }
Răspuns
Python 3, 128 octeți
Salvarea a 2 + 3 octeți datorită lui Shebang și 2 pentru înlocuirea (d>9)+(d>10)
cu 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)
Răspuns inițial
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
va fi numărul final și a
este cifra anterioară.
Comentarii
- Specificația s-a schimbat.
- @Shebang Din fericire nu contează, 803 funcționează în continuare.
- @TimmyD It este ignorat.
find
returnează -1 și este mai mic decât9
decin
șia
sunt neatinse. -
[1,a][a>0]*10 -> 10*a**(a>0)
salvează doi octeți 🙂 -
[0,d][d<=9] -> d*(d<10)
salvează și trei octeți!
503
și380
?503 -> 五百三
și380 -> 三百八十
. De asemenea, spuneți pentru zeci căyou do not need to explicitly say one
. Asta înseamnă că nu contează ‘ dacă contează?五百零三
deoarece nu există zeci (cred)