중국어 숫자 변환
On 2월 10, 2021 by admin중국어에서 숫자는 다음과 같이 작성됩니다.
1 一
2 二
3 三
4 四
5 五
6 六
7 七
8 八
9 九
10 十
10 이상의 숫자는 10과 1로 표시됩니다. 10 개만 있으면 1 개를 명시 적으로 말할 필요가 없으며 1 개가 없으면 뒤에 아무것도 넣을 필요가 없습니다.
11 十一
24 二十四
83 八十三
90 九十
100을 초과하는 숫자의 경우 동일한 논리를 사용하지만 百
문자를 사용합니다. 이번에는 100 개만 있으면 여전히 작성해야합니다. , 십이 없으면 零
라고 말해야합니다.
100 一百
231 二百三十一
803 八百零三
999 九百九十九
당신의 임무는이 중국어 숫자를 아라비아 숫자로 변환하는 것입니다. 중국어 숫자 N (一
(1) < = N < = 九百九十九
(999)), 아라비아 숫자로 변환하세요.
이 항목은
code-golf , 따라서 코드는 가장 적은 수의 바이트가 이깁니다.
코멘트
Answer
JavaScript (ES6), 112 바이트
s=>[...s].map(c=>d=(i="零一二三四五六七八九十百".search(c))>9?(n+=(d||1)*(i*90-890),0):i,n=d=0)&&n+d
숫자 一-九이 변환 됨 10 진수로 변환하고 d
에 저장하는 반면, 十 및 百는 마지막 숫자에 각각 10 또는 100을 곱하고 n
에 누적합니다. 零
는 d
가 발견되었을 때 이미 0이기 때문에 효과적으로 무시됩니다.
Answer
Perl, 110 바이트
98 바이트 코드 + .
Perl은 유니 코드를 싫어합니다. 잘 만하면 제가 엣지 케이스를 놓치지 않았 으면합니다. 二百十
와 같은 숫자에 문제가 있었지만 지금 해결했습니다!
s/十/*10+/;s/百/*100+/;y/一二三四五六七八九零/123456789 /;s/^\*|\+\*/+/g;$_=eval"$_-0"
사용
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
답변
PHP, 225 바이트
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;
댓글
-
strtr
가 멀티 바이트 안전하지 않다는 점이 안타깝습니다. 23 바이트를 절약 할 수 있습니다. 그러나00?
대신0+
를 사용하여 1 바이트를 절약하거나 a)a
<로 바꿀 수 있습니다.10
및100
대신 / div> 및aa
, b) iv id 사용 정규식에서100?
대신 = “c564e3d59d”>
및 c) iv id = “7e19df43e6″대신 a
>
for substr_count
(-4).
답변
Java 7, 236 233 229 바이트
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 & 테스트 코드 :
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("九百九十九")); } }
출력 :
1 2 3 4 5 6 7 8 9 10 11 24 83 90 100 231 803 999
답변
C #, 197 210 바이트
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)));}
인코딩 무시로 인해 이전에 잘못된 바이트 수가 …
Big5 인코딩
더 쉬운 처리를 위해 10 ~ 19 인 경우 입력을 채우고 한 번에 왼쪽 2 자부터 처리하는 재귀 솔루션입니다.
미 골프
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 }
답변
Python 3, 128 바이트
Shebang 덕분에 2 + 3 바이트 절약, (d>9)+(d>10)
를 max(d-9,0)
로 대체하여 2 바이트 절약
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)
초기 답변
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
는 마지막 숫자이고 a
는 이전 숫자입니다.
댓글
- 사양이 변경되었습니다.
- @Shebang 다행히도 803은 작동합니다.
- @TimmyD It 무시됩니다.
find
는 -1을 반환하고9
보다 작으므로n
및a
는 변경되지 않았습니다. -
[1,a][a>0]*10 -> 10*a**(a>0)
는 2 바이트를 절약합니다. 🙂 -
[0,d][d<=9] -> d*(d<10)
는 3 바이트도 절약합니다!
503
및380
?503 -> 五百三
및380 -> 三百八十
이어야합니다. 또한you do not need to explicitly say one
를 수십 단위로 말합니다. 그렇다면 ' 문제가되지 않습니까?五百零三
이어야합니다 (제 생각에)